首页
社区
课程
招聘
[原创]MIPS缓冲区溢出学习之CVE-2019-10892分析利用
发表于: 2020-3-9 14:47 16698

[原创]MIPS缓冲区溢出学习之CVE-2019-10892分析利用

2020-3-9 14:47
16698

这个漏洞是dlink提供HTTP服务的cgibin组件中的hnap_main函数的sprintf对字符串长度处理不当造成的缓冲区溢出。以下是分析学习过程,如果错误欢迎指正。

固件版本为DIR-806,下载地址:

下载完成之后,使用binwalk对固件进行分析提取。

分析./etc/services/HTTP/httpcfg.php可以看出,当请求连接为HNAP1时,程序会执行hnap程序进行解析。

查看usr/sbin/hnap正是/htdocs/cgibin的软连接。

分析/htdocs/cgibin的main函数可知,当接收到hnap类型的请求时,程序会执行hnap_main

继续分析hnap_main,可以看到hnap_main中的sprintf处,程序并没有验证$4寄存器的长度,造成漏洞。所以我们可以将传入的数据覆盖掉寄存器$s0-$s7、$ra

有函数开头可知 栈空间为0x248字节大小。

程序返回时:

所以我们可以覆盖$sp+0x244的位置,构造ROP。

这里使用qemu的用户模式对其进行调试分析。为了编写和操作方便。把命令写到sh脚本中
注意,cgibin程序的hnap_main函数会获取一些变量值进行判断才能到达sprintf处。如下图

主要的环境变量有REQUEST_METHOD、REQUEST_URI等等,因此调试时需要设置些环境变量,绕过判断。

使用gdb-multiarch -q ./htdocs/cgibin启动gdb
之后attach上本地的1238端口即可开始调试。

当执行完最后一个sprintf时。此时栈空间已经全部被填满:

此时执行完sprintf(即我们可控制)的地址是0x76fff298$sp+0x244的地址是0x76fff4bc,之间相差548个字节。

使用ropper在libc中找到些合适的ROP,准备构造:

栈中被sprintf填充的数据过多,通过计算,存在溢出点的地址应为195+6*4字节处。

libc的基地址可以通过启动cgibin的pid,在/proc/PID/maps中查看:(我这里是使用了qume模拟了固件


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 5
支持
分享
最新回复 (10)
雪    币: 205
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
2
2020-3-9 14:58
0
雪    币: 26245
活跃值: (63297)
能力值: (RANK:135 )
在线值:
发帖
回帖
粉丝
3
感谢分享~
2020-3-12 14:39
0
雪    币: 7048
活跃值: (3527)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
4
厉害!!
2020-3-13 08:47
0
雪    币: 16506
活跃值: (6392)
能力值: ( LV13,RANK:923 )
在线值:
发帖
回帖
粉丝
5
2020-3-13 15:54
0
雪    币: 9169
活跃值: (3099)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
6
2020-3-13 19:16
0
雪    币: 22
活跃值: (59)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
“到ra之间相差548个字节。通过计算,存在溢出点的地址应为195+6*4字节处。”这里的195+6*4的计算没太看明白
2020-3-25 18:42
0
雪    币: 619
活跃值: (361)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
qingxp “到ra之间相差548个字节。通过计算,存在溢出点的地址应为195+6*4字节处。”这里的195+6*4的计算没太看明白
栈中被sprintf填充的数据有很多,可以调试定位下覆盖ra寄存器的位置,就可以算出来了
2020-3-26 08:46
0
雪    币: 2588
活跃值: (1332)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
9

请问调用gdb-multiarch的时候显示这样的信息正常吗?

ubuntu@ubuntu:~/Study/wll/_DIR806A1_FW100CNb11.bin.extracted/squashfs-root$ sudo gdb-multiarch -q ./htdocs/cgibin
pwndbg: loaded 179 commands. Type pwndbg [filter] for a list.
pwndbg: created $rebase, $ida gdb functions (can be used with print/break)
Reading symbols from ./htdocs/cgibin...(no debugging symbols found)...done.


然后流程上我按照步骤运行了shell脚本,应该是正常运行cgibin了,然后运行gdb,这些是在虚拟机里做的。

再然后我用ida远程attach了那个端口的gdb,也显示了正常界面,但是在ida加断点调试的时候,pwndbg那里没有任何反应,这是怎么回事呢?


望解答~

2020-7-22 16:07
0
雪    币: 619
活跃值: (361)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
10
显示这些信息是正常的,“在ida加断点调试的时候,pwndbg那里没有任何反应”ida和gdb都是调试器,在ida中调试,怎么会在gdb中显示呢
2020-8-4 16:51
0
雪    币: 201
活跃值: (177)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11

我去按照流程跑一遍,嘿嘿

最后于 2020-9-2 10:21 被子曰小玖编辑 ,原因:
2020-9-2 10:20
0
游客
登录 | 注册 方可回帖
返回
//