SNMP(Simple Network Management Protocol)是网络设备中最普遍的协议之一:交换机、路由器、服务器、打印机、UPS、电力设备、安防摄像头……几乎全都默认支持。
但就是这样一个“基础设施协议”,却成为现实攻击中 最容易被忽视、也最容易被利用的入口。
特别是下面两个场景:
弱口令(public/private)
完全未授权(public 直接能读全局信息)
这两个漏洞的危害经常被低估,很多人以为 SNMP 只能“查看设备信息”,但实际上:
获取精准资产指纹(系统、厂商、型号、序列号)
获取运行时间、进程信息、网络接口信息
获取网络拓扑结构
获取路由表、ARP 表
获取 CPU、内存、磁盘
获取管理员联系方式、地理位置
甚至在某些设备中可 修改配置
SNMP 不是“无害的信息接口”,它是一个 严重影响攻击链前期侦察的入口。
SNMP v1/v2c 采用 明文社区字符串(Community String),相当于明文密码。
默认社区字符串:
| 设备类型 | 默认 Community |
|---|---|
| Cisco | public/private |
| H3C/华为 | public |
| Linux | public |
| Windows | public |
| 打印机 | public |
| UPS | public |
| 摄像头 | public |
在实战资产扫描中,约 30%–40% 的设备 SNMP 仍保留 public。
弱口令比想象中严重得多。
只要执行这样一条命令:
snmpwalk -v2c -c public <target>
可能会得到:
系统描述(sysDescr)
系统运行时间(sysUpTime)
系统联系人(sysContact)
系统名称(sysName)
系统位置(sysLocation)
等大量敏感信息。
例如:
SNMPv2-MIB::sysDescr.0 = STRING: Linux server01 5.4.0-139-generic
SNMPv2-MIB::sysLocation.0 = STRING: IDC-B1-Floor3
SNMPv2-MIB::sysContact.0 = STRING: [email protected]
SNMPv2-MIB::sysName.0 = STRING: core-router-01
这些看似无害的信息,在攻击链中价值极高:
精准判断设备位置(IDC/Floor/机柜号)
找到管理员邮箱和姓名
识别操作系统和版本
识别设备型号(可用于寻找对应漏洞)
SNMP 是 攻击者眼中的金矿。
攻击者通过 public 读到:
sysLocation: “IDC-F2-CORE”
如果看到 “CORE”“ROUTER”“Switch”,即可准确定位核心节点。
随后利用该路由器的 Web 弱口令,成功控制核心设备。
SNMP 暴露了完整 ARP Table、Routing Table
攻击者直接获取内部网络结构图,模拟扫描并横向渗透。
某些 UPS 支持 SNMP SET,攻击者直接通过 SNMP 修改配置 → 断电。
为了自动化检测弱口令和未授权,我开发了一个轻量级工具——SNMP安全测试工具。
核心逻辑采用系统自带的 snmpwalk,通过 Python 封装处理测试流程、解析输出、提取关键 OID。
工具核心功能:
自动检测 SNMP 是否开放
自动识别是否能读取信息
支持常见 Weak Community 字典
提取关键 OID(sysDescr/sysUpTime/sysName 等)
兼容 Windows/Linux/Mac
自动查找 snmpwalk 路径
下面是核心测试函数:
以下代码适合展示在博客中,完整实现可见你提供的源码,我提取了最核心的部分:
def find_snmpwalk_path() -> Optional[str]:
import shutil, os
if shutil.which("snmpwalk"):
return "snmpwalk"
local_paths = [
os.path.join(os.getcwd(), "snmpwalk.exe"),
os.path.join(os.getcwd(), "snmpwalk")
]
for path in local_paths:
if os.path.isfile(path):
return path
return None
key_oids = [
'iso.3.6.1.2.1.1.1.0', # sysDescr
'iso.3.6.1.2.1.1.3.0', # sysUpTime
'iso.3.6.1.2.1.1.5.0', # sysName
'iso.3.6.1.2.1.1.6.0', # sysLocation
]
def snmp_walk_test(target, port, community, snmpwalk_path="snmpwalk"):
cmd = [snmpwalk_path, "-v2c", "-c", community, target]
results = []
for oid in key_oids:
r = subprocess.run(cmd + [oid], capture_output=True, text=True)
valid_lines = extract_snmp_data(r.stdout)
if valid_lines:
results.extend(valid_lines)
if results:
return True, "SNMP 认证成功", results
else:
return False, "社区字符串错误或超时", []
def extract_snmp_data(text: str):
pattern = r'^[\w\.\-:]+(?:\.\d+)*\s*=\s*.+'
lines = []
for line in text.splitlines():
if re.match(pattern, line.strip()):
lines.append(line)
return lines

如果失败:

必须升级到 SNMP v3(支持加密 + 认证)
至少设置类似:
Company_SNMP_2025_RandomString
例如在 Cisco/H3C 中:
snmp-server community public RO 10.0.0.0 0.255.255.255
互联网扫描中 SNMP 暴露率极高,是攻击入口。
异常访问(重复 community 探测)应触发告警。
SNMP 的危害常被误解为低风险,但在攻击链中,它属于:
它能帮助攻击者:
快速识别网络关键资产
获取管理员信息
推断机房、部署位置
推断操作系统与版本
获取拓扑结构与路由
判断设备运行时间(弱点:长时间未重启)
它永远不应该被忽视。