admin 管理员组

文章数量: 887007

本文讲的是 在一款D-Link消费级路由器上,我发现了10个严重漏洞近期,信息安全研究员皮埃尔·金(Pierre·Kim)公开了D-Link DIR 850L消费级无线路由器存在的10个严重漏洞。

此次公开的D-Link漏洞涉及多方面问题,如缺乏对固件映像的适当保护机制,意味着黑客可以向目标设备注入包含后门的恶意拷贝,以及D-Link私有的mydlink云协议中的漏洞。皮埃尔·金还发现了远程代码执行漏洞、默认密钥,以及DDoS(分布式拒绝服务攻击)风险。其他风险还包括跨站脚本攻击(XSS)、明文存储密码,以及LAN后门等。

皮埃尔·金总结:“D-Link 850L是一款设计糟糕的路由器,存在大量漏洞。从LAN到WAN,所有一切都存在问题。”

一、固件映像缺乏保护

Dlink 850 LrevA的最新固件(DIR850L_REVA_FW114WWb07_h2ab_beta1.bin)不受保护,黑客可以伪造最新固件的映像。

Dlink850LrevB的最新固件映像(DIR850LB1_FW207WWb05.bin、DIR850L_REVB_FW207WWb05_h1ke_beta1.bin和DIR850LB1FW208WWb02.bin)是带有硬编码密码。

以下是一个解密的固件映像的程序:

/* 
 * Simple tool to decrypt D-LINK DIR-850L REVB firmwares 
 *
 * $ gcc -o revbdec revbdec.c
 * $ ./revbdec DIR850L_REVB_FW207WWb05_h1ke_beta1.bin wrgac25_dlink.2013gui_dir850l > DIR850L_REVB_FW207WWb05_h1ke_beta1.decrypted
 */

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define USAGE "Usage: decimg <filename> <key>\n"

int main(int    argc,
         char   **argv)
{
        int     i, fi;
        int     fo = STDOUT_FILENO, fe = STDERR_FILENO;

        if (argc != 3)
        {
                write(fe, USAGE, strlen(USAGE));
                return (EXIT_FAILURE);
        }

        if ((fi = open(argv[1], O_RDONLY)) == -1)
        {
                perror("open");
                write(fe, USAGE, strlen(USAGE));
                return (EXIT_FAILURE);
        }

        const char *key = argv[2];
        int kl = strlen(key);

        i = 0;
        while (1)
        {
                char buffer[4096];
                int j, len;
                len = read(fi, buffer, 4096);
                if (len <= 0)
                        break;
                for (j = 0; j < len; j++) {
                        buffer[j] ^= (i + j) % 0xFB + 1;
                        buffer[j] ^= key[(i + j) % kl];
                }
                write(fo, buffer, len);
                i += len;
        }

       return (EXIT_SUCCESS);
}

你可以使用这个程序来解密固件映像:

user@kali:~/petage-dlink$ ./revbdec DIR850L_REVB_FW207WWb05_h1ke_beta1.bin wrgac25_dlink.2013gui_dir850l > DIR850L_REVB_FW207WWb05_h1ke_beta1.decrypted
user@kali:~/petage-dlink$ binwalk DIR850L_REVB_FW207WWb05_h1ke_beta1.decrypted

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
0             0x0             DLOB firmware header, boot partition: "dev=/dev/mtdblock/1"
593           0x251           LZMA compressed data, properties: 0x88, dictionary size: 1048576 bytes, uncompressed size: 65535 bytes
10380         0x288C          LZMA compressed data, properties: 0x5D, dictionary size: 8388608 bytes, uncompressed size: 5184868 bytes
1704052       0x1A0074        PackImg section delimiter tag, little endian size: 10518016 bytes; big endian size: 8298496 bytes
1704084       0x1A0094        Squashfs filesystem, little endian, version 4.0, compression:lzma, size: 8296266 bytes, 2678 inodes, blocksize: 131072 bytes, created: 2017-01-20 06:39:29

所以说,固件映像的保护是不存在的。

二、跨站脚本攻击(XSS)

只需通过分析/htdocs/web上的PHP文件,就可以发现一些易受攻击的XSS。

黑客可以使用XSS攻击,经过用户的身份验证,以便窃取身份验证cookie。

/htdocs/web/wpsacts.php:

user@kali:~/petage-dlink$ wget -qO- --post-data='action=<a>' http://ip:port/wpsacts.php
<?xml version="1.0" encoding="utf-8"?>
<wpsreport>
        <action><a></action>
        <result></result>
        <reason></reason>
