SNMP协议详解
·
一、基本概念
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
十、在企业环境中的典型应用
-
网络设备监控:路由器、交换机状态
-
服务器监控:CPU、内存、磁盘使用率
-
打印机管理:墨粉、纸张状态
-
UPS监控:电池状态、负载
-
环境监控:温度、湿度传感器
总结
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用于监控,这可能是获取设备信息的有效途径。
更多推荐
所有评论(0)