译者:興趣使然的小胃
预估稿费:200RMB
投稿办法:发送邮件至linwei#360.cn,或上岸网页版在线投稿

一、序言
在本文中,我会向大家先容D-Link高端路由器中存在的一些漏洞,受影响的路由器型号包括:
DIR890L
DIR885L
DIR895L
其他DIR8xx型号的D-Link路由器
这些设备利用了相同的代码,这就给攻击者供应了绝佳的机会,可以将这些设备一起纳入僵尸网络中。此外,我们轻微修正了Mirai的编译脚本,成功将Mirai移植到这些设备上。
本文也会顺便说一下我们与开拓者的互换过程(然而没有取得任何进展,这些漏洞依然没被修复)。这3个漏洞中,有2个漏洞与cgibin有关(cgibin是卖力天生路由管理页面的主CGI文件),另一个漏洞与系统规复有关。
二、盗取登录名及密码
一句话概括:只需一个HTTP要求,攻击者就能获取登录名及密码。
我们创造的第一个漏洞位于phpcgi中。Phpcgi是cgibin的符号链接,卖力处理对.php、.asp以及.txt页面的要求。Phpcgi可以解析通过URL、HTTP头或者POST要求正文(body)发送的那些数据。Phpcgi会创建一个长字符串,该字符串随后会分解为多少组键值对(key-value),包括$GET、$POST、$SERVER字典以及其他php脚本变量都包含在这些键值对中。完成要求剖析过程后,该符号链会检讨用户的授权状态。如果用户未经授权,符号链会往字符串中添加值为-1的一个AUTHORIZED_GROUP变量。
从安全角度来看,这种解析过程存在一些问题。每个键值对(key-value)的编码形式为:TYPEKEY=VALUE,个中TYPE指代的是GET、POST、SERVER或其他值。编码完成后,键值对后会跟上换行符'\n'。
通过POST要求,我们可以利用SomeValue%3dAUTHORIZED_GROUP=1这个字符串实现添加值的目的。这个字符串会被设备解析为_GET_SomeKey=SomeValue\nAUTHORIZED_GROUP=1,通过这种办法,我们可以利用已授权用户身份运行脚本(只管可运行脚本的数量有限)。向
1http:⁄/192.168.0.1/getcfg.php
地址发送要求并添加SERVICES=DEVICE.ACOUNT键值对后,我们可以调用
1/htdocs/webinc/getcfg/DEVICE.ACCOUNT.xml.php
脚本,迫使路由器返回登录名及密码信息。
从设备代码中我们可以看出,攻击者可以运行位于/htdocs/webinc/getcfg目录中的脚本。这个目录中还包含一个DEVICE.ACCOUNT.xml.php脚本,可以为攻击者供应大量敏感信息,如设备的登录名及密码等信息。
换句话说,如果攻击者往
1http:⁄/192.168.0.1/getcfg.php
发送要求,同时添加SERVICES=DEVICE.ACOUNT键值对,那么设备在相应页面中就会包含相应的登录名及密码信息。
对攻击者而言,得到这些信息已经足够,比如,攻击者可以利用登录凭据将低廉甜头的恶意固件刷到设备中。
读者可以访问此链接理解完全的PoC代码。
三、获取设备的超级用户权限(从RCE到Root)
一句话概括:只需一个HTTP要求,攻击者就能得到设备的root shell。
第二个漏洞是个栈溢出漏洞,与HNAP(Home Network Administration Protocol,家庭网络管理协议)的实行缺点有关。
如果想要利用该协议来发送,攻击者须要向
1http:⁄/192.168.0.1/HNAP1/
页面发送要求,并在SOAPACTION头部中指定要求的类型。设备对授官僚求的处理过程存在漏洞。设备会利用
1http:⁄/purenetworks.com/HNAP1/Login
值来调用授权函数。攻击者可以在要求正文(body)中指定其他键值对(key-value),如Action、Username、LoginPassword以及Captcha(要求正文中事先已经包含一组预定义的值)。随后设备会利用html标签对这些值进行编码,编码结果如:<key>value</key>。
这里最紧张的问题涌如今提取键值对的那个函数上,设备在栈上利用了一个大小为0x400字节的缓冲区用于提取键值对,然而,攻击者可以利用strncpy函数发送高达0x10000字节的数据,这样一来就会导致巨大的栈溢出问题。精心布局后,strncpy不仅会溢出当前的栈,也会溢出调用函数栈,由于“dest”变量最多能存储0x80个字节的数据,而攻击者输入的值可达0x400个字节。
此外,当函数退出时,R0寄存器中存在一个指向该字符串的指针。因此,攻击者可以指定一组sh命令,将返回地址修正为“system”函数。经由这些步骤,设备已处于攻击者的掌控之下,任攻击者宰割。
读者可以访问此链接理解完全的PoC代码。
四、在规复(Recovery)模式中更新固件
一句话概括:只需一次重启,你就拥有root权限。
第三个漏洞在于,当路由器启动时,会启动一个用于规复模式的web做事器,持续几秒钟。如果未授权的攻击者通过以太网线连接到设备上,他们就可以捉住这个机会,利用该做事器更新设备固件。
为了利用这个漏洞,攻击者唯一要做的便是重启目标设备,重启设备的方法有很多,攻击者可以利用上面提到的漏洞完成重启,也可以往jcpd做事发送“EXEC REBOOT SYSTEM”命令完成重启。jcpd做事通过19541端口向本地网络供应做事,攻击者无需经由认证即可访问该做事,并且设备没有供应关闭该做事的任何选项,是非常完美的操作目标。为了完备掌握目标设备,攻击者须要将低廉甜头的固件上传到设备中。
读者可以访问此链接理解完全的PoC代码。
五、韶光线
这里我想提一下我们跟D-Link安全团队的沟通过程,韶光线如下:
04/26/2017: 我们将hnap协议漏洞关照开拓者。
04/28/2017: D-Link员工回答说他们已经在beta版的固件中修复了这个漏洞,我们可以从support.dlink.com下载相应固件。(注:D-Link主页上没有固件下载这一栏)
04/28/2017 – 05/03/2017:我们剖析了D-Link在回答中提到的那个固件版本,创造我们关照开拓者的某个漏洞仍旧没有被修复。
05/03/2017 – 05/09/2017:我们创造了固件中的另一个漏洞,关照D-Link并讯问前一个漏洞的修复情形。他们回答称漏洞的检测、修复以及评估须要一段韶光。
06/01/2017:我们将漏洞信息关照CERT,收到的回答如下:
12“向您问候并诚挚感谢您提交的漏洞报告。经由审查后,我们决定不处理该漏洞报告。
我们建议您连续跟厂商沟通,再公开这些漏洞信息。”
06/02/2017:D-Link沉默了将近一个月,因此我们决定采纳一些行动。我们警告D-Link,如果他们对这些漏洞放任不管,我们会向公众年夜众表露这些漏洞。
06/06/2017:D-Link在回答中提到了他们的漏洞相应过程,发送了一个beta版固件,在固件中修复了phpcgi漏洞。然而之条件交给D-Link的另一个漏洞仍旧被开拓者忽略了(可能D-Link安全团队仍旧坚信他们已经在beta版固件中修复了这个漏洞)。
我们再一次就未修复的漏洞联系D-Link。果不其然,我们没有得到任何回答。我们从开拓者那边得到的末了一条回答如下:
“首先向您问候,
我们的研发团队正在研究您的漏洞报告。在理清漏洞来源、供应办理方案及确定问题范围(我们须要确定漏洞影响的详细型号)之前,我们常日不会谈论详细的进展情形。
本周初我们该当会发布一些更新包。
关于您的研究事情我无法供应任何进展信息。一旦我们修复漏洞后,我们会在support.dlink.com上公布经由第三方认证的详细信息。
正如您看到的那样,常日情形下,漏洞的修复周期为好几个星期。经由验证后,我们会以beta版形式向"大众年夜众供应固件,在公布RC版之前,我们还须要经由较长的质检周期。完全的发布周期常日须要90天。
如果您选择早点公布漏洞报告,请向我们供应详细的URL地址。由于如果你希望该漏洞得到一个CVE编号,我们须要详细的报告作为参考。”
8月中旬,我们访问support.dlink.com,创造开拓者上传了同一个beta版固件,该固件中仍有2个未修复。
因此,我们的结论为:
D-Link只在DIR890L路由器中修复了一个漏洞,其他设备仍旧处于不屈安状态。
开拓者完备忽略了其他两个漏洞。
我只能说,干得俊秀,D-Link!