浅议SNMP安全、SNMP协议、网络管理学习

1. 网络管理简介

随着网络技术的飞速发展,网络的数量也越来越多。而网络中的设备来自各个不同的厂家,如何管理这些设备就变得十分重要。我们今天要研究的就是介绍管理这些设备的标准,简单来说就是如何在内网中管理各种异构设备。0x1: TCP/IP的网络管理组件

1. 网络管理系统(NMSs,Network-management systems) 网络管理系统一般安装在网络管理站上,一个网络管理系统运行应用程序,以该应用程序监视并控制被管理的设备。也称为管理实体(managing entity),网络管理员在这儿与网络设备进行交 互。网络管理系统提供网络管理需要的大量运算和记忆资源。一个被管理的网络可能存在一个以上的网络管理系统 2. 被管理的设备(managed device) 一个被管理的设备是一个网络节点,它包含一个存在于被管理的网络中的SNMP代理者。被管理的设备通过管理信息库(MIB)收集并存储管理信息,并且让网络管理系统能够通过SNMP代理者取得 这项信息。被管设备种类繁多,例如: 2.1) 路由器 2.2) X终端 2.3) 终端服务器 2.4) 打印机等 3. 代理者(agent) 代理者是一种存在于被管理的设备中的网络管理软件模块。代理者控制本地机器的管理信息,以和SNMP兼容的格式发送这项信息。可以是一个独立的程序(在Unix中叫守护进程),也可以是已经 整合到操作系统中(比如:锐捷路由器的RGNOS,或者UPS中的底层操作系统)

管理进程和代理进程之间的通信可以有两种方式:

1) 管理进程向代理进程发出请求: 1.1) 询问一个具体的参数值(例如:你产生了多少个不可达的ICMP端口) 1.2) 要求改变代理进程的参数值(例如:把默认的IP TTL值改为64) 2) 代理进程主动向管理进程报告有某些重要的事件发生(例如:一个连接口掉线了)

0x2: 网络管理体系架构

1. 管理信息库MIB(Management Information Base) 管理信息库(MIB)包含所有代理进程的所有可被查询和修改的参数。RFC 1213 [McCloghrie and Rose 1991]定义了第二版的MIB,叫做MIB-II MIB是一个数据库的概念 2. 管理信息结构SMI(Structure of Management Information) 关于MIB的一套公用的结构和表示符号,这个在RFC 1155 [Rose and McCloghrie 1990]中定义 SMI是一个数据结构的概念 3. 简单网络管理协议SNMP(Simple Network Management Protocol) 管理进程和代理进程之间的通信协议,在RFC 1157 [Case et al. 1990]中定义 SNMP是一个协议、以及通信流程的概念

值得注意的是:

对协议和管理信息结构的良好分离使得使用SNMP来监测和管理同一网络内上百的不同子系统非常简单。MIB模型运行管理OSI参考模型的所有层,并可以扩展至诸如数据库,电子邮件以及J2EE参 考模型之类的应用。

MIB(Management Information Base)

对于MIB,我们可以理解为一个中央数据库,用来保存网络中各种设备的参数信息

1. 管理信息库MIB指明了网络元素(网络中的设备)所维持的变量(能够被管理进程查询和设置的信息) 2. MIB给出了一个网络中所有可能的被管理对象的集合的数据结构 3. MIB管理信息库采用和域名系统DNS相似的树型结构,它的根在最上面,根没有名字,它又称为对象命名(object naming tree)

类似于数据库中常说的唯一标识每条记录的"主键",在MIB中,由对象识别符(OID:Object Identifier)唯一指定每条MIB记录。

MIB是一个树形结构(点分树形结构),SNMP协议消息通过遍历SNMP MIB树形目录中的节点来访问网络中的设备

在这课"对象命名树"中,我们care的只是"mgmt(管理子树)",即

Root->iso->org->dod->internet->mgmt->mid.. {1.3.6.1.2.1}

最初的结点mib将其所管理的信息分为8个类别

类别

标号

所包含的信息

system

interfaces

address translation

ip

icmp

tcp

udp

egp

(1)

(2)

(3)

(4)

(5)

(6)

(7)

(8)

主机或路由器的操作系统

各种网络接口及它们的测定通信量

地址转换(例如ARP映射)

Internet软件(IP分组统计)

ICMP软件(已收到ICMP消息的统计)

TCP软件(算法、参数和统计)

UDP软件(UDP通信量统计)

EGP软件(外部网关协议通信量统计)

例如,我们可以使用1.3.6.1.2.1.1来标识"主机或路由器的操作系统",从而对指定项进行信息获取以及参数设定

SMI(Structure Of Management Information)

