被忽视的入口:SNMP 弱口令与未授权访问风险深度分析 (含自研 SNMP 安全检测工具核心实现)
SNMP协议广泛应用于网络设备,默认支持但常被忽视。弱口令和未授权访问导致严重信息泄露风险。攻击者可获取系统指纹、拓扑结构等关键信息。需升级到SNMP v3并加强配置以降低风险。 2025-12-2 03:32:47 Author: www.freebuf.com(查看原文) 阅读量:0 收藏

01. 前言:一个常被忽略但极危险的协议

SNMP(Simple Network Management Protocol)是网络设备中最普遍的协议之一:交换机、路由器、服务器、打印机、UPS、电力设备、安防摄像头……几乎全都默认支持。

但就是这样一个“基础设施协议”,却成为现实攻击中 最容易被忽视、也最容易被利用的入口

特别是下面两个场景:

  • 弱口令(public/private)

  • 完全未授权(public 直接能读全局信息)

这两个漏洞的危害经常被低估,很多人以为 SNMP 只能“查看设备信息”,但实际上:

SNMP 信息泄露能直接导致:

  • 获取精准资产指纹(系统、厂商、型号、序列号)

  • 获取运行时间、进程信息、网络接口信息

  • 获取网络拓扑结构

  • 获取路由表、ARP 表

  • 获取 CPU、内存、磁盘

  • 获取管理员联系方式、地理位置

  • 甚至在某些设备中可 修改配置

SNMP 不是“无害的信息接口”,它是一个 严重影响攻击链前期侦察的入口。


02. SNMP 弱口令为何如此普遍?

SNMP v1/v2c 采用 明文社区字符串(Community String),相当于明文密码。

默认社区字符串:

设备类型默认 Community
Ciscopublic/private
H3C/华为public
Linuxpublic
Windowspublic
打印机public
UPSpublic
摄像头public

在实战资产扫描中,约 30%–40% 的设备 SNMP 仍保留 public

弱口令比想象中严重得多。


03. 技术风险:SNMP 泄露什么信息?

只要执行这样一条命令:

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 是 攻击者眼中的金矿


04. 实战案例:真实攻击是这样利用 SNMP 的

案例 1:通过 SNMP 定位核心路由器 → 拿下网络

攻击者通过 public 读到:

  • sysLocation: “IDC-F2-CORE”

  • 如果看到 “CORE”“ROUTER”“Switch”,即可准确定位核心节点。

随后利用该路由器的 Web 弱口令,成功控制核心设备。

案例 2:某集团被泄露拓扑图

SNMP 暴露了完整 ARP Table、Routing Table
攻击者直接获取内部网络结构图,模拟扫描并横向渗透。

案例 3:UPS 设备 SNMP V1 未授权可被重启

某些 UPS 支持 SNMP SET,攻击者直接通过 SNMP 修改配置 → 断电。


05. 我开发了一个「SNMP 安全测试工具」

为了自动化检测弱口令和未授权,我开发了一个轻量级工具——SNMP安全测试工具
image.png

核心逻辑采用系统自带的 snmpwalk,通过 Python 封装处理测试流程、解析输出、提取关键 OID。

工具核心功能:

  • 自动检测 SNMP 是否开放

  • 自动识别是否能读取信息

  • 支持常见 Weak Community 字典

  • 提取关键 OID(sysDescr/sysUpTime/sysName 等)

  • 兼容 Windows/Linux/Mac

  • 自动查找 snmpwalk 路径

下面是核心测试函数:


06. 工具核心代码

以下代码适合展示在博客中,完整实现可见你提供的源码,我提取了最核心的部分:

① 查找 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

② SNMP关键OID列表(用于验证弱口令)

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
]

③ 执行 SNMP 测试

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

07. 工具实际运行效果

image.png

如果失败:

image.png


08. 如何修复 SNMP 弱口令与未授权风险?

1. 禁用 SNMP v1/v2c

必须升级到 SNMP v3(支持加密 + 认证)

2. 禁止使用 public/private

至少设置类似:

Company_SNMP_2025_RandomString

3. 限制来源白名单(ACL)

例如在 Cisco/H3C 中:

snmp-server community public RO 10.0.0.0 0.255.255.255

4. 不要暴露管理网段到公网

互联网扫描中 SNMP 暴露率极高,是攻击入口。

5. 监控 SNMP 访问日志

异常访问(重复 community 探测)应触发告警。


09. 总结:SNMP 是侦察阶段最危险的“情报源”

SNMP 的危害常被误解为低风险,但在攻击链中,它属于:

高价值情报泄露点(Information Disclosure)

它能帮助攻击者:

  • 快速识别网络关键资产

  • 获取管理员信息

  • 推断机房、部署位置

  • 推断操作系统与版本

  • 获取拓扑结构与路由

  • 判断设备运行时间(弱点:长时间未重启)

它永远不应该被忽视。


文章来源: https://www.freebuf.com/articles/vuls/459953.html
如有侵权请联系:admin#unsafe.sh