解密攻击者如何利用D-Link路由器构建僵尸网络

在这篇文章中,我们将跟大家讨论我们在几台顶级D-Link路由器中发现的安全漏洞,受影响的路由器型号如下:

-DIR890L -DIR885L -DIR895L -以及其他相关的DIR8xx型号D-Link路由器

这些设备使用的是相同的代码,因此攻击者将能够利用这些设备中存在的安全漏洞来组成一个庞大的僵尸网络。除此之外,我们还将尝试通过修改路由器的编译脚本来制作一个模拟的Mirai僵尸网络。

本文所要讨论的主要是D-Link路由器设备中的两个安全漏洞。其中一个与cgibin(cgibin是主要的CGI文件,它负责生成用于控制路由器的Web接口页面)有关,另一个漏洞则与系统恢复功能有关。

窃取登录凭证

简而言之,你只需要发送一个HTTP请求,你就可以窃取到路由器的登录名和密码了。

我们所检测到的第一个漏洞存在于phpcgi中。phpcgi是一个指向cgibin的符号链接,它负责处理所有针对.php、.asp和.txt页面的请求。它可以对通过URL、HTTP头或POST请求的body所发送的数据进行解析,phpcgi会创建一个长字符串,而这个字符串之后会被处理成一系列键值对,并被用于_POST和$_SERVER等字典以及php脚本变量之中。完成了请求分析之后,符号链接会检测用户是否经过了身份验证。如果用户没有被授权,它便会将字符串中的AUTHORIZED_GROUP变量值设置为-1。

这里的问题就在于,整个解析过程是存在安全漏洞的。每一个键值对都是按照以下形式编码的:_TYPE_KEY = VALUE,其中TYPE可以是GET、POST或SERVER。接下来,键值对会使用分行符’\n’来进行连接。

通过发送POST请求,我们可以使用SomeValue%3dAUTHORIZED_GROUP=1这个值来添加一个键。这个键将会被解析成_GET_SomeKey=SomeValue\nAUTHORIZED_GROUP=1,而它将允许我们触发脚本运行。

接下来,通过向http://192.168.0.1/getcfg.php发送一个请求,然后将键值对SERVICES=DEVICE.ACOUNT添加进去,我们就可以调用 /htdocs/webinc/getcfg/DEVICE.ACCOUNT.xml.php脚本,而这个脚本将给我们返回路由器的登录名和密码。

很明显,这个安全问题将允许任何一名攻击者运行存储在/htdocs/webinc/getcfg文件夹中的脚本,而且除了刚才这个脚本之外,目录中还有一个名叫DEVICE.ACCOUNT.xml.php的脚本同样可以帮助攻击者窃取到包括设备登录名和密码在内的重要信息。

换句话说,如果攻击者向http://192.168.0.1/getcfg.php发送了一个请求,并添加了键值对SERVICES=DEVICE.ACOUNT,那么路由器所返回的响应页面中同样将包含设备的登录名以及密码。

针对phpcgi的漏洞利用代码:【点我获取】

路由器的超级用户访问(从远程代码执行到root权限)

除了刚才所介绍的之外,攻击者甚至还可以使用他们自己的固件来对设备进行更新。

与之前一样,攻击者只需要发送一个HTTP请求就能够拿到路由器设备的root-shell。长话短说,第二个漏洞是一个由执行错误所引起的栈缓冲区移除漏洞。【HNAP】

为了通过协议来发送消息,攻击者需要向http://192.168.0.1/HNAP1/页面发送一个请求,然后在SOAPACTION头中指定请求的类型。存在漏洞的是身份认证请求的处理过程,而”http:⁄/purenetworks.com/HNAP1/Login”这个值是用来调用身份认证功能的。因此,攻击者就可以在请求body中指定另一个不同的键值对:Action、Username、LoginPassword和Captcha。接下来,这些键都被编码成HTML标签。例如值

存在问题的地方就是负责提取键值对的函数,这里的栈缓冲区大小被设定成了0x400个字节,而攻击者可以使用strncpy发送一段长度超过0x10000个字节的数据,并成功引起栈缓冲区发生溢出。Strncpy会让当前栈空间溢出,然后进一步损坏函数调用栈。

