迅维网

如何运用D-Link高端路由器构建僵尸网络

hcrt 2017-9-23 10:50


如何运用D-Link高端路由器构建僵尸网络


  在本文中,我会向大家介绍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变量。


如何运用D-Link高端路由器构建僵尸网络


  从安全角度来看,这种解析过程存在一些问题。每个键值对(key-value)的编码形式为:TYPEKEY=VALUE,其中TYPE指代的是GET、POST、SERVER或其他值。编码完成后,键值对后会跟上换行符'\n'。


如何运用D-Link高端路由器构建僵尸网络


  通过POST请求,我们可以运用SomeValue%3dAUTHORIZED_GROUP=1这个字符串实现添加值的目的。这个字符串会被设备解析为_GET_SomeKey=SomeValue\nAUTHORIZED_GROUP=1,通过这种方式,我们可以运用已授权用户身份运行脚本(尽管可运行脚本的数量有限)。向
1
http:/192.168.0.1/getcfg.php

地址发送请求并添加SERVICES=DEVICE.ACOUNT键值对后,我们可以调用
1
/htdocs/webinc/getcfg/DEVICE.ACCOUNT.xml.php

脚本,迫使路由器返回登录名及密码信息。


如何运用D-Link高端路由器构建僵尸网络

  从设备代码中我们可以看出,攻击者可以运行位于/htdocs/webinc/getcfg目录中的脚本。这个目录中还包含一个DEVICE.ACCOUNT.xml.php脚本,可以为攻击者提供大量敏感信息,如设备的登录名及密码等信息。


如何运用D-Link高端路由器构建僵尸网络

  换句话说,如果攻击者往

  1
  http:/192.168.0.1/getcfg.php

  发送请求,同时添加SERVICES=DEVICE.ACOUNT键值对,那么设备在响应页面中就会包含相应的登录名及密码信息。

  对攻击者而言,获得这些信息已经足够,比如,攻击者可以运用登录凭证将自制的恶意固件刷到设备中。

  读者可以访问此链接了解完整的PoC代码。

  三、获得设备的超级用户权限(从RCE到Root)

  一句话概括:只需一个HTTP请求,攻击者就能获得设备的root shell。

  第二个漏洞是个栈溢出漏洞,与HNAP(Home Network Administration Protocol,家庭网络管理协议)的执行错误有关。

  如果想要运用该协议来发送消息,攻击者需要向

  1
  http:/192.168.0.1/HNAP1/

  页面发送请求,并在SOAPACTION头部中指定请求的类型。设备对授权请求的处理过程存在漏洞。设备会运用

  1
  http:/purenetworks.com/HNAP1/Login

  值来调用授权函数。攻击者可以在请求正文(body)中指定其他键值对(key-value),如Action、Username、LoginPassword以及Captcha(请求正文中事先已经包含一组预定义的值)。随后设备会运用html标签对这些值进行编码,编码结果如:value


如何运用D-Link高端路由器构建僵尸网络

  这里最主要的问题出现在提取键值对的那个函数上,设备在栈上运用了一个大小为0x400字节的缓冲区用于提取键值对,然而,攻击者可以运用strncpy函数发送高达0x10000字节的数据,这样一来就会导致巨大的栈溢出问题。精心构造后,strncpy不仅会溢出当前的栈,也会溢出调用函数栈,因为“dest”变量最多能储存0x80个字节的数据,而攻击者输入的值可达0x400个字节。


如何运用D-Link高端路由器构建僵尸网络

  此外,当函数退出时,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,收到的回复如下:
  1
  2
  “向您问候并诚挚感谢您提交的漏洞报告。经过审查后,我们决定不处理该漏洞报告。我们建议您继续跟厂商沟通,再公开这些漏洞信息。”

  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!


雷人

握手

鲜花

鸡蛋

路过
收藏
来自: 今日头条
关闭

站长提醒 上一条 /1 下一条

返回顶部
附近
店铺
微信扫码查看附近店铺
维修
报价
扫码查看手机版报价
信号元
件查询
点位图


芯片搜索