0x00 简介
固件下载地址:https://down.tenda.com.cn/uploadfile/AC1206/US_AC1206V1.0RTL_V15.03.06.23_multi_TD01.zip
Binwalk 可以提取出其文件系统。
0x01 固件模拟
Tenda 控制 WEB 相关流程的程序一般是 bin 目录下的 httpd 程序:
通过 sudo qemu-mipsel -L ./ ./bin/httpd
进行模拟:
关键词搜索在main函数处:
22行有关于 apmib_init 的判断,若失败会输出“Initialize AP MIB failed !”。
通过 IDA 判断找到关键判断为 0x33A68 处,通过 010editor 将 bnez 改为 beqz:
保存替换后发现卡在 check_network处,同样的方式进行修改,执行:
继续修改 check_cfm 的判断,执行:
listen ip = 255.255.255.255,加一张 br0 网卡:
apt install uml-utilities bridge-utils
brctl addbr br0
ifconfig br0 192.168.142.100/24
brctl addif br0 ens33
再执行发现又进入了 check_network 的判断循环,应该是通过增加网卡使得 check_network 返回正常,这里通过010editor修改回去,再执行:
模拟成功。
0x02 分析
根据漏洞描述,IDA打开后定位到关键函数 formWriteFacMac:
控制参数 mac 就可以利用 doSystemCmd 实现命令注入。
一直向上追溯可以追溯出这样的调用链:
main --> initWebs --> formDefineTendDa
-->
websFormDefine(
"WriteFacMac", (void (*)(webs_t, char_t *, char_t *))formWriteFacMac
)
--> formWriteFacMac
很明显这是 GoAhead 结构,通过字符串查询得到版本为2.1.8。
formDefineTendDa 是一个包含路由器接口和其对应处理函数的总函数,通过 websFormDefine 注册后,WriteFacMac 会与 formWriteFacMac 形成绑定,在 goform 下产生一个接口 WriteFacMac 调用 formWriteFacMac。
固件已经模拟成功,直接访问该接口:
访问成功,查看 websGetVar:
其流程为判断 wp中的mac参数是否存在,若不存在则返回默认值 00:01:02:11:22:33,若存在则返回对应值,这里并未做其他过滤,因此可以直接构造mac=00:01:02:11:22:33 || touch /tmp/x.txt
利用成功。