对于SMI,我们可以把它理解为一个数据结构,一个规范规则。在继续深入学习SMI之前,我们需要先来了解一下ASN.1

ASN.1: 高级数据描述语言,描述: 1) 数据类型 2) 结构 3) 组织 4) 编码方法 包含语法符号和编码规则两大部分 //SMI是ASN.1的子集 SMI是SNMP的描述方法。但是因为ASN.1功能很强大,但SNMP只用到其中一小部分,为了方便使用,对这部分内容做了描述,限定了范围,这就是SMI。SMI由ASN.1的一个"子集合"和一部分自 定义的类型、宏等组成。SMI是ASN.1的一个子集

管理信息结构SMI(structure of management information)指定了在SNMP的MIB中用于"定义管理目标的规则"。SMI是一种语言,是为了确保网络管理数据的"语法"和"语义"明确和无二义性而定义的语言。它是定义被管理网络实体中特定数据的语言

SMI定义了:

1) 数据类型 2) 对象模型 3) 写入管理信息的规则 4) 修改管理信息的规则

我们接下来讨论一下SMI中定义的数据类型:

1. Integer整型 Signed 32bit Integer (values between - and ) 有符号32位整数(值范围: - ~ +) 2. Integer32 Same as Integer. 与Integer相同 3. UInteger32 Unsigned 32bit Integer (values between 0 and ) 无符号32位整数(值范围:0~) 4. Octet String Arbitrary binary or textual data, typically limited to 255 characters in length 任意二进制或文本数据,通常长度限制在255个字符内。 5. Object Identifier An OID 一个OID 6. Bit String Represents an enumeration of named bits. This is an unsigned datatype 表示取名的位的枚举。这是一个无符号的数据类型 7. IpAddress An IP address. 一个IP地址,值范围0到65535 8. Counter32 Represents a non-negative integer which monotonically increases until it reaches a maximum value of 32bits-1 ( dec), when it wraps around and starts increasing again from zero 表示一个非负的整数(可递增到32位最大值-1),然后恢复并从0开始递增 9. Counter64 Same as Counter32 but has a maximum value of 64bits-1 与Counter32相同,最大值为64位的最大值-1 10. Gauge32 Represents an unsigned integer, which may increase or decrease, but shall never exceed a maximum value 表示无符号整数,可增加或减少,但是不超过最大值 11. TimeTicks Represents an unsigned integer which represents the time,modulo 2ˆ32 ( dec), in hundredths of a second between two epochs 表示代表数据的一个无符号整数,2^32取模(),两个值之间为百分之一秒。 12. Opaque Provided solely for backward-compatibility, its no longer used 提供向下兼容,不再使用的数据类型 13. NsapAddress Represents an OSI address as a variable-length OCTET STRING 表示一个用变长八进制字符窗表示的OSI地址

SNMP(Simple Network Management Protocol)

SNMP采用了Client/Server模型的特殊形式:代理/管理站模型。对网络的管理与维护是通过管理工作站与SNMP代理间的交互工作完成的。每个SNMP从代理负责回答SNMP管理工作站(主代理)关于SNMP MIB定义信息的各种查询

从图中我们可以看到,不论是攻击者还是安全测试人员要对网络中的设备进行"SNMP查询",都必须提供一个"community(团队名)",这就是相当于密码的作用。所谓的SNMP爆破指的就是穷举这个"community"。

对于更安全地配置来说,还会在从代理上设置白名单,只允许指定IP、MAC的设备进行SNMP访问

SNMP网络管理体系总体架构图

2. SNMP协议

简单网络管理协议(SNMP:Simple Network Management Protocol)是由互联网工程任务组(IETF:Internet Engineering Task Force )定义的一套网络管理协议。该协议基于简单网关监视协议(SGMP:Simple Gateway Monitor Protocol)。利用SNMP,一个管理工作站可以远程管理所有支持这种协议的网络设备,包括监视网络状态、修改网络设备配置、接收网络事件警告等。虽然SNMP开始是面向基于IP的网络管理,但作为一个工业标准也被成功用于电话网络管理

1. SNMP从代理(网络中的设备)和管理站(主代理)通过SNMP协议中的标准消息进行通信,每个消息都是一个单独的数据报。 2. SNMP使用UDP(用户数据报协议)作为第四层协议(传输协议),进行无连接操作。 3. SNMP采用UDP 161端口接收和发送请求,162端口接收trap

和其他大部分的协议一样,SNMP包含了多种数据报类型

1. GET REQUEST 从代理进程处提取一个或多个参数值 2. GET NEXT REQUEST 从代理进程处提取一个或多个参数的下一个参数值 3. GET RESPONSE 设置代理进程的一个或多个参数值 4. SET REQUEST 返回的一个或多个参数值。这个操作是由代理进程发出的。它是前面"GET RESPONSE"中操作的响应操作 5. TRAP 代理进程主动发出的报文,通知管理进程有故障或错误发生 6. GETBULK REQUEST 7. INFORM

