一、基本概念

SNMP(Simple Network Management Protocol,简单网络管理协议) 是一种用于网络设备管理的应用层协议,属于TCP/IP协议族的一部分。

核心功能:

  • 监控:收集网络设备状态信息

  • 配置:远程修改设备参数

  • 告警:接收设备故障通知

  • 管理:统一管理多品牌设备

二、体系结构

1. 三个核心组件:

text

┌─────────────────┐    ┌─────────────────┐    ┌─────────────────┐
│  管理站(NMS)    │◄──►│   代理(Agent)   │◄──►│ 被管设备(MIB)   │
│  (Network      │    │                │    │ (Management    │
│  Management    │    │                │    │ Information    │
│  System)       │    │                │    │ Base)          │
└─────────────────┘    └─────────────────┘    └─────────────────┘

a) 管理站 (NMS - Network Management System)

  • 管理软件(如SolarWinds, PRTG, Zabbix)

  • 发送请求、接收响应和陷阱

b) 代理 (Agent)

  • 运行在被管设备上的守护进程

  • 监听UDP 161端口

  • 响应管理站请求

c) 管理信息库 (MIB - Management Information Base)

  • 设备信息的结构化数据库

  • 采用树状结构(OID标识)

三、协议版本

版本 年份 安全性 特点
SNMPv1 1988 社区名明文传输,基本功能
SNMPv2c 1993 增加批量操作,社区名验证
SNMPv3 1998 加密、认证、访问控制

四、操作类型

1. 基本操作:

操作 方向 端口 用途
GET NMS → Agent 161 读取单个值
GETNEXT NMS → Agent 161 读取下一个值
GETBULK NMS → Agent 161 批量读取(v2/v3)
SET NMS → Agent 161 修改配置
RESPONSE Agent → NMS 161 响应请求
TRAP Agent → NMS 162 主动发送告警
INFORM Agent → NMS 162 需确认的TRAP(v2/v3)

五、MIB和OID

1. OID结构示例:

text

iso(1).org(3).dod(6).internet(1).mgmt(2).mib-2(1).system(1).sysDescr(1)
= 1.3.6.1.2.1.1.1

2. 常用OID:

bash

# 系统信息
1.3.6.1.2.1.1.1.0    # sysDescr - 系统描述
1.3.6.1.2.1.1.5.0    # sysName - 设备名称
1.3.6.1.2.1.1.3.0    # sysUpTime - 运行时间

# 接口信息
1.3.6.1.2.1.2.2.1.2  # ifDescr - 接口描述
1.3.6.1.2.1.2.2.1.10 # ifInOctets - 输入字节数
1.3.6.1.2.1.2.2.1.16 # ifOutOctets - 输出字节数

# TCP连接
1.3.6.1.2.1.6.13.1.1 # tcpConnState - TCP连接状态

六、端口使用

端口 协议 用途
UDP 161 SNMP Agent监听,接收请求
UDP 162 SNMP NMS监听,接收TRAP
TCP 161 很少用 某些实现支持TCP

七、安全风险

1. 常见安全问题:

bash

# 弱社区名攻击
snmp-check -c public 192.67.1.10
snmp-check -c private 192.67.1.10

# 信息泄露
snmpwalk -c public -v1 192.67.1.10
snmpwalk -c public -v2c 192.67.1.10 .1.3.6.1.2.1.25.1  # 进程信息

# 配置修改(如果SET允许)
snmpset -c private -v2c 192.67.1.10 .1.3.6.1.2.1.1.5.0 s "newname"

2. 默认凭据:

text

community strings:
public - 只读访问
private - 读写访问(危险!)

八、实用命令示例

1. Linux工具:

bash

# 安装SNMP工具
sudo apt install snmp snmp-mibs-downloader  # Debian/Ubuntu
sudo yum install net-snmp-utils             # RHEL/CentOS

# 基本查询
snmpget -v2c -c public 192.67.1.10 .1.3.6.1.2.1.1.1.0
snmpwalk -v2c -c public 192.67.1.10 .1.3.6.1.2.1.1

# 获取系统信息
snmpwalk -v2c -c public 192.67.1.10 system

# 扫描SNMP服务
nmap -sU -p 161 192.67.1.10
nmap -sU -p 161 --script snmp-info 192.67.1.10

2. 枚举信息:

bash

# 完整枚举
snmpwalk -c public -v1 192.67.1.10

# 枚举用户(Windows)
snmpwalk -c public -v1 192.67.1.10 .1.3.6.1.4.1.77.1.2.25

# 枚举进程
snmpwalk -c public -v1 192.67.1.10 hrSWRunName

# 枚举网络接口
snmpwalk -c public -v1 192.67.1.10 ifDescr

3. 安全检测脚本:

python

#!/usr/bin/env python3
from pysnmp.hlapi import *
import sys

def snmp_scan(target, community="public"):
    """SNMP信息收集"""
    oids = [
        '1.3.6.1.2.1.1.1.0',  # 系统描述
        '1.3.6.1.2.1.1.5.0',  # 主机名
        '1.3.6.1.2.1.1.6.0',  # 位置
    ]
    
    for oid in oids:
        errorIndication, errorStatus, errorIndex, varBinds = next(
            getCmd(SnmpEngine(),
                   CommunityData(community),
                   UdpTransportTarget((target, 161)),
                   ContextData(),
                   ObjectType(ObjectIdentity(oid)))
        )
        
        if errorIndication:
            print(f"错误: {errorIndication}")
        else:
            for varBind in varBinds:
                print(f"{varBind[0]} = {varBind[1]}")

if __name__ == "__main__":
    snmp_scan("192.67.1.10")

九、在网络安全中的应用

1. 网络监控:

bash

# 监控带宽使用
snmpget -v2c -c public 192.67.1.10 IF-MIB::ifInOctets.1
snmpget -v2c -c public 192.67.1.10 IF-MIB::ifOutOctets.1

# 监控设备状态
snmpget -v2c -c public 192.67.1.10 HOST-RESOURCES-MIB::hrSystemProcesses.0

2. 安全加固建议:

bash

# 1. 使用SNMPv3替代v1/v2c
# 2. 修改默认社区名
# 3. 配置ACL限制访问源
# 4. 禁用不必要的MIB访问
# 5. 定期审计SNMP配置

3. 渗透测试中的利用:

bash

# 使用onesixtyone快速扫描社区名
onesixtyone -c community.txt 192.67.1.10

# 使用snmp-check综合扫描
snmp-check 192.67.1.10 -c public -w

# Metasploit模块
use auxiliary/scanner/snmp/snmp_enum
set RHOSTS 192.67.1.10
run

十、在企业环境中的典型应用

  1. 网络设备监控:路由器、交换机状态

  2. 服务器监控:CPU、内存、磁盘使用率

  3. 打印机管理:墨粉、纸张状态

  4. UPS监控:电池状态、负载

  5. 环境监控:温度、湿度传感器

总结

SNMP是网络管理的基石协议,虽然简单但功能强大。在安全测试中:

  • ✅ 信息收集:获取系统、网络、用户信息

  • ⚠️ 权限提升:如果配置不当可能修改配置

  • 🔒 安全风险:默认配置存在严重安全隐患

对于你之前的测试目标 192.67.1.10,可以尝试:

bash

# 检查是否开放SNMP
nmap -sU -p 161 192.67.1.10

# 如果开放,尝试信息收集
snmpwalk -c public -v2c 192.67.1.10 .1.3.6.1.2.1.1

很多网络设备(包括WAF)会开启SNMP用于监控,这可能是获取设备信息的有效途径。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