对 D-Link 后门进行逆向工程

D-Link是常用于各种网络环境中的硬件品牌,今天我们对它进行后门逆向分析。

时间:2022年10月09日

对 D-Link 后门进行逆向工程

D-Link是常用于各种网络环境中的硬件品牌,今天我们对它进行后门逆向分析。

一时兴起,我为Dir-100 Reva下载了固件v1.13。Binwalk迅速找到并提取了Squashfs文件系统,很快我将固件的Web服务器(/bin/web)加载到IDA中:

/bin/webs中的字符串

基于上述字符串列表,/bin/web二进制是THTTPD的修改版本,为路由器提供管理界面。它似乎已通过Alphanetworks(D-Link的衍生)进行了修改。他们甚至足够深思,可以用字符串的“alpha”来准备许多自定义功能名称:

Alphanetworks的自定义功能

 

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表明它是一个指向数据结构的指针,其中包含指向接收到的HTTP请求的各个部分的char*指针,例如HTTP标头和请求的URL:

$s2是指向数据结构的指针

 

我们现在可以为alpha_auth_check并开始枚举数据结构的元素:

 

结构http_request_t

 {

 字符未知[0xB8];

 字符*url;//在数据结构的偏移量0xB8

 };

int alpha_auth_check(struct http_request_t*request);

 

alpha_auth_check本身是一个相当简单的函数。它针对http_request_t结构中的一些指针执行一些strstr和strcmp,然后调用check_login,这实际上是进行身份验证检查。如果调用任何strstr's/strcmp's或check_login成功,则返回1;否则,它将浏览器重定向到登录页面并返回-1:

alpha_auth_check代码片段

 

那些strstr看起来很有趣。他们获取请求的URL(在http_request_t数据结构的偏移量0xB8处,如前所述)并检查它是否包含字符串“graphic/”或“public/”。这些是设备web目录下的子目录,如果请求的URL包含这些字符串之一,则无需身份验证即可允许请求。

 

然而,它是最终的strcmp,它被证明更有说服力:

alpha_auth_check中一个有趣的字符串比较

 

之间执行strcmp http_request_t结构内偏移0xD0处的字符串指针和字符串“xmlset_roodkcableoj28840ybtide”如果字符串匹配,check_login函数调用并且alpha_auth_check返回1(身份验证OK)。

 

在谷歌上快速搜索“xmlset_roodkcableoj28840ybtide”字符串,几年前只找到一篇俄罗斯论坛的帖子,其中指出这是/bin/webs二进制文件中的一条“有趣的线”。我不得不同意。

 

那么,这个神秘的字符串与之相比是什么呢?如果我们回顾调用树,我们会看到http_request_t结构指针由几个函数传递:

事实证明,http_request_t结构中偏移量0xD0处的指针由httpd_parse_request函数填充:

检查用户代理HTTP标头

使用指向User-Agent标头字符串的指针填充http_request_t+0xD0

 

这段代码实际上是:

 

 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;

 }

 

换句话说,如果浏览器的用户代理字符串为“xmlset_roodkcableoj28840ybtide”(无引号),则无需任何身份验证即可访问web界面并查看/更改设备设置(显示了DI-524UP,因为我没有DIR-100,而DI-524BUP使用相同的固件):

访问DI-524UP的管理页面

 

根据HTML页面的源代码和一些Shodan搜索结果,可以合理得出以下D-Link设备可能受到影响:

●DIR-100

●DI-624S

●DI-524UP

●DI-604S

●DI-604UP

●DI-604+

●TM-G5240

 

此外,几个Planex路由器似乎也使用相同的固件:

●BRL-04UR

●BRL-04CW

 

原文地址:https://lcx.cc/post/3950/

销售专家

告诉我们您需要解决什么问题,我们的销售专家会帮助您找到最合适的解决方案。

周一至周五:9:00-20:30(北京时间)

咨询专业销售

咨询热线

在线咨询

限时折扣