• 沙里软件

  • ShaliSoft.com [手机站]   办公桌收纳抽屉
  • 首页
  • 博文
  • 演示
  • 管理
  • 反编译D-Link路由器固件程序并发现后门

    网络   2014/5/6 9:24:19

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

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

    Strings inside /bin/webs

    /bin/webs中的字符信息

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

    Alphanetworks' custom functions

    明泰科技的自定义函数

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

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

    Function call to alpha_auth_check

    调用alpha_auth_check函数

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

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

    $s2 is a pointer to a data structure

    $s2是一个指向一个数据结构体的指针

    我们现在可以模拟出alpha_auth_check函数和数据结构体的大概样子:

    1struct http_request_t
    2{
    3    char unknown[0xB8];
    4    char *url; // At offset 0xB8 into the data structure
    5};
    6
    7int alpha_auth_check(struct http_request_t *request);

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

    alpha_auth_check code snippet

    alpha_auth_check函数代码片段

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

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

    An interesting string comparison in alpha_auth_check

    alpha_auth_check函数中一个非常有趣的字符串比较

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

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

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

    call_graph

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

    Checks for the User-Agent HTTP header

    检查HTTP头信息中的User-Agent值

    Populates http_request_t + 0xD0 with a pointer to the User-Agent header string

    将http_request_t + 0xD0指针指向头信息User-Agent字符串

    这代码实际上就是:

    1if(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函数的结构:

    01#define AUTH_OK 1
    02#define AUTH_FAIL -1
    03
    04int alpha_auth_check(struct http_request_t *request)
    05{
    06    if(strstr(request->url, "graphic/") ||
    07       strstr(request->url, "public/") ||
    08       strcmp(request->user_agent, "xmlset_roodkcableoj28840ybtide") == 0)
    09    {
    10        return AUTH_OK;
    11    }
    12    else
    13    {
    14        // These arguments are probably user/pass or session info
    15        if(check_login(request->0xC, request->0xE0) != 0)
    16        {
    17            return AUTH_OK;
    18        }
    19    }
    20
    21    return AUTH_FAIL;
    22}

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

    Accessing the admin page of a DI-524UP

    访问型号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,这个后门的作者真是位天才!

    [英文原文: Reverse Engineering a D-Link Backdoor ]


    阅读(1075) 分享(0)

    上一篇: WIFI劫持流量劫持能有多大危害?
    下一篇: 使用外链图片的风险

  • 精彩推荐

    ◆ 服务器iis支持tls1.2,windows server 2008 r2 中IIS启用TLS 1.2(安装SSL后用TLS 1.2)
    ◆ 怎么判断银行卡号格式是否正确?
    ◆ 接口限流算法总结
    ◆ asp.net中Eval()、Bind()、<%%>、<%=%>比较有什么区别
    ◆ ASP.NET 获取上个月当前月的1号和月尾
    ◆ MySQL 百万级分页优化(Mysql千万级分页)
    ◆ FORM提交表单,数据由gb2312传到utf-8 乱码的解决方案.
    ◆ 程序员"偷懒"给软件带来安全隐患
    ◆ 如何防止被人肉?防人肉宝典——平时上网应该注意什么?
    ◆ Python识别网站验证码
  • 用心做事 不能唯利是图

    • 吊儿
    • 用QQ联系我17905772
  • 搜索


  • 最新文章

    • 导出Excel 格式 mso-number-format
    • 服务器iis支持tls1.2,windows server 2008 r2 中IIS启用TLS 1.2(安装SSL后用TLS 1.2)
    • MySQL配置优化
    • EditPlus 添加文件比较工具winmerge
    • 滚动悬浮固定JS特效

  • 热门文章

    • php sso单点登录实现代码
    • 中国菜刀(China chopper) 最新黑客工具
    • redis.conf中文版(基于2.4)
    • 搜索引擎名单大全
    • php图片上传类,支持加水印,生成略缩图

  • 最新图库


  • 最新评论


  • 友情链接

  • 沙里软件

  • 最近访客

    Powered by ShaliSoft.com 豫ICP备13008529号

    免责声明:本站部分内容来源于互联网,转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,不为其版权负责,也不构成任何其他建议。如果发现侵犯版权,联系QQ17905772进行删除。