2021 年 10 月 7 日,ASUS 发布了针对 RT-AX56U 等路由器的固件更新,其中修复了一个敏感信息泄露漏洞,本文对此漏洞简单分析。
固件下载链接:RT-AX56U|无线路由器|ASUS 中国,受影响固件为 3.0.0.4.386.44266 及更早版本。
我们以 3.0.0.4.386.44266 为例进行分析,环境准备等操作可参考前文。
目标二进制程序:/usr/sbin/httpd,这个程序负责解析设备收到的 web 请求。
Asus 在其路由器中使用了一些开源组件,为了遵守 GPL 开源协议,Asus 曾在其官方网站上公开了相关源代码,后续的梅林固件就是基于这份源代码进行开发,我们可以参考梅林的源代码辅助分析。
通过源代码在 IDA 中定位到 sub_19644 函数,此函数用于解析用户传入的 HTTP 请求,这个函数逻辑较多,但其基本解析流程为:收到请求,进行简单的逐行解析,然后获取 URI 字段,过滤掉可能的路径穿越字符串,之后分别匹配三个 URI 对照表,判断当前请求的 URI 是否需要身份验证,以及获取对应接口的 handler 函数。
我们可以在 mime_handlers 全局结构体中找到相关接口定义,根据源代码相关信息,利用以下 IDAPython 脚本提取所有无需身份验证的接口
1 | def get_str(address): |
分析接口逻辑,当访问 .htm 等静态资源时,会执行 sub_1C3B8 函数,代码片段1:
1 | v5 = cgi_get_0("current_lang", v78, v4); |
由于需要支持多语言,这段代码会尝试获取用户提交的 current_lang 参数,然后传入 sub_1B420 函数,代码片段2:
1 | int __fastcall sub_1B420(const char *current_lang, _DWORD *a2) |
首先将 current_lang 拼接到变量 v18 中,这里使用的是 snprintf,长度 0x10,默认会以 .dict 结尾,然后根据文件路径打开对应文件,读取其中的内容作为基本语料。
如果用户提交一个长度刚好等于 15 字节的数据,那么 .dict 就会被冲洗掉,后面可以打开任意文件作为基本语料,当静态内容输出时,会将这里打开的文件内容输出。(但是只能输出第一行)
所以我们可以构造类似如下的请求
1 | GET /error_page.htm?current_lang=/////etc/shadow HTTP/1.1 |
当此请求发送到存在漏洞的设备之后,就可以泄露出管理员用户的密码信息
- 本文作者: CataLpa
- 本文链接: https://wzt.ac.cn/2021/12/01/asus-info-disclosure/
-
版权声明:
本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。