mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-27 07:01:09 +00:00
301 lines
18 KiB
Markdown
301 lines
18 KiB
Markdown
# 161,162,10161,10162/udp - Pentesting SNMP
|
||
|
||
{% hint style="success" %}
|
||
Learn & practice AWS Hacking:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||
Learn & practice GCP Hacking: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||
|
||
<details>
|
||
|
||
<summary>Support HackTricks</summary>
|
||
|
||
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
||
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||
|
||
</details>
|
||
{% endhint %}
|
||
|
||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||
|
||
If you are interested in **hacking career** and hack the unhackable - **we are hiring!** (_fluent polish written and spoken required_).
|
||
|
||
{% embed url="https://www.stmcyber.com/careers" %}
|
||
|
||
## Basic Information
|
||
|
||
**SNMP - 간단한 네트워크 관리 프로토콜**은 네트워크의 다양한 장치(예: 라우터, 스위치, 프린터, IoT 등)를 모니터링하는 데 사용되는 프로토콜입니다.
|
||
```
|
||
PORT STATE SERVICE REASON VERSION
|
||
161/udp open snmp udp-response ttl 244 ciscoSystems SNMPv3 server (public)
|
||
```
|
||
{% hint style="info" %}
|
||
SNMP는 **traps**를 위해 포트 **162/UDP**도 사용합니다. 이는 **명시적으로 요청되지 않은 SNMP 서버에서 클라이언트로 전송되는 데이터 패킷**입니다.
|
||
{% endhint %}
|
||
|
||
### MIB
|
||
|
||
SNMP 접근이 제조업체 간 및 다양한 클라이언트-서버 조합에서 작동하도록 보장하기 위해 **Management Information Base (MIB)**가 생성되었습니다. MIB는 **장치 정보를 저장하기 위한 독립적인 형식**입니다. MIB는 **표준화된** 트리 계층 구조에서 모든 쿼리 가능한 **SNMP 객체**가 나열된 **텍스트** 파일입니다. 여기에는 **고유 주소**와 **이름** 외에도 해당 객체의 유형, 접근 권한 및 설명에 대한 정보도 제공하는 **최소 하나의 `Object Identifier` (`OID`)**가 포함되어 있습니다.\
|
||
MIB 파일은 `Abstract Syntax Notation One` (`ASN.1`) 기반 ASCII 텍스트 형식으로 작성됩니다. **MIB는 데이터를 포함하지 않지만**, **어떤 정보를 어디서 찾을 수 있는지**와 그것이 어떤 모습인지, 특정 OID에 대한 반환 값 또는 사용되는 데이터 유형을 설명합니다.
|
||
|
||
### OIDs
|
||
|
||
**Object Identifiers (OIDs)**는 중요한 역할을 합니다. 이러한 고유 식별자는 **Management Information Base (MIB)** 내에서 객체를 관리하기 위해 설계되었습니다.
|
||
|
||
MIB 객체 ID 또는 OID의 가장 높은 수준은 다양한 표준 설정 조직에 할당됩니다. 이러한 최상위 수준 내에서 글로벌 관리 관행 및 표준을 위한 프레임워크가 설정됩니다.
|
||
|
||
또한, 공급업체는 개인 브랜치를 설정할 수 있는 자유를 부여받습니다. 이러한 브랜치 내에서 그들은 **자신의 제품 라인과 관련된 관리 객체를 포함할 수 있는 자율성을 가집니다**. 이 시스템은 다양한 공급업체와 표준 간에 광범위한 객체를 식별하고 관리하기 위한 구조적이고 조직적인 방법을 보장합니다.
|
||
|
||
![](<../../.gitbook/assets/SNMP\_OID\_MIB\_Tree (1).png>)
|
||
|
||
여기에서 **OID 트리**를 **탐색**할 수 있습니다: [http://www.oid-info.com/cgi-bin/display?tree=#focus](http://www.oid-info.com/cgi-bin/display?tree=#focus) 또는 **OID의 의미를 확인**할 수 있습니다 (예: `1.3.6.1.2.1.1`) [http://oid-info.com/get/1.3.6.1.2.1.1](http://oid-info.com/get/1.3.6.1.2.1.1)에서 접근하여 확인하세요.\
|
||
[1.3.6.1.2.1](http://oid-info.com/get/1.3.6.1.2.1) 내부의 **잘 알려진 OIDs**가 있으며, 이는 MIB-2에서 정의된 Simple Network Management Protocol (SNMP) 변수를 참조합니다. 그리고 이로부터 **대기 중인 OIDs**를 통해 흥미로운 호스트 데이터(시스템 데이터, 네트워크 데이터, 프로세스 데이터 등)를 얻을 수 있습니다.
|
||
|
||
### **OID 예시**
|
||
|
||
[**여기에서 예시**](https://www.netadmintools.com/snmp-mib-and-oids/)를 확인하세요:
|
||
|
||
**`1 . 3 . 6 . 1 . 4 . 1 . 1452 . 1 . 2 . 5 . 1 . 3. 21 . 1 . 4 . 7`**
|
||
|
||
이 주소의 세부 사항은 다음과 같습니다.
|
||
|
||
* 1 – 이것은 ISO라고 하며, 이것이 OID임을 나타냅니다. 그래서 모든 OID는 "1"로 시작합니다.
|
||
* 3 – 이것은 ORG라고 하며, 장치를 만든 조직을 지정하는 데 사용됩니다.
|
||
* 6 – 이것은 dod 또는 국방부로, 인터넷을 처음으로 설립한 조직입니다.
|
||
* 1 – 이것은 인터넷의 값을 나타내며, 모든 통신이 인터넷을 통해 이루어질 것임을 나타냅니다.
|
||
* 4 – 이 값은 이 장치가 정부가 아닌 민간 조직에 의해 만들어졌음을 나타냅니다.
|
||
* 1 – 이 값은 장치가 기업 또는 비즈니스 엔티티에 의해 만들어졌음을 나타냅니다.
|
||
|
||
이 첫 여섯 값은 모든 장치에 대해 동일하며, 기본 정보를 제공합니다. 이 숫자 시퀀스는 모든 OID에 대해 동일하지만, 장치가 정부에 의해 만들어진 경우는 제외됩니다.
|
||
|
||
다음 숫자 세트로 넘어갑니다.
|
||
|
||
* 1452 – 이 장치를 제조한 조직의 이름을 제공합니다.
|
||
* 1 – 장치의 유형을 설명합니다. 이 경우, 알람 시계입니다.
|
||
* 2 – 이 장치가 원격 터미널 장치임을 나타냅니다.
|
||
|
||
나머지 값들은 장치에 대한 구체적인 정보를 제공합니다.
|
||
|
||
* 5 – 개별 알람 포인트를 나타냅니다.
|
||
* 1 – 장치 내의 특정 포인트
|
||
* 3 – 포트
|
||
* 21 – 포트의 주소
|
||
* 1 – 포트의 디스플레이
|
||
* 4 – 포인트 번호
|
||
* 7 – 포인트의 상태
|
||
|
||
### SNMP 버전
|
||
|
||
SNMP에는 2개의 중요한 버전이 있습니다:
|
||
|
||
* **SNMPv1**: 주요 버전으로, 여전히 가장 빈번하게 사용되며, **인증은 문자열**(커뮤니티 문자열)에 기반하고 **일반 텍스트**로 전송됩니다(모든 정보가 일반 텍스트로 전송됨). **버전 2 및 2c**도 **일반 텍스트로 트래픽을 전송**하며 **커뮤니티 문자열을 인증**으로 사용합니다.
|
||
* **SNMPv3**: 더 나은 **인증** 형태를 사용하며, 정보는 **암호화**되어 전송됩니다( **사전 공격**이 수행될 수 있지만, SNMPv1 및 v2보다 올바른 자격 증명을 찾기가 훨씬 더 어려워집니다).
|
||
|
||
### 커뮤니티 문자열
|
||
|
||
앞서 언급했듯이, **MIB에 저장된 정보에 접근하려면 버전 1 및 2/2c에서는 커뮤니티 문자열을 알아야 하고, 버전 3에서는 자격 증명을 알아야 합니다.**\
|
||
**커뮤니티 문자열**에는 **2가지 유형**이 있습니다:
|
||
|
||
* **`public`** 주로 **읽기 전용** 기능
|
||
* **`private`** **읽기/쓰기** 일반적으로
|
||
|
||
**OID의 쓰기 가능성은 사용된 커뮤니티 문자열에 따라 다르므로**, **"public"**이 사용되고 있더라도 **일부 값을 쓸 수 있을 수 있습니다.** 또한, **항상 "읽기 전용"인 객체가 존재할 수 있습니다.**\
|
||
객체를 **쓰기** 시도하면 **`noSuchName` 또는 `readOnly` 오류**가 발생합니다\*\*.\*\*
|
||
|
||
버전 1 및 2/2c에서는 **잘못된** 커뮤니티 문자열을 사용하면 서버가 **응답하지 않습니다**. 따라서 응답이 있다면, **유효한 커뮤니티 문자열이 사용된 것입니다**.
|
||
|
||
## 포트
|
||
|
||
[위키백과에서](https://en.wikipedia.org/wiki/Simple\_Network\_Management\_Protocol):
|
||
|
||
* SNMP 에이전트는 UDP 포트 **161**에서 요청을 수신합니다.
|
||
* 관리자는 포트 **162**에서 알림([Traps](https://en.wikipedia.org/wiki/Simple\_Network\_Management\_Protocol#Trap) 및 [InformRequests](https://en.wikipedia.org/wiki/Simple\_Network\_Management\_Protocol#InformRequest))을 수신합니다.
|
||
* [Transport Layer Security](https://en.wikipedia.org/wiki/Transport\_Layer\_Security) 또는 [Datagram Transport Layer Security](https://en.wikipedia.org/wiki/Datagram\_Transport\_Layer\_Security)와 함께 사용될 때, 요청은 포트 **10161**에서 수신되고 알림은 포트 **10162**로 전송됩니다.
|
||
|
||
## 커뮤니티 문자열 무차별 대입 (v1 및 v2c)
|
||
|
||
**커뮤니티 문자열을 추측하기 위해** 사전 공격을 수행할 수 있습니다. SNMP에 대한 무차별 대입 공격을 수행하는 다양한 방법은 [여기에서 확인하세요](../../generic-methodologies-and-resources/brute-force.md#snmp). 자주 사용되는 커뮤니티 문자열은 `public`입니다.
|
||
|
||
## SNMP 열거
|
||
|
||
장치에서 수집된 **각 OID의 의미**를 확인하기 위해 다음을 설치하는 것이 권장됩니다:
|
||
```bash
|
||
apt-get install snmp-mibs-downloader
|
||
download-mibs
|
||
# Finally comment the line saying "mibs :" in /etc/snmp/snmp.conf
|
||
sudo vi /etc/snmp/snmp.conf
|
||
```
|
||
유효한 커뮤니티 문자열을 알고 있다면, **SNMPWalk** 또는 **SNMP-Check**를 사용하여 데이터를 액세스할 수 있습니다:
|
||
```bash
|
||
snmpbulkwalk -c [COMM_STRING] -v [VERSION] [IP] . #Don't forget the final dot
|
||
snmpbulkwalk -c public -v2c 10.10.11.136 .
|
||
|
||
snmpwalk -v [VERSION_SNMP] -c [COMM_STRING] [DIR_IP]
|
||
snmpwalk -v [VERSION_SNMP] -c [COMM_STRING] [DIR_IP] 1.3.6.1.2.1.4.34.1.3 #Get IPv6, needed dec2hex
|
||
snmpwalk -v [VERSION_SNMP] -c [COMM_STRING] [DIR_IP] NET-SNMP-EXTEND-MIB::nsExtendObjects #get extended
|
||
snmpwalk -v [VERSION_SNMP] -c [COMM_STRING] [DIR_IP] .1 #Enum all
|
||
|
||
snmp-check [DIR_IP] -p [PORT] -c [COMM_STRING]
|
||
|
||
nmap --script "snmp* and not snmp-brute" <target>
|
||
|
||
braa <community string>@<IP>:.1.3.6.* #Bruteforce specific OID
|
||
```
|
||
확장 쿼리(download-mibs) 덕분에 다음 명령어로 시스템에 대한 더 많은 정보를 열거할 수 있습니다:
|
||
```bash
|
||
snmpwalk -v X -c public <IP> NET-SNMP-EXTEND-MIB::nsExtendOutputFull
|
||
```
|
||
**SNMP**는 호스트에 대한 많은 정보를 가지고 있으며, 흥미로운 것들은 다음과 같습니다: **네트워크 인터페이스** (IPv4 및 **IPv6** 주소), 사용자 이름, 가동 시간, 서버/OS 버전, 및 **프로세스**
|
||
|
||
**실행 중** (비밀번호를 포함할 수 있음)....
|
||
|
||
### **위험한 설정**
|
||
|
||
네트워크 관리 영역에서 특정 구성 및 매개변수는 포괄적인 모니터링 및 제어를 보장하는 데 핵심적입니다.
|
||
|
||
### 접근 설정
|
||
|
||
**전체 OID 트리**에 대한 접근을 가능하게 하는 두 가지 주요 설정이 있습니다. 이는 네트워크 관리에서 중요한 구성 요소입니다:
|
||
|
||
1. **`rwuser noauth`**는 인증 없이 OID 트리에 대한 전체 접근을 허용하도록 설정됩니다. 이 설정은 간단하며 제한 없는 접근을 허용합니다.
|
||
2. 보다 구체적인 제어를 위해 접근을 부여할 수 있습니다:
|
||
* **`rwcommunity`**는 **IPv4** 주소에 대해, 및
|
||
* **`rwcommunity6`**는 **IPv6** 주소에 대해 사용됩니다.
|
||
|
||
두 명령 모두 **커뮤니티 문자열**과 관련 IP 주소를 요구하며, 요청의 출처에 관계없이 전체 접근을 제공합니다.
|
||
|
||
### Microsoft Windows용 SNMP 매개변수
|
||
|
||
일련의 **관리 정보 베이스 (MIB) 값**이 SNMP를 통해 Windows 시스템의 다양한 측면을 모니터링하는 데 사용됩니다:
|
||
|
||
* **시스템 프로세스**: `1.3.6.1.2.1.25.1.6.0`를 통해 접근되며, 이 매개변수는 시스템 내의 활성 프로세스를 모니터링할 수 있게 합니다.
|
||
* **실행 중인 프로그램**: `1.3.6.1.2.1.25.4.2.1.2` 값은 현재 실행 중인 프로그램을 추적하는 데 지정됩니다.
|
||
* **프로세스 경로**: 프로세스가 어디에서 실행되고 있는지를 확인하기 위해 `1.3.6.1.2.1.25.4.2.1.4` MIB 값을 사용합니다.
|
||
* **저장 장치**: 저장 장치의 모니터링은 `1.3.6.1.2.1.25.2.3.1.4`에 의해 용이해집니다.
|
||
* **소프트웨어 이름**: 시스템에 설치된 소프트웨어를 식별하기 위해 `1.3.6.1.2.1.25.6.3.1.2`가 사용됩니다.
|
||
* **사용자 계정**: `1.3.6.1.4.1.77.1.2.25` 값은 사용자 계정을 추적할 수 있게 합니다.
|
||
* **TCP 로컬 포트**: 마지막으로, `1.3.6.1.2.1.6.13.1.3`는 TCP 로컬 포트를 모니터링하는 데 지정되어 있으며, 활성 네트워크 연결에 대한 통찰력을 제공합니다.
|
||
|
||
### Cisco
|
||
|
||
Cisco 장비가 있는 경우 이 페이지를 확인하세요:
|
||
|
||
{% content-ref url="cisco-snmp.md" %}
|
||
[cisco-snmp.md](cisco-snmp.md)
|
||
{% endcontent-ref %}
|
||
|
||
## SNMP에서 RCE로
|
||
|
||
SNMP 서비스 내에서 **값을 쓰는** 것을 허용하는 **문자열**이 있다면, 이를 악용하여 **명령을 실행**할 수 있습니다:
|
||
|
||
{% content-ref url="snmp-rce.md" %}
|
||
[snmp-rce.md](snmp-rce.md)
|
||
{% endcontent-ref %}
|
||
|
||
## **대량 SNMP**
|
||
|
||
[Braa ](https://github.com/mteg/braa)는 대량 SNMP 스캐너입니다. 이러한 도구의 의도된 사용은 물론 SNMP 쿼리를 만드는 것이지만, net-snmp의 snmpwalk와는 달리 수십 또는 수백 개의 호스트를 동시에, 단일 프로세스에서 쿼리할 수 있습니다. 따라서 시스템 리소스를 매우 적게 소모하며 스캔을 매우 빠르게 수행합니다.
|
||
|
||
Braa는 자체 SNMP 스택을 구현하므로 net-snmp와 같은 SNMP 라이브러리가 필요하지 않습니다.
|
||
|
||
**구문:** braa \[커뮤니티 문자열]@\ [SNMP 서버의 IP]:\[iso id]
|
||
```bash
|
||
braa ignite123@192.168.1.125:.1.3.6.*
|
||
```
|
||
이것은 수동으로 처리할 수 없는 많은 MB의 정보를 추출할 수 있습니다.
|
||
|
||
그래서, 가장 흥미로운 정보를 찾아봅시다 (from [https://blog.rapid7.com/2016/05/05/snmp-data-harvesting-during-penetration-testing/](https://blog.rapid7.com/2016/05/05/snmp-data-harvesting-during-penetration-testing/)):
|
||
|
||
### **장치**
|
||
|
||
이 과정은 각 파일에서 **sysDesc MIB 데이터** (1.3.6.1.2.1.1.1.0)를 추출하여 장치를 식별하는 것으로 시작됩니다. 이는 **grep 명령어**를 사용하여 수행됩니다:
|
||
```bash
|
||
grep ".1.3.6.1.2.1.1.1.0" *.snmp
|
||
```
|
||
### **비공식 문자열 식별**
|
||
|
||
중요한 단계는 조직에서 사용하는 **비공식 커뮤니티 문자열**을 식별하는 것입니다. 특히 Cisco IOS 라우터에서 이 문자열은 라우터의 **실행 구성**을 추출하는 데 사용됩니다. 식별은 종종 **grep 명령**을 사용하여 "trap"이라는 단어에 대한 SNMP Trap 데이터를 분석하는 데 의존합니다.
|
||
```bash
|
||
grep -i "trap" *.snmp
|
||
```
|
||
### **사용자 이름/비밀번호**
|
||
|
||
MIB 테이블에 저장된 로그는 **로그온 시도 실패**를 검사하며, 이 과정에서 사용자 이름으로 입력된 비밀번호가 우연히 포함될 수 있습니다. _fail_, _failed_, 또는 _login_과 같은 키워드를 검색하여 유용한 데이터를 찾습니다:
|
||
```bash
|
||
grep -i "login\|fail" *.snmp
|
||
```
|
||
### **이메일**
|
||
|
||
마지막으로, 데이터에서 **이메일 주소**를 추출하기 위해, 이메일 형식과 일치하는 패턴에 초점을 맞춘 정규 표현식을 사용한 **grep 명령**이 사용됩니다:
|
||
```bash
|
||
grep -E -o "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}\b" *.snmp
|
||
```
|
||
## SNMP 값 수정
|
||
|
||
_**NetScanTools**_를 사용하여 **값을 수정**할 수 있습니다. 그렇게 하려면 **비공식 문자열**을 알아야 합니다.
|
||
|
||
## 스푸핑
|
||
|
||
ACL이 SMNP 서비스에 쿼리할 수 있는 IP만 허용하는 경우, UDP 패킷 내에서 이 주소 중 하나를 스푸핑하고 트래픽을 스니핑할 수 있습니다.
|
||
|
||
## SNMP 구성 파일 검사
|
||
|
||
* snmp.conf
|
||
* snmpd.conf
|
||
* snmp-config.xml
|
||
|
||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||
|
||
**해킹 경력**에 관심이 있고 해킹할 수 없는 것을 해킹하고 싶다면 - **우리는 채용 중입니다!** (_유창한 폴란드어 구사 필수_).
|
||
|
||
{% embed url="https://www.stmcyber.com/careers" %}
|
||
|
||
## HackTricks 자동 명령
|
||
```
|
||
Protocol_Name: SNMP #Protocol Abbreviation if there is one.
|
||
Port_Number: 161 #Comma separated if there is more than one.
|
||
Protocol_Description: Simple Network Managment Protocol #Protocol Abbreviation Spelled out
|
||
|
||
Entry_1:
|
||
Name: Notes
|
||
Description: Notes for SNMP
|
||
Note: |
|
||
SNMP - Simple Network Management Protocol is a protocol used to monitor different devices in the network (like routers, switches, printers, IoTs...).
|
||
|
||
https://book.hacktricks.xyz/pentesting/pentesting-snmp
|
||
|
||
Entry_2:
|
||
Name: SNMP Check
|
||
Description: Enumerate SNMP
|
||
Command: snmp-check {IP}
|
||
|
||
Entry_3:
|
||
Name: OneSixtyOne
|
||
Description: Crack SNMP passwords
|
||
Command: onesixtyone -c /usr/share/seclists/Discovery/SNMP/common-snmp-community-strings-onesixtyone.txt {IP} -w 100
|
||
|
||
Entry_4:
|
||
Name: Nmap
|
||
Description: Nmap snmp (no brute)
|
||
Command: nmap --script "snmp* and not snmp-brute" {IP}
|
||
|
||
Entry_5:
|
||
Name: Hydra Brute Force
|
||
Description: Need Nothing
|
||
Command: hydra -P {Big_Passwordlist} -v {IP} snmp
|
||
|
||
|
||
```
|
||
{% hint style="success" %}
|
||
AWS 해킹 배우기 및 연습하기:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||
GCP 해킹 배우기 및 연습하기: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||
|
||
<details>
|
||
|
||
<summary>HackTricks 지원하기</summary>
|
||
|
||
* [**구독 계획**](https://github.com/sponsors/carlospolop) 확인하기!
|
||
* **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 참여하거나 **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
|
||
* **[**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃허브 리포지토리에 PR을 제출하여 해킹 팁을 공유하세요.**
|
||
|
||
</details>
|
||
{% endhint %}
|