我是如何反编译DLink路由器固件程序并发现它的后门的.docx
- 文档编号:25228179
- 上传时间:2023-06-06
- 格式:DOCX
- 页数:8
- 大小:181.05KB
我是如何反编译DLink路由器固件程序并发现它的后门的.docx
《我是如何反编译DLink路由器固件程序并发现它的后门的.docx》由会员分享,可在线阅读,更多相关《我是如何反编译DLink路由器固件程序并发现它的后门的.docx(8页珍藏版)》请在冰豆网上搜索。
我是如何反编译DLink路由器固件程序并发现它的后门的
我是如何反编译D-Link路由器固件程序并发现它的后门的
OK,又是周末晚上,没有约会,只有一大瓶Shasta汽水和全是快节奏的音乐…那就研究一下程序吧。
一时兴起,我下载了D-link无线路由器(型号:
DIR-100revA)的固件程序v1.13。
使用工具Binwalk,很快的就从中发现并提取出一个只读SquashFS文件系统,没用多大功夫我就将这个固件程序的webserver(/bin/webs)加载到了IDA中:
/bin/webs中的字符信息
基于上面的字符信息可以看出,这个/bin/webs二进制程序是一个修改版的thttpd,提供路由器管理员界面操作功能。
看起来是经过了台湾明泰科技(D-Link的一个子公司)的修改。
他们甚至很有心计的将他们很多自定义的函数名都辅以“alpha”前缀:
明泰科技的自定义函数
这个alpha_auth_check函数看起来很有意思!
这个函数被很多地方调用,最明显的一个是来自alpha_httpd_parse_request函数:
调用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是一个指向一个数据结构体的指针
我们现在可以模拟出alpha_auth_check函数和数据结构体的大概样子:
structhttp_request_t
{
charunknown[0xB8];
char*url;//Atoffset0xB8intothedatastructure
};
intalpha_auth_check(structhttp_request_t*request);
alpha_auth_check本身是一个非常简单的函数。
它会针对http_request_t结构体里的一些指针进行字符串strcmp比较操作,然后调用check_login函数,实际上就是身份验证检查。
如果一旦有字符串比较成功或check_login成功,它会返回1;否者,它会重定向浏览器到登录页,返回-1;
alpha_auth_check函数代码片段
这些字符串比较过程看起来非常有趣。
它们提取请求的URL地址(在http_request_t数据结构体的偏移量0xB8处),检查它们是否含有字符串“graphic/”或“public/”。
这些都是位于路由器的Web目录下的公开子目录,如果请求地址包含这样的字符串,这些请求就可以不经身份认证就能执行。
然而,这最后一个strcmp却是相当的吸引眼球:
alpha_auth_check函数中一个非常有趣的字符串比较
这个操作是将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函数赋值的:
检查HTTP头信息中的User-Agent值
将http_request_t+0xD0指针指向头信息User-Agent字符串
这代码实际上就是:
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函数的结构:
#defineAUTH_OK1
#defineAUTH_FAIL-1
intalpha_auth_check(structhttp_request_t*request)
{
if(strstr(request->url,"graphic/")||
strstr(request->url,"public/")||
strcmp(request->user_agent,"xmlset_roodkcableoj28840ybtide")==0)
{
returnAUTH_OK;
}
else
{
//Theseargumentsareprobablyuser/passorsessioninfo
if(check_login(request->0xC,request->0xE0)!
=0)
{
returnAUTH_OK;
}
}
returnAUTH_FAIL;
}
换句话说,如果浏览器的User-Agent值是“xmlset_roodkcableoj28840ybtide”(不带引号),你就可以不经任何认证而能访问web控制界面,能够查看/修改路由器的设置(下面是D-Link路由器(DI-524UP)的截图,我没有DIR-100型号的,但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”——editby04882joelbackdoor_teslmx,这个后门的作者真是位天才!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 我是 如何 反编译 DLink 路由器 程序 发现 后门
![提示](https://static.bdocx.com/images/bang_tan.gif)