在这篇文章中,我们将跟大家讨论我们在几台顶级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=AUTHORIZED_GROUP=1这个值来添加一个键。这个键将会被解析成_GET_SomeKey=SomeValuenAUTHORIZED_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,干得漂亮!