当前位置: 首页 > 科技观察

看我如何反编译一个D-Link路由器固件程序并找到它的后门

时间:2023-03-21 23:24:47 科技观察

好吧,又是一个周末的晚上,没有约会,只有一大瓶Shasta苏打水和充满快节奏的音乐......然后研究程序.一时兴起,我下载了D-link无线路由器(型号:DIR-100revA)的固件v1.13。使用工具Binwalk,我很快找到并提取了一个只读的SquashFS文件系统。没费什么功夫,我就把这个固件程序的web服务器(/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函数和数据结构的大概样子:structhttp_request_t{charunknown[0xB8];char*url;//Atoffset0xB8intothedatastructure};intalpha_auth_check(structhttp_request_t*request);alpha_auth_checkitself是一个非常简单的函数。它会对http_request_t结构体中的一些指针进行字符串strcmp比较操作,然后调用check_login函数,这实际上是一个认证检查。如果任何字符串比较成功或check_login成功,则返回1;否则,它将浏览器重定向到登录页面并返回-1;这些字符串比较过程看起来很有趣。他们提取请求的URL地址(在http_request_t数据结构的偏移量0xB8处),检查它们是否包含字符串“graphic/”或“public/”。这些是位于路由器的web目录下的公共子目录,如果请求的URL包含这样的字符串,则可以在不进行身份验证的情况下执行请求。不过,最后这个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函数赋值的:这段代码其实是: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-1intalpha_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{//这些参数很可能是user/passorsessioninfoif(check_login(request->0xC,request->0xE0)!=0){returnAUTH_OK;}}returnAUTH_FAIL;}换句话说,如果浏览器的User-Agent值是“xmlset_roodkcableoj28840ybtide”(没有quotationmarks),无需任何身份验证即可访问Web控制界面,能够查看/修改路由器设置(以下是D-Link路由器(DI-524UP)的屏幕截图,我没有DIR-100型号,但DI-524UP型号使用相同的固件):基于HTML页面信息和Shod上的源代码搜索结果,可以得出以下型号的D-Link路由器会受到影响:DIR-100DI-524DI-524UPDI-604SDI-604UPDI-604+TM-G5240另外还有几款Planex路由器显然使用相同的固件程序:BRL-04URBRL-04CWYou'reCool,D-LinkFootnote:***有网友指出字符串“xmlset_roodkcableoj28840ybtide”是一个颠倒的文本,颠倒过来阅读“editby04882joelbackdoor_teslmx”——editby04882joelbackdoor_teslmx,这个后门的作者是个天才!原文链接:http://www.devttys0.com/2013/10/reverse-engineering-a-d-link-backdoor/翻译链接:http://blog.jobbole.com/49959/