行业解决方案查看所有行业解决方案
IDA 用于解决软件行业的关键问题。
发布时间:2022-10-09 17: 01: 45
D-Link是常用于各种网络环境中的硬件品牌,今天我们对它进行后门逆向分析。

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

基于上述字符串列表,/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:

那些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/
展开阅读全文
︾
读者也喜欢这些内容:
IDA Pro插件怎么安装 IDA Pro插件加载失败怎么解决
做逆向分析或自动化处理时,插件往往是把重复操作变成一键动作的关键入口。但插件安装位置放错、版本位数不匹配、依赖缺失,都会导致插件不出现在菜单里,或点击后无响应。围绕“放到哪里、如何被加载、哪里能看到报错”这三件事把流程跑通,后续换版本、迁移环境也会省掉很多排查时间。...
阅读全文 >
IDA怎么变成伪代码 IDA伪代码插件怎么用
在逆向分析过程中,阅读原始汇编指令对大多数分析人员而言既耗时又容易出错。为了更直观理解程序逻辑,IDA Pro提供了将二进制代码转换为伪C代码的功能,辅以伪代码插件的使用,可以极大提升阅读效率和逻辑理解能力。围绕“IDA怎么变成伪代码,IDA伪代码插件怎么用”,本文将详细介绍IDA Pro伪代码生成的步骤、插件配置方法实用技巧,帮助用户从基本功能到高级使用实现高效逆向分析。...
阅读全文 >
IDA怎么修改汇编指令 IDA修改汇编代码快捷键
在使用IDA Pro进行二进制逆向分析时,经常需要对反汇编得到的代码进行调整和编辑,例如修正误识别的指令、插入特定的跳转逻辑、或清除垃圾代码结构。由于IDA Pro本身具有强大的交互式反汇编能力,因此“IDA怎么修改汇编指令,IDA修改汇编代码快捷键”成为用户搜索频率较高的实操问题。本文将围绕这个话题,从修改步骤到操作技巧全面展开,帮助用户高效掌控IDA Pro的编辑能力。...
阅读全文 >
IDA Pro反汇编出现一大堆函数如何优化 IDA Pro的反汇编性能
在使用IDA Pro对可执行文件进行静态分析时,经常会遇到“函数爆炸”——IDA Pro自动识别出大量函数,而其中很多其实并不是真正的代码入口。这些伪函数不仅影响阅读效率,还严重拖慢IDA Pro的分析性能。要搞清楚“IDA Pro反汇编出现一大堆函数如何优化IDA Pro的反汇编性能”,就必须深入理解IDA的工作机制,并对常见问题有针对性地进行处理。...
阅读全文 >