查看: 5257|回复: 18
收起左侧

[讨论] 我是如何反编译D-Link路由器固件程序并发现其后门

[复制链接]
伤_END
发表于 2013-10-27 20:48:43 | 显示全部楼层 |阅读模式
本帖最后由 伤_END 于 2013-10-29 08:03 编辑

竟然没注意到防盗链!换链接了。
转载自:伯乐网
原文出处: devttys0   译文出处: 外刊IT评论

OK,又是周末晚上,没有约会,只有一大瓶Shasta汽水和全是快节奏的音乐…那就研究一下程序吧。

一时兴起,我下载了D-link无线路由器(型号:DIR-100 revA)的固件程序 v1.13。使用工具Binwalk,很快的就从中发现并提取出一个只读SquashFS文件系统,没用多大功夫我就将这个固件程序的web server(/bin/webs)加载到了IDA中:



基于上面的字符信息可以看出,这个/bin/webs二进制程序是一个修改版的thttpd,提供路由器管理员界面操作功能。看起来是经过了台湾明泰科技(D-Link的一个子公司)的修改。他们甚至很有心计的将他们很多自定义的函数名都辅以“alpha”前缀:



这个alpha_auth_check函数看起来很有意思!

这个函数被很多地方调用,最明显的一个是来自alpha_httpd_parse_request函数:



我们可以看到alpha_auth_check函数接收一个参数(是存放在寄存器$s2里);如果alpha_auth_check返回-1(0xFFFFFFFF),程序将会跳到alpha_httpd_parse_request的结尾处,否则,它将继续处理请求。

寄存器$s2在被alpha_auth_check函数使用前的一些操作代码显示,它是一个指向一个数据结构体的指针,里面有一个char*指针,会指向从HTTP请求里接收到的各种数据;比如HTTP头信息和请求地址URL:



我们现在可以模拟出alpha_auth_check函数和数据结构体的大概样子:
  1. struct http_request_t
  2. {
  3.     char unknown[0xB8];
  4.     char *url; // At offset 0xB8 into the data structure
  5. };

  6. int alpha_auth_check(struct http_request_t *request);
复制代码
alpha_auth_check本身是一个非常简单的函数。它会针对http_request_t结构体里的一些指针进行字符串strcmp比较操作,然后调用check_login函数,实际上就是身份验证检查。如果一旦有字符串比较成功或check_login成功,它会返回1;否者,它会重定向浏览器到登录页,返回-1;



这些字符串比较过程看起来非常有趣。它们提取请求的URL地址(在http_request_t数据结构体的偏移量0xB8处),检查它们是否含有字符串“graphic/” 或 “public/”。这些都是位于路由器的Web目录下的公开子目录,如果请求地址包含这样的字符串,这些请求就可以不经身份认证就能执行。

然而,这最后一个strcmp却是相当的吸引眼球:



这个操作是将http_request_t结构体中偏移量0xD0的字符串指针和字符串“xmlset_roodkcableoj28840ybtide”比较,如果字符匹配,就会跳过check_login函数,alpha_auth_check操作返回1(认证通过)。

我在谷歌上搜索了一下“xmlset_roodkcableoj28840ybtide”字符串,只发现在一个俄罗斯论坛里提到过它,说这是一个在/bin/webs里一个“非常有趣”的一行。我非常同意。

那么,这个神秘的字符串究竟是和什么东西进行比较?如果回顾一下调用路径,我们会发现http_request_t结构体被传进了好几个函数:



事实证明,http_request_t结构体中处在偏移量 0xD0处的指针是由httpd_parse_request函数赋值的:





这代码实际上就是:

  1. if(strstr(header, "User-Agent:") != NULL)
  2. {
  3.     http_request_t->0xD0 = header + strlen("User-Agent:") + strspn(header, " \t");
  4. }
复制代码
知道了http_request_t偏移量0xD0处的指针指向User-Agent头信息,我们可以推测出alpha_auth_check函数的结构:
  1. #define AUTH_OK 1
  2. #define AUTH_FAIL -1

  3. int alpha_auth_check(struct http_request_t *request)
  4. {
  5.     if(strstr(request->url, "graphic/") ||
  6.        strstr(request->url, "public/") ||
  7.        strcmp(request->user_agent, "xmlset_roodkcableoj28840ybtide") == 0)
  8.     {
  9.         return AUTH_OK;
  10.     }
  11.     else
  12.     {
  13.         // These arguments are probably user/pass or session info
  14.         if(check_login(request->0xC, request->0xE0) != 0)
  15.         {
  16.             return AUTH_OK;
  17.         }
  18.     }

  19.     return AUTH_FAIL;
  20. }
复制代码
换句话说,如果浏览器的User-Agent值是“xmlset_roodkcableoj28840ybtide”(不带引号),你就可以不经任何认证而能访问web控制界面,能够查看/修改路由器的设置(下面是D-Link路由器(DI-524UP)的截图,我没有 DIR-100型号的,但DI-524UP型号使用的是相同的固件):



基于HTML页上的源代码信息和Shodan搜索结果,差不多可以得出这样的结论:下面的这些型号的D-Link路由器将会受到影响:

DIR-100
DI-524
DI-524UP
DI-604S
DI-604UP
DI-604+
TM-G5240
除此之外,几款Planex路由器显然也是用的同样的固件程序:

BRL-04UR
BRL-04CW
你很酷呀,D-Link。

脚注:万能的网友指出,字符串“xmlset_roodkcableoj28840ybtide”是一个倒序文,反过来读就是“editby04882joelbackdoor_teslmx”——edit by 04882joel backdoor _teslmx,这个后门的作者真是位天才!
1.jpg

评分

参与人数 1人气 +1 收起 理由
x_3max + 1 感谢提供分享

查看全部评分

xinxin99
发表于 2013-10-27 20:58:08 | 显示全部楼层
图挂了吧?
xxqqwx
发表于 2013-10-27 20:58:36 | 显示全部楼层
图不支持外链,看不到。
mengld
发表于 2013-10-27 21:07:50 | 显示全部楼层
大部分网站的图都有反外链
建议以后上传
wanglei7865
发表于 2013-10-27 21:27:22 | 显示全部楼层
图片全挂了
lsh90
发表于 2013-10-27 21:29:29 | 显示全部楼层
图片全挂了
建议以后上传
clzacl
发表于 2013-10-27 22:00:13 | 显示全部楼层
图片全挂....
【乱】
发表于 2013-10-27 22:00:24 | 显示全部楼层
TP LINK路过~
Genes
发表于 2013-10-27 22:17:53 | 显示全部楼层
这事只有掉丝能干的出来,周围木有约会~~
http://www.freebuf.com/articles/wireless/14964.html
L.live
发表于 2013-10-27 22:36:05 | 显示全部楼层
貌似我没有D-link的路由器哦!
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

手机版|杀毒软件|软件论坛| 卡饭论坛

Copyright © KaFan  KaFan.cn All Rights Reserved.

Powered by Discuz! X3.4( 沪ICP备2020031077号-2 ) GMT+8, 2024-11-23 21:38 , Processed in 0.157834 second(s), 20 queries .

卡饭网所发布的一切软件、样本、工具、文章等仅限用于学习和研究,不得将上述内容用于商业或者其他非法用途,否则产生的一切后果自负,本站信息来自网络,版权争议问题与本站无关,您必须在下载后的24小时之内从您的电脑中彻底删除上述信息,如有问题请通过邮件与我们联系。

快速回复 客服 返回顶部 返回列表