翻译:WisFree
预估稿费:200RMB
投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿
写在前面的话
在去年举办于美国拉斯维加斯的第二十四届DEFCON黑客大会上,我跟大家讨论了有关物联网设备SNMP写权限的安全问题。我们通过研究发现,警察巡逻车、救护车、以及其他用于执行关键任务的车辆其安全性都会受到这个问题的影响。
在2016年12月,我和另外一名来自阿根廷的同事Ezequiel Fernandez决定重新对SNMP协议(简单网络管理协议)进行一次模糊测试,但这一次我们打算使用“community string”的各种组合来进行测试。比如说,如果我们可以将类似“root”、“admin”或者“user”这样比较常用的凭证作为SNMP随机值来测试网络中哪一个节点可以响应我们的请求。
SNMP协议
但是在开始之前,我觉得有必要给大家简单回顾以下有关SNMP协议的基本内容。SNMP是基于TCP/IP协议族的网络管理标准,是一种在IP网络中管理网络节点(如服务器、工作站、路由器、交换机等)的标准协议。SNMP能够使网络管理员提高网络管理效能,及时发现并解决网络问题以及规划网络的增长。除此之外,网络管理员还可以通过SNMP接收网络节点的通知消息以及告警事件报告等来获知网络出现的问题。
首先,我们知道目前有三种方法可以对客户端的身份进行验证,并向远程SNMP设备发送请求。SNMP v1和v2使用了人类可读的字符串数据值(即Community String-社区字符串),而在SNMP v3版本中,用户可以自行选择用户名、密码以及身份验证的方式。除此之外,像对象标识符(OIDs)和陷阱入口(traps)这样的信息将会保存在管理信息库(MIB)之中。
注:Community String在交换机与路由器配置里 意为"社区字符串"。它是一个用在基于简单网络管理协议(SNMP)的管理系统的概念,是一个起着密码作用的文本串,其被用来鉴别在管理站点和一个包含SNMP信息的代理的路由器之间的信息发送。并将被发送到在管理器和代理之间的每个数据包。
漏洞分析
我们编写了一个简单的Python脚本,这个脚本可以使用套接字(socket)来构建“snmpget”请求。在请求内容中,我们需要使用sysDescr OID,如果我们所测试的字符串值(例如admin或root)正好与SNMP代理所保存的身份验证值相同,那么我们就可以成功获取到sysDescr OID信息了,整个过程与暴力破解攻击十分相似。在经过了几天的扫描之后,我们发现了一个非常奇怪的现象:无论我们发送的是什么值,有些设备/指纹总是会给我们返回响应信息。那么这到底是怎么回事呢???
正如我之前所提到的那样,SNMP v1和v2版本所使用的身份验证机制只能接受保存在SNMP代理验证机制中的数据值,但是根据我们的研究结果来看,这种行为似乎与规范文档中所定义的机制有很大出入。
简而言之,我们发现了如下几个可疑点:你可以使用任意字符串或整数来完成某些特定设备中SNMP代理所要求的身份验证,但更糟糕的地方就在于,你甚至可以利用任意字符串或整数值来获取到目标设备完整的远程读写(read/write)权限。
这就是SNMP协议中所存在的远程代码执行漏洞CVE-2017-5135,漏洞类型:不正确的访问控制。
接下来为了验证我们的发现,我们需要选择一台设备来进行测试。经过分析之后,我们决定选择思科DPC3928SL,而这款设备也是受此问题影响最为严重的设备型号之一。但思科方面表示,公司已经停止对这款型号的网关设备提供技术服务支持了,并推荐了Technicolor路由器,于是我们便开始对Technicolor路由器进行深入分析,看看我们到底能发现什么。在进行了一系列测试之后,我们已经识别出了相应的安全问题并进行了上报,但他们给出的回应是一个我们所不能接受的解决方案。
正如你所看到的那样,Technicolor安全团队解释称,这个问题是一个由网络服务提供商(ISP)所导致的“控制配置错误问题”,而错误并不在Technicolor身上!这简直是没谁了,一句话就把责任推得一干二净。但是对于我们研究人员来说,这样苍白无力的解释很明显是没有任何说服力的。不过没关系,Technicolor安全团队也对我们的工作表示了感谢,并且也迅速回复了我们的信息,但我们并不打算因此而终止我们的分析。
现在,你大概已经了解这个问题了,但是你可能会想:好吧,网络上是不是还会有很多其他的设备同样会受到这一问题的影响呢?没错,你说对了!我们通过实验证明,还有很多不同品牌和不同型号的设备同样会受到这个SNMP协议漏洞的影响,而这也从侧面证实了Technicolor的想法完全是大错特错的…
在此,我们打算将这个漏洞命名为“StringBleed”…:D
接下来,我们打算再进行一次扫描,但这一次我们不准备使用人类可读的字符串了,我们决定生成一个随机哈希值,然后将其发送给网络上所有能扫描到的SNMP设备,而实验的结果也着实出乎了我们的意料。这一次,我们检测到了150多种受到StringBleed影响的设备,而且这些设备都是不同的。
事实证明,Technicolor的观点是错误的,这个问题不是网络服务提供商的错误配置所造成的,而问题似乎是出在代码的身上。
概念验证PoC
【攻击向量】:Community String
测试攻击点的IP地址:“192.168.0.1”
总结
1. 我们在SNMP协议中发现了一个远程代码执行漏洞,在这个漏洞的帮助下,我们可以利用任意字符串或整数值来绕过SNMP的访问控制。
2. 我们可以在MIB(管理信息库)中写入任意字符串。
3. 我们可以在无需猜测community string的情况下轻而易举地从目标设备中获取到类似用户密码这样的敏感信息。
4. 这个漏洞修复起来并不简单,因为目前有多家厂商的各种型号设备都受到了该问题的影响,而随着扫描时间的延续,受影响设备的名单也在不断增加。
5. Technicolor安全团队的响应缺乏技术分析的支持,而根据我们的研究结果,他们所给出的回复是让人无法接受的。
受漏洞影响的产品型号
5352
BCW700J
BCW710J
BCW710J2
C3000-100NAS
CBV734EW
CBV38Z4EC
CBV38Z4ECNIT
CBW383G4J
CBW38G4J
CBW700N
CG2001-AN22A
CG2001-UDBNA
CG2001-UN2NA
CG2002
CG2200
CGD24G-100NAS
CGD24G-1CHNAS
CM5100
CM5100-511
CM-6300n
DCX-3200
DDW2600
DDW2602
DG950A
DPC2100
DPC2320
DPC2420
DPC3928SL
DVW2108
DVW2110
DVW2117
DWG849
DWG850-4
DWG855
EPC2203
EPC3212
IB-8120-W21
IB-8120-W21E1
MNG2120J
MNG6200
MNG6300
SB5100
SB5101
SB5102
SBG6580
SBG900
SBG901
SBG941
SVG1202
SVG2501
T60C926
TC7110.AR
TC7110.B
TC7110.D
TC7200.d1I
TC7200.TH2v2
THG540
THG541
Tj715x
TM501A
TM502B
TM601A
TM601B
TM602A
TM602B
TM602G
TWG850-4U
TWG870
TWG870U
U10C019
U10C037
VM1700D
WTM552G
WTM652G
DCM-704
DCM-604
DG950S