看我如何反编译D-Link路由器固件程序并发现其后门

|路由器资讯   |

【www.xinr41319.cn--路由器资讯】

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

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

120131022091627

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

220131022091642

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

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

320131022091701

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

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

420131022091716

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


    struct http_request_t  {      char unknown[0xB8];      char *url; // At offset 0xB8 into the data structure  };     int alpha_auth_check(struct http_request_t *request); 

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

520131022091922

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

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

620131022091938

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

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

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

720131022091953

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

820131022092009

920131022092023

这代码实际上就是:


    if(strstr(header, "User-Agent:") != NULL)  {      http_request_t->0xD0 = header + strlen("User-Agent:") + strspn(header, " \t");  } 

知道了http_request_t偏移量0xD0处的指针指向User-Agent头信息,我们可以推测出alpha_auth_check函数的结构:


    #define AUTH_OK 1  #define AUTH_FAIL -1     int alpha_auth_check(struct http_request_t *request)  {      if(strstr(request->url, "graphic/") ||         strstr(request->url, "public/") ||         strcmp(request->user_agent, "xmlset_roodkcableoj28840ybtide") == 0)      {          return AUTH_OK;      }      else      {          // These arguments are probably user/pass or session info          if(check_login(request->0xC, request->0xE0) != 0)          {              return AUTH_OK;          }      }         return AUTH_FAIL;  } 

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

1020131022092040

基于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,这个后门的作者真是位天才!


d-link路由器初始密码 d-link路由器登录密码

本文来源:http://www.xinr41319.cn/luyouqizixun/5279/

    热门推荐
    • H3C ER2100-CN宽带路由器 掌控你的网络

      H3C SMB-ER2100-CN宽带路由器到货新疆电脑市场,报价1100元。H3C SMB-ER2100-CN宽带路由器采用64位网络处理器,同时配合DDR路由器资讯

    • 腾达路由器前面板后面板功能介绍

      前面板:sR9中国路由网W300D前面板有9个指示灯,通过观察它们的状态,可以判断设备工作是否正常,各指示灯状态说明如下:sR9中国路由网 sR9中国路由网路由器资讯

    • 没使用路由器—如何建立宽带连接上网

      相信有很多网通(现在为联通)用户现在还在使用网通(联通)的“宽带我世界”客户端,我就是讨厌这软件,看着它就烦。另外有很多用户不会下载它的路由器资讯

    • 玩转家用路由器 如何防止无线信号蹭网

      随着wifi走进千家万户,人们对于无线环境的以来也随之加深。现在几乎所有的智能手机、笔记本和平板电脑都具有wifi功能。这也促进了家用路由器市场的改革,一大批路由器资讯

    • 水星路由器的使用方法

      一般在某个时间段,我们需要限制对外网某些网站的访问或限制某些需要域名解析成功后才能和外网通信的应用程序,这时便需要用到域名过滤功能。下面,我们就来看看使用方法路由器资讯

    • 思科认证辅导:路由器RIP动态路由配置阿

      为了方便广大考生更好的复习,小编编辑整理提供了思科认证辅导:路由器RIP动态路由配置阿,以供各位考生考试复习参考,希望对考生复习有所帮助。路由器RIP动态路由配路由器资讯

    • TP-link路由器防火墙设置技巧

      路由器防火墙应用举例—(1) IP地址过滤的使用IP地址过滤用于通过IP地址设置内网主机对外网的访问权限,适用于这样的需求:在某个时间段,禁止 允许路由器资讯

    • 测试:IPv6在边缘路由器上的部署正实现

      美国新罕布什尔州大学互操作性实验室(UNH-IOL)近日进行了第三次IPv6客户边缘路由互操作性测试。这一测试将边缘路由设备的用户与供应商关联起来,目的是对符路由器资讯