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

现在再发一个路由器制造商——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语言解析这段代码的话是这样的:

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

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

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

router06

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

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

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

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

router04

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

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

router02

破解WPS的PIN

router01

开启telnetd获取根权限

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

1 收藏 评论

关于作者:TonyRideBike

东北银在广州,新浪微博:@T0ny_Lyu 个人主页 · 我的文章 · 3

相关文章

可能感兴趣的话题



直接登录
跳到底部
返回顶部