SNMP的数据报格式

和其他的协议类似,SNMP中有不同种类的数据报,所以它们的协议格式在大框架相同的情况下,内部也略有不同,我们来分别学习

0x1: GET REQUEST、GET NEXT REQUEST、GET RESPONSE、SET REQUEST

1. 版本识别符(version identifier) 确保SNMP代理使用相同的协议,每个SNMP代理都直接抛弃与自己协议版本不同的数据报。 该字段的值是通过SNMP版本号减去1得到的: 1) 0代表SNMP v1 2) 1代表SNMP v2 3) 2代表SNMP v3 2. 团体名(Community Name) 用于SNMP从代理对SNMP管理站进行认证 1) 如果失败,SNMP从代理将向管理站发送一个认证失败的Trap消息 2) 如果成功,则继续进行下一步set/get操作 "Community团体名"是管理进程(主代理)和代理进程(从代理)之间的口令,是明文格式,默认为public(这显然是一个明文弱密码,这也是很多SNMP存在风险的原因) 3. 协议数据单元(PDU) 其中PDU指明了SNMP的消息类型及其相关参数 1) PDU类型 1.1) 0表示get-request 1.2) 1表示get-next-request 1.3) 2表示get-response 1.4) 3表示set-request 1.5) 4表示trap 2) 请求标识 请求标识由管理进程设置,然后由代理进程在get-response中返回。这个字段的作用是使客户进程(在目前情况下是管理进程)能够将服务器进程(即代理进程)发出的响应和客户进程发出的 查询进行匹配。 这个字段允许管理进程对一个或多个代理进程发出多个请求,并且从返回的众多应答中进行分类 3) 差错状态 差错状态字段是一个整数,它是由代理进程标注的,指明有差错发生 3.1) 0: noError: 没有错误 3.2) 1: tooBig: 代理进程无法把响应放在一个SNMP消息中发送 3.3) 2: noSuchName: 操作一个不存在的变量 3.4) 3: badValue: set操作的值或语义有错误 3.5) 4: readOnly: 管理进程试图修改一个只读变量 3.6) 5: genErr: 其他错误 4) 差错索引 差错索引字段是一个整数偏移量,指明当有差错发生时,差错发生在哪个参数。它是由代理进程标注的,并且只有在发生noSuchName、readOnly和badValue差错时才进行标注。否则为0 5) 名称、值 在SNMP数据报中,名称和值构成一张"表" 5.1) GET REQUEST、GET NEXT REQUEST、GET RESPONSE value为空,只有名称 5.2) SET REQUEST 名称+值对

0x2: Trap

1. 版本识别符(version identifier) 确保SNMP代理使用相同的协议,每个SNMP代理都直接抛弃与自己协议版本不同的数据报。 该字段的值是通过SNMP版本号减去1得到的: 1) 0代表SNMP v1 2) 1代表SNMP v2 3) 2代表SNMP v3 2. 团体名(Community Name) 用于SNMP从代理对SNMP管理站进行认证 1) 如果失败,SNMP从代理将向管理站发送一个认证失败的Trap消息 2) 如果成功,则继续进行下一步set/get操作 "Community团体名"是管理进程(主代理)和代理进程(从代理)之间的口令,是明文格式,默认为public(这显然是一个明文弱密码,这也是很多SNMP存在风险的原因) 3. 协议数据单元(PDU) 其中PDU指明了SNMP的消息类型及其相关参数 1) PDU类型 4表示trap 2) 企业 3) 代理的IP地址 4) trap类型 4.1) 0: coldStart: 代理进程对自己初始化 4.2) 1: warmStart: 代理进程对自己重新初始化 4.3) 2: linkDown: 一个接口已经从工作状态改变为故障状态,报文中的第一个变量标识此接口 4.4) 3: linkUp: 一个接口已经从故障状态改变为工作状态,报文中的第一个变量标识此接口 4.5) 4: authenticationFailure: 从SNMP管理进程收到无效"团队名(密码)"的报文 4.6) 5: egpNeighborLoss: 一个EGP邻站已变为故障状态。报文中的第一个变量包含此邻站的IP地址 4.7) 6: enterpriseSpecific: 在这个特定的代码字段中查找trap信息 5) 特定代码 6) 时间戳 7) 名称、值对

3. SNMP通信流程抓包实验

在ubuntu下安装启动SNMPD过程

