DIR-815栈溢出漏洞复现
字数 1660 2025-08-30 06:50:11
DIR-815栈溢出漏洞复现与分析
1. 漏洞概述
D-Link DIR-815路由器存在一个栈溢出漏洞(CNVD-2013-11625),该漏洞存在于hedwig.cgi组件中,影响DIR-815/300/600/645等多个型号。漏洞源于对Cookie中uid参数的处理不当,导致可以触发栈溢出并最终实现远程代码执行。
2. 环境准备
2.1 工具准备
-
固件分析工具:
- binwalk: 用于固件解包
- IDA Pro 9.0: 用于逆向分析
- MIPSROP插件: 用于查找ROP gadget
-
调试工具:
- qemu: 用于模拟MIPS环境
- gdb-multiarch: 用于调试
- gdbserver: 用于远程调试
2.2 固件获取与解包
binwalk -Me DIR815_firmware.bin
解包后会得到squashfs-root目录,其中包含路由器的文件系统。
3. 漏洞分析
3.1 漏洞定位
漏洞位于/htdocs/cgibin二进制文件中的hedwig.cgi组件。通过分析发现:
- 程序通过
getenv检查环境变量 - 检查是否为POST请求
- 调用
cgibin_parse_request函数处理请求
3.2 关键漏洞点
漏洞核心在sess_get_uid函数中:
- 获取HTTP_COOKIE环境变量
- 检查cookie名是否为"uid"
- 提取"uid="后的内容到缓冲区
- 缓冲区大小仅0x400字节,但未做长度限制
3.3 利用条件
成功利用需要满足两个条件:
/var/tmp/temp.xml文件存在haystack指针不为NULL
4. 漏洞利用
4.1 利用思路
- 通过构造超长uid参数触发栈溢出
- 控制程序执行流
- 需要确保程序能正常执行到ROP链
4.2 两种利用方式
方式一:设置CONTENT_TYPE
CONTENT_TYPE=application/x-www-form-urlencoded
这种方式会:
- 使
sub_409A6C处理请求数据 - 确保
haystack不为空 - 需要设置REQUEST_URI和CONTENT_LENGTH环境变量
方式二:任意CONTENT_TYPE
只需设置POST传参,其他参数无需控制:
- 避免进入
sub_402FFC - 最终进入
sub_403794->cgibin_print_http_status - 栈溢出偏移不同但同样可利用
4.3 ROP链构造
使用MIPSROP插件查找合适的gadget,考虑:
- 寄存器控制
- 栈布局
- 系统调用构造
5. 复现环境搭建
5.1 QEMU用户态模拟
# 启动调试
cyclic 2000 > payload
gdb-multiarch -x mygdb.sh
5.2 QEMU系统态模拟
步骤1:下载内核和镜像
从Index of /~aurel32/qemu/mipsel获取
步骤2:创建网桥
- 安装依赖:
apt-get install bridge-utils uml-utilities
- 修改网络配置:
sudo cp /etc/network/interfaces /etc/network/interfaces.brk
sudo vim /etc/network/interfaces
- 创建
/etc/qemu-ifup并添加内容:
#!/bin/sh
echo "Executing /etc/qemu-ifup"
echo "Bringing $1 for bridged mode..."
/sbin/ifconfig $1 0.0.0.0 promisc up
echo "Adding $1 to br0..."
/usr/sbin/brctl addif br0 $1
sleep 2
- 创建
/etc/qemu/bridge.conf:
allow br0
- 重启系统
步骤3:配置QEMU网络
- 修改
/etc/network/interfaces,将eth0改为eth1 - 启用接口:
ifup eth1
- 检查网络连通性
步骤4:启动环境
- 将
squashfs-root传到QEMU虚拟机的/root目录 - 创建
http_conf文件启动HTTP服务
6. 漏洞复现
6.1 本地调试
- 使用gdbserver在QEMU中启动服务:
./gdbserver.mipsel 0.0.0.0:1234 ./htdocs/web/cgibin
- 使用gdb-multiarch连接调试
6.2 远程攻击
方法一:上传payload
- 生成payload
- 通过scp上传到QEMU虚拟机
- 设置环境变量触发漏洞
方法二:发送HTTP报文
构造恶意HTTP请求,包含超长uid cookie触发漏洞
7. 参考链接
- DIR-815 栈溢出漏洞(CNVD-2013-11625)复现-先知社区
- 从零到一:复现 DIR-815 栈溢出漏洞
- [D-Link DIR-815路由器溢出漏洞分析](ZIKH26's Blog)
8. 注意事项
- 退出仿真环境时执行
fini.sh脚本,避免下次启动问题 - 若忘记退出导致问题,需重新下载内核和镜像
- 虚拟桥接网络可保持开启,如需关闭需重新配置