DIR-815 栈溢出漏洞
字数 1538 2025-08-29 22:41:24
DIR-815 栈溢出漏洞分析与复现指南
1. 漏洞概述
DIR-815路由器中的hedwig.cgi组件存在栈溢出漏洞,该漏洞位于/htdocs/web/hedwig.cgi(实际是/htdocs/cgibin的软链接)中。漏洞源于sess_get_uid函数处理用户可控的cookie值时,使用sprintf进行格式化输出时未进行长度检查,导致栈缓冲区溢出。
2. 环境准备
2.1 复现环境
- 操作系统:Ubuntu 22.04 TLS
- 工具需求:
- binwalk(固件分离)
- IDA Pro(逆向分析)
- QEMU(用户模式和系统模式模拟)
- gdb-multiarch(调试)
2.2 固件分析
- 使用binwalk分离固件:
binwalk -Me DIR815_FIRMWARE.bin - 定位漏洞文件:
/htdocs/web/hedwig.cgi→ 软链接到/htdocs/cgibin- 对
cgibin进行逆向分析
3. 漏洞分析
3.1 漏洞触发路径
- 请求方式:POST请求
- 关键函数调用链:
main → hedwigcgi_main → cgibin_parse_request → sess_get_uid
3.2 关键漏洞点
-
sess_get_uid函数:- 从环境变量获取cookie值
- 解析格式:
uid=用户可控值 - 对
=后的值(v4)进行sprintf格式化输出到固定大小(0x400)的栈缓冲区
-
溢出条件:
- 用户可控的v4长度超过0x400字节
- 绕过两个关键检查:
/var/tmp/目录存在- POST请求内容不为空
3.3 绕过检查
- 目录检查:
- 在测试环境中创建
/var/tmp/目录
- 在测试环境中创建
- POST内容检查:
- 确保POST请求包含有效内容
- 使用
application/x-www-form-urlencoded格式
4. MIPS架构特性
4.1 函数调用约定
- 非叶子函数:返回地址保存在栈中
- 叶子函数:返回地址保存在
$ra寄存器 - 参数传递:
- 前4个参数:
$a0-$a3 - 额外参数:通过栈传递
- 前4个参数:
4.2 分支延迟槽
- MIPS的流水线效应导致跳转指令的下一条指令会先执行
- 例如:
jalr $t9 move $a2, $t2 # 这条指令会在跳转前执行
5. 漏洞利用
5.1 偏移计算
- 使用cyclic模式确定偏移:
- 发送cyclic长度为0x1000的payload
- 通过gdb查看崩溃时的PC值
- 计算偏移:
cyclic -l [PC值]→ 结果为1009字节
5.2 ROP链构造
-
寻找gadget的注意事项:
- 避免包含
\x00字节(会被sprintf截断) - 常用gadget类型:
- 寄存器控制:
move $a0, $sX - 栈控制:
lw $a0, X($sp) - 系统调用:
jalr $t9
- 寄存器控制:
- 避免包含
-
libc基地址定位:
- 通过
memest等函数的GOT表项确定 - 用户模式下使用
vmmap查看 - 系统模式下使用gdbserver附加调试
- 通过
-
system函数处理:
- 直接地址可能包含
\x00→ 使用system-1地址配合加1gadget
- 直接地址可能包含
6. 复现方法
6.1 用户模式复现
- 使用QEMU用户模式模拟:
qemu-mipsel -L ./extracted_fs ./htdocs/cgibin - 发送精心构造的HTTP请求:
- 包含超长cookie值(
uid=AAAA...) - 确保POST方法和内容正确
- 包含超长cookie值(
6.2 系统模式复现
-
准备环境:
- 下载Debian MIPS镜像和内核
- 配置网络桥接:
sysctl -w net.ipv4.ip_forward=1 apt-get install bridge-utils uml-utilities
-
启动脚本示例:
#!/bin/bash qemu-system-mipsel -M malta -kernel vmlinux-3.2.0-4-4kc-malta \ -hda debian_squeeze_mipsel_standard.qcow2 \ -append "root=/dev/sda1 console=tty0" \ -net nic -net tap,ifname=tap0,script=no,downscript=no \ -nographic -
文件传输:
scp -o HostkeyAlgorithms=ssh-rsa payload root@qemu_ip:/tmp -
HTTP服务启动:
- 在QEMU虚拟机中启动web服务
- 从外部发送恶意请求
7. 参考资源
- 原始漏洞报告和分析
- MIPS架构手册
- QEMU模拟器文档
- 相关安全社区讨论(看雪、先知等)
8. 注意事项
- 调试时注意MIPS架构特性
- 确保测试环境隔离
- 真实设备测试需获得授权
- 注意不同固件版本间的差异
通过以上步骤,可以完整复现DIR-815路由器的栈溢出漏洞,并深入理解MIPS架构下的漏洞利用技术。