1. 安装snmp服务 apt-get install snmpd snmp 2. 修改团体名 vi /etc/snmp/snmpd.conf 增加一条 com2sec readwrite default public 则外部可以用public团体名访问snmpMIB 3. 修改snmpd服务启动参数 默认的snmpd是带参数127.0.0.1启动的,这样启动的时候就只能本机访问snmp服务,如果要让外部也能够访问snmp服务,则需要将该参数去掉。 vi /etc/default/snmpd,找到以下行: SNMPDOPTS=’-Lsd -Lf /dev/null -u snmp -I -smux -p /var/run/snmpd.pid 127.0.0.1′ 去掉其中的127.0.0.1,保存 4. 重启snmp服务 service snmpd restart

snmpwalk命令解释

USAGE: snmpwalk [OPTIONS] AGENT [OID] 1. OPTIONS: 1) -v 1|2c|3 显示指定SNMP的版本号 2) -V 显示但前版本号 3) -c COMMUNITY 指定团体号,即SNMP密码 4) -r RETRIES 设置失败重试次数 5) -t TIMEOUT 设置失败等待延时阈值 6) -m MIB[:...] 加载指定列表的MIB信息库,默认为ALL 7) -M DIR[:...] 加载制定路径的MIB信息库 2. AGENT 目标设备的代理地址(IP) 3. OID 可以是: 1) 点分对象命名标识,例如: .1.3.6.1.2.1.25.2.2 2) 指定条目名称,例如: system

常用的snmp命令有如下:

1. 得到取得windows端的系统进程用户数等 snmpwalk -c public -v 1 -m ALL 192.168.159.128 .1.3.6.1.2.1.25.1 2. 取得系统总内存 snmpwalk -c public -v 1 -m ALL 192.168.159.128 .1.3.6.1.2.1.25.2.2 3. hrSystemNumUsers snmpwalk -c public -v 1 -m ALL 192.168.159.128 4. 取得IP信息 snmpwalk -c public -v 1 -m ALL 192.168.159.128 .1.3.6.1.2.1.4.20 5. 查看系统信息 snmpwalk -v 2c -c public 192.168.159.128 system 6. ifDescr snmpwalk -v 1 192.168.159.128 -c public 7. 得到取得windows端的系统进程用户数等 snmpwalk -v 2c -c public 192.168.159.128 .1.3.6.1.2.1.25.1 8. 取得系统总内存 snmpwalk -v 2c -c public 192.168.159.128 .1.3.6.1.2.1.25.2.2 9. 取得系统用户数 snmpwalk -v 2c -c public 192.168.159.128 hrSystemNumUsers 10. 取得IP信息 snmpwalk -v 2c -c public 192.168.159.128 .1.3.6.1.2.1.4.20 11. 查看系统信息 snmpwalk -v 2c -c public 192.168.159.128 system 12. 获取网卡信息 snmpwalk -v 2c -c public 192.168.159.128 ifDescr 13. 获取全部信息 snmpwalk -v 2c -c public 192.168.159.128

0x3: SNMP通信抓包截图

get-request

get-next-request

get-response

4. SNMP存在的安全风险

0x1: 主要威胁

1. 信息修改 一些非授权实体可能改变由另一个授权实体产生的消息 2. 未授权访问 一个实体伪装成一个授权实体来进行它无权进行的操作 1) community团队名暴力穷举    可以使用例如hydra在内的工具进行SNMP密码破解 2) 认证机制漏洞 2008-6-16 US-CERT和其他机构警告企业,SNMP协议现在的版本存在严重漏洞,这个漏洞可以允许黑客绕过协议认证机制,伪装合法用户。这个漏洞可以使黑客在受影响的系统上完成一切 合法用户可以完成的行为。漏洞存在于SNMPv3的认证机制中,该机制使用键入的Hash Message Authentication Code(HMAC)。这是一种组合了密码算法散列式及密码密钥的运算,SNMPv3 的执行方法允许以缩短的HMAC编码以最少的HMAC字节(一个字节)使用在认证人栏位中认证代理,而将HMAC减少至一个字节是暴力破解法变得可行。黑客可以通过向受影响的计算机发送特制信息 包利用这些缺陷,可以查看并改变受到威胁的设备配置 3. 泄密 窃听代理和管理站之间的数据交换。即流量嗅探。 SNMP2.0和SNMP1.0的安全机制比较脆弱,通信不加密,所有通信字符串和数据都以明文形式发送。攻击者一旦捕获了网络通信,就可以利用各种嗅探工具直接获取通信字符串,即使用户改变了 通信字符串的默认值也无济于事。 4. 消息流修改 消息流修改是指消息可能被恶意地重排、延迟或者重发 5. 拒绝服务 攻击者阻止管理站和代理之间的信息交换。 6. 流量分析 攻击者观测管理站和代理之间流量的一般模式。