固件下载连接

1
https://drivers.softpedia.com/dyn-postdownload.php/d27e8410d32cd9de63a3506c47ded1bc/61ff85c5/75eb7/4/1

虚拟机环境

ubuntu 18

binwalk 解包

1
binwalk -Me US_AC15V1.0BR_V15.03.1.16_multi_TD01.rar

使用 qumu 启动 ./bin/httpd 进行固件模拟

1
2
3
4
打开到此处 _US_AC15V1.0BR_V15.03.1.16_multi_TD01.rar.extracted
sudo apt install qemu-user-static libc6-arm* libc6-dev-arm*
cp /usr/bin/qemu-arm-static .
sudo chroot ./ ./qemu-arm-static ./bin/httpd

程序卡在了 Welcome to …

1
2
3
使用ida打开
/_US_AC15V1.0BR_V15.03.1.16_multi_TD01.rar.extracted/squashfs-root/bin
目录下的httpd文件

如果 R3 > 0 则跳转loc_2CFA8,会导致无限循环

1
2
3
4
5
6
7
8
9
10
11
loc_2CF84
SUB R3, R11, #-var_B4 ; R3 = R11 + var_B4 (减负数等于加法)
MOV R0, R3 ; 将R3的值传递给R0(作为函数参数)
BL check_network ; 调用check_network函数
MOV R3, R0 ; 保存函数返回值到R3
CMP R3, #0 ; 比较返回值和0
BGT loc_2CFA8 ; 如果返回值 > 0,跳转到loc_2CFA8

MOV R0, #1 ; 设置参数为1秒
BL sleep ; 调用sleep(1),休眠1
B loc_2CF84 ; 无条件跳回循环开始

使用Keypatch 修改 mov R3,R0 为mov R3,#1,让其可以跳出循环,并在Edit–>Patch program–>Apply patches to 导出修改后的文件,将其修改后的httpd 将其替换(记得替换掉后 chmod 777 *给权限)

但是后续模拟固件还是有报错,继续分析 ida

分析当loc_2CF84 最后跳转到loc_2CFA8 后还有一次判断CMP R3, #0,还是使用Keypatch 修改进行修改mov R3,R0 为mov R3,#1 使其不进入左边

再次执行,发现 ip 是从错误的

发现是在get_eth_name的外部函数引起的,使用命令搜索

1
2
grep -r "get_eth_name" | grep "匹配到二进制文件"
#在文件中进行搜索相关的文件

挂起虚拟网卡,再重新启动

首先使用 ifconfig -a 查看虚拟机使用的是那个网卡,我们使用ens33

1
2
3
4
5
6
sudo apt install uml-utilities bridge-utils
sudo brctl addbr br0
sudo brctl addif br0 ens33#查看到的
sudo ifconfig br0 up
sudo dhclient br0
sudo chroot ./ ./qemu-arm-static ./bin/httpd

此时 IP 正常显示

漏洞实现

使用浏览器打开网页,显示无法访问

1
2
cp -rf ./webroot_ro/* ./webroot/
#使用此命令将webroot_ro复制到此处,再次启动

成功进入

根据 POC可知溢出漏洞点位于R7WebsSecurityHandler函数中

通过 scanf 输入 password,s_ 大小为 128,可以进行溢出

我们首先要通过此 if 才能进入到后续的 scanf,scanf 就是这次的漏洞点

password 是用户可控的,它是 http 请求中 cookie 上的一个字段,也是 s_1

s_ 大小为 128

根据strncmp 判断只需要让我们的请求中包含”/goform/xxx”就可以靠近漏洞点

我们通过访问 ip/goform/anza,通过burpsuite 进行抓包,通过NATBypass 将虚拟机 ip 内网穿透出去

我们增加Cookie 进行发送,程序最后会出现报错