</wpsreport>


user@kali:~/petage-dlink$ cat ./fs/htdocs/web/wpsacts.php
[..]
<wpsreport>
        <action><?echo $_POST["action"];?></action>
[...]

/htdocs/web/shareport.php里的XSS:

[...]
         <action><?echo $_POST["action"];?></action>
[...]

/htdocs/web/sitesurvey.php里的XSS:

[...]
        <action><?echo $_POST["action"];?></action>
[...]

/htdocs/web/wandetect.php里的XSS:

[...]
   <action><?echo $_POST["action"];?></action>
[...]

/htdocs/web/wpsacts.php里的XSS:

[...]
   <action><?echo $_POST["action"];?></action>
[...]

三、mydlink云协议中的漏洞

黑客可以使用自定义的mydlink云协议获得完整的访问权限。

http://ip_of_router/register_send.php不检查用户的身份验证,因此黑客可以滥用此网页来获得对设备的控制,此网页用于将设备注册到myDlink云基础设施。

黑客将使用未经验证的/register_send.php网页来进行:

1.创建MyDlink云帐户;

2.在设备上注册这个账号;

3.将设备添加到这个帐户,这样设备将通过管理密码进入到云平台,同时这意味着密码以明文存储。

首先,黑客将使用Firefox50访问Dlink登录页https://www.mydlink/entrance,黑客会利用该网页远程控制设备(比如通过重新启动)。不过要注意的是,Firefox50要安装官方的DlinkNPAPI扩展。

其次,使用Firefox开发工具,黑客可以分析来自www.mydlink上的Dlinkapi的默认HTTP请求或响应。因为在默认情况下,Dlink云接口将在PUT请求的响应中泄漏设备的密码。仅仅通过看NPAPI插件的HTTP请求,api就可以在明文中找到设备的密码。

最后,NPAPI插件会自动建立一个路由器和Firefox浏览器之间的通道,这样,黑客就可以访问http://127.0.0.1:dynamicaly_generated_remote_port/控制远程路由器。流量将直接进入亚马逊服务器,然后到达远程Dlink路由器::

Firefox NPAPI client (http://127.0.0.1:remote_port/)   ->    Amazon   ->    Dlink 850L HTTP Interface.

黑客将使用来自Dlink api的legitHTTPS响应提供的前一个密码,并能够在路由器内登录。此时,黑客就完成了对路由器的完全控制。

这是通过在Amazon服务器上创建一个TCP通道的signalc程序(/mydlink/内部)实现的。

驻留在http://ip_of_router/register_send.php的PHP脚本,将充当黑客和远程Dlinkapi之间的代理,此页面还将检索密码(它存储在cleartext中)并将其发送到远程Dlink api。

151 $devpasswd = query("/device/account/entry/password"); <- $devpasswd contains the password
152 $action = $_POST["act"];                                 of the device

密码将在设备的关联中发送(第三个请求:adddev)到Mydlink云服务(见&device_password=$devpasswd):

178 //sign up
179 $post_str_signup = "client=wizard&wizard_version=" .$wizard_version. "&lang=" .$_POST["lang"].
180                    "&action=sign-up&accept=accept&email=" .$_POST["outemail"]. "&password=" .$_POST["passwd"].
181                    "&password_verify=" .$_POST["passwd"]. "&name_first=" .$_POST["firstname"]. "&name_last=" .$_POST["lastname"]." ";
182 
183 $post_url_signup = "/signin/";
184 
185 $action_signup = "signup";
186 
187 //sign in       
188 $post_str_signin = "client=wizard&wizard_version=" .$wizard_version. "&lang=" .$_POST["lang"].
189             "&email=" .$_POST["outemail"]. "&password=" .$_POST["passwd"]." ";
190 
191 $post_url_signin = "/account/?signin";
192 
193 $action_signin = "signin";
194 
195 //add dev (bind device)
196 $post_str_adddev = "client=wizard&wizard_version=" .$wizard_version. "&lang=" .$_POST["lang"].
197             "&dlife_no=" .$mydlink_num. "&device_password=" .$devpasswd. "&dfp=" .$dlinkfootprint." ";
198 
199 $post_url_adddev = "/account/?add";
200 
201 $action_adddev = "adddev";
202 
203 //main start
204 if($action == $action_signup)                    <---- first request
205 {
206         $post_s

本文标签: 路由 漏洞 发现了 器上 LINK