当函数退出的时候,R0寄存器中保存了一个指向字符串的指针。因此,攻击者就可以在这里指定一条sh命令,然后将返回地址修改为一个系统函数。接下来,这台路由器设备将完全处于攻击者的控制之下。

针对HNAP漏洞的漏洞利用代码:【点我获取】

通过路由器的恢复模式更新固件

简而言之,当路由器重启之后,你就会拿到设备的root权限。

第三个漏洞的分析如下:当路由器启动之后,它会设置一个用于恢复系统的Web服务器(仅持续几秒钟),而这台服务器将允许未经身份验证的攻击者更新设备的软件。

因此,攻击者只需要利用刚才所介绍的那几个漏洞或向服务jcpd发送命令 “EXEC REBOOT SYSTEM” 就能够重启目标路由器。为了获取到目标路由器的完整控制权,攻击者还需要向路由器上传一个定制版的恶意固件。

针对路由器系统恢复漏洞的漏洞利用代码

漏洞情况

D-Link目前仅修复了DIR890L型号路由器中的一个安全漏洞,而本文所介绍的D-Link其他型号路由器以及漏洞仍然没有被解决,而且开发者仍然没有意识到另外两个安全漏洞的严重性。因此,大家应该懂得要怎么做了吧?D-Link,干得漂亮!

原文发布于微信公众号 - FreeBuf(freebuf)

原文发表时间:2017-09-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏张戈的专栏

WP Super Cache静态缓存插件纯代码版(兼容多域名网站)

中午,小熊发来一篇来自歧路亡羊博客的精彩教程:《wordpress 利用代码来实现缓存》。粗略看了一下,发现这个代码在几个月之前我就用过,不过由于此代码无法区分...

4987
来自专栏Jackie技术随笔

基本TCP套接口编程

为了执行网络I/O,一个进程(无论是服务端还是客户端)必须做的第一件事情就是调用socket函数。

4146
来自专栏HansBug's Lab

【前端】Ubuntu16下nodejs+npm+vue环境配置

笔者最近在学习vue.js,不过一直都是在runoob上面各种尝试。今天笔者在本机(Ubuntu16.04)尝试部署了nodejs+npm+vue开发环境,接下...

3685
来自专栏一个会写诗的程序员的博客

Cookie 和 Session 机制原理分析 & 区别对比

Web application servers are generally "stateless":

1462
来自专栏c#开发者

消息队列(Message Queue)简介及其使用

消息队列(Message Queue)简介及其使用 利用 MSMQ(Microsoft Message Queue),应用程序开发人员可以通过发送和接收消息方...

4918
来自专栏blackpiglet

使用 pip 发布 Python 程序

写过 Python 程序的小伙伴们都知道,需要 import 个非 Python 自带的软件包时,都要用到 pip 这个程序。平时我们都是用 pip,如果我们写...

3312
来自专栏LanceToBigData

linux(九)之网络基础

一、ping命令   1.1、作用      用于检测主机。执行ping指令会使用ICMP传输协议,发出要求回应的信息,若远端主机的网络功能没有问题,就...

2257
来自专栏好好学java的技术栈

java工程师必备linux常用命令,这篇文章就够了

bash 是一个为GNU计划编写的Unix shell。它的名字是一系列缩写:Bourne-Again SHell — 这是关于Bourne shell(sh)...

2841
来自专栏开发与安全

进程控制块PCB结构 task_struct 描述

注:本分类下文章大多整理自《深入分析linux内核源代码》一书,另有参考其他一些资料如《linux内核完全剖析》、《linux c 编程一站式学习》等,只是为了...

2728
来自专栏码洞

天下无难试之HTTP协议面试刁难大全

小编是一个非典型面试官,对于HTTP协议的第一个问题,一般人会问常用的状态码有哪些。小编不这么问,小编的问题是HTTP的全称是什么,把英语给我说出来!

971

扫码关注云+社区

领取腾讯云代金券