-
-
[原创]CVE-2019-10999复现学习
-
发表于:
2022-1-15 14:15
34945
-
https://github.com/yywz1999/docker-qemu-system
下载好后按照readme安装,连接ssh上去。
然后去打包固件
tar -zcvf cpio.tar.gz cpio-root
上传到docker
切换到root权限
仿真:
chroot . ./bin/sh进入sh。
./etc_ro/rcS中找到了internet.sh文件。查找这个文件它位于: ./sbin/internet.sh
在这个文件中又看到了一个 [lan.sh](http://lan.sh)
【./sbin/lan.sh】文件。
继续查看:
发现了关于web启动的相关信息。
确定了这个固件启动web服务的程序为: alphapd
无法打开pid file,创建一个
再次报错
创建nvramd.pid
调试查看v4的值
可以发现这里是通过 gpio
接口来获取IP的。但是我们是仿真的,并没有这个接口。所以我们直接去Patch。
patch后运行。
在gdb-multiarch中
通过对程序分析,寻找敏感函数,最终找到了一个 strcpy
用户可控的输入位置
可以看到这里的 v11
只有四个字节。 v8
是由 v10
赋值,而他是从 WEPEncryption
获取的。而且并没有长度检查。
交叉引用找到调用点
找到了 formDefineWireless
函数
在web页面中找到了相似关键字
于是测试发包
程序crash,并且控制了PC寄存器。
于是我们开始测试溢出长度
下面我们就可以来寻找gadget打这个溢出。
0x77eda000
想要打出system的话,我们这里就需要来控制 a0
寄存器作为函数调用的参数。
这是找到的gadget
栈中地址存到 s2
寄存器中,然后 s0
寄存器存入 t9
然后调用函数。
所以我们的exp就可以写了
mount
-
o bind
/
dev
/
.
/
dev
/
mount
-
t proc
/
proc
/
.
/
proc
mount
-
o bind
/
dev
/
.
/
dev
/
mount
-
t proc
/
proc
/
.
/
proc
killall
-
q alphapd
sleep
1
alphapd &
killall
-
q alphapd
sleep
1
alphapd &
.
/
gdbserver
-
mipsel :
23946
.
/
bin
/
alphapd
.
/
gdbserver
-
mipsel :
23946
.
/
bin
/
alphapd
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!