首页
社区
课程
招聘
[原创]dir-645 超长cookie栈溢出漏洞分析
发表于: 2020-11-25 15:41 33544

[原创]dir-645 超长cookie栈溢出漏洞分析

2020-11-25 15:41
33544

分析一个D-Link的漏洞学习一下路由器漏洞方面的知识,《路由器0day》这本书提到的DIR-815 cookie溢出漏洞的固件在官网上已经找不到了,但是此漏洞影响的范围包括了DIR-645,故用DIR-645 1.01版本的固件分析

分析用到的工具:

IDA Pro:反汇编和远程调试

Ghidra 9.1.2:我的IDA不能生成mips的伪代码,所以我用ghidra来看伪代码

Ubuntu + qemu:模拟路由器运行环境

固件下载链接:ftp://ftp2.dlink.com/PRODUCTS/DIR-645/REVA/DIR-645_FIRMWARE_1.01.ZIP

 

使用如下命令将文件系统提取出来:

从书中得知漏洞存在于./htdocs/cgibin中,将cgibin拷贝到物理机中,使用IDA分析,shift+F12打开字符串窗口,搜索“HTTP_COOKIE


双击这一项,定位到rodata段查看详细信息,选中aHttpCookie,按X键查看调用信息(ghidra则是选中函数名,右键->References->find References to #function name#


双击后进入sess_get_uid函数,此函数只是使用了“HTTP_COOKIE”字符串,继续按X键查看调用信息


双击进入hedwigcgi_main函数,看到调用sess_get_uid函数之后紧接着调用了sprintf函数(PS:之所以用sprintf而不是strcpy是因为strcpy只能是字符串到字符串,而sprintf可以是从任意类型到字符串),而sprintf函数就是导致栈溢出的重要函数;接下来需要用IDA进行远程调试,调试之前需要对书中自带的脚本进行一些修改,修改后如下:

使用第二行注释中的命令运行脚本,开启远程调试,接下来会详细讲解如何用IDA远程调试DIR-645路由器固件(主要是本人使用IDA时花一天才解决此问题o(╥﹏╥)o);首先用IDA打开cgibin文件,并定位到上面讲的sprintf函数(注意是“jalr    $t9 ; sprintf”那一行),然后F2下断点


然后在Ubuntu中运行pentest_cgi.sh脚本(运行命令在文件的第二行注释),并等待调试


IDA中选择Debugger->select Debugger…在对话框中选择GDB debugger然后点击OK


重新选择Debugger->Process options… 输入远程路径、hostname和端口,然后单击OK


最后点击Debugger->Attach to process… 我的选择框中只有一项,所以就选这一项,然后单击OK



附加成功后无需再下断点,直接按F9就可以停在调用sprintf函数的位置上

Hex View窗口右键Synchronize with -> SP,这样窗口就会跟着程序走了,方便观察栈溢出

修改pentest_cgi.sh然后配合patternLocOffset.py算出溢出位置,修改后的pentest_cgi.sh代码如下:

这个pentest_cgi.sh脚本在之后漏洞利用测试的时候也会用到

使用patternLocOffset.py测试固件溢出位置,命令如下:

直接执行pentest_cgi.sh,并且用IDA附加调试,得到溢出的偏移

将程序报错时显示的字符串带入patternLocOffset工具中,得出偏移位置

查找ROP链时需要用到mipsrop插件,这个插件对IDA7的支持不好,需要用到IDA68,使用时将GitHub上下载的ida工程中的shimsmipsrop两个文件夹下的py文件全都复制到IDAplugin目录中

IDA68中输入命令:mipsrop.stackfinder()

得到以下可做ROP的地址,选择0x159cc

IDA中的mipsrop只是得到ROP的偏移,还需要找到libc.so.0的基地址,

使用qemu模拟mips系统运行时需要先解决网络问题,否则无法传文件;有两种方法,其中一种是修改/etc/network/interfaces文件,这种方法我始终无法成功,所以我选择创建网桥的方法,命令如下:

创建网桥:

创建tap接口,并添加到网桥:

使用命令,启动镜像:

进入虚拟机(虚拟机账号/密码:root/root)后需要设置IP,这一步并不是必须的,例如我并没有设置IP就直接可以联网了:

我在没有设置IP的情况下直接ping www.baidu.com可以ping通

接下来需要用scp命令把路由器的所有文件从Ubuntu中复制到Debian中,命令如下(IP改成自己的DebianIP):

运行漏洞代码前先将ASLR关闭

第一个看似libc.so.0的基地址,实则并不是,有前辈分析此漏洞时使用这种方法成功找到过libc基址,但是我始终无法成功,所以我采用第二种方法

第二种方法是使用qemu的用户模式调试,需要注意的是这种调试方式当qemu-user版本过低时,使用gdb远程调试会出现如下问题

此时gdb会显示这是一个bug,并要求你上报

这个错误其实是qemu的一个bug,Ubuntu18.04适配的是2.11.1版本的qemu,此时需要将qemu升级到4.2以上的版本,有两种方法:

1、在GitHub上下载源码,并编译

2、使用Ubuntu20.04及以上版本下载qemu,因为Ubuntu20.04适配的就是qemu 4.2

我选择的是使用Ubuntu20.04运行qemu调试,而Ubuntu20.04是个大坑;首先Ubuntu20.04的源仓库中并没有包含Python2的pip,所以需要使用get-pip.py来安装pip2:

使用GitHub或者apt安装好binwalk后使用binwalk提取固件,可能会报此错误

需要手动安装一下sasquatch,命令如下:

当一切就绪时,运行pentest_cgi.sh脚本,然后使用gdb远程调试

使用之前获得的libc基址+偏移构造ROP链,poc代码如下:

以上是《路由器0day》一书中的原版poc脚本,接下来是简单版本的poc脚本:

运行脚本,将payload打印到之前用patternLocOffset.py创建的文件dir645_patternLocOffset_test中,然后运行pentest_cgi.sh,启动远程调试


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2020-11-25 16:24 被pureGavin编辑 ,原因: 修改内容
收藏
免费 7
支持
分享
打赏 + 2.00雪花
打赏次数 1 雪花 + 2.00
 
赞赏  yjmwxwx   +2.00 2021/02/21
最新回复 (22)
雪    币: 14517
活跃值: (17538)
能力值: ( LV12,RANK:290 )
在线值:
发帖
回帖
粉丝
2
吐槽看雪的编辑器,我在Word文档里放大或缩小图片,清晰度没有改变,用看雪的编辑器就会变的非常模糊
2020-11-25 15:43
0
雪    币: 0
活跃值: (268)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3

膜拜大神,代码看着真舒服。

最后于 2020-11-25 16:04 被soatm编辑 ,原因:
2020-11-25 16:04
0
雪    币: 1743
活跃值: (1380)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
顶顶顶,期待大佬的新文章
2020-11-26 14:24
0
雪    币: 14517
活跃值: (17538)
能力值: ( LV12,RANK:290 )
在线值:
发帖
回帖
粉丝
5
这个利用教程我录了个视频
链接:https://pan.baidu.com/s/1JFW8j67uEr8tOTsduqEtEw 
提取码:krut 
2020-11-26 22:28
0
雪    币: 3126
活跃值: (3266)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
6
之前也搞过,没你这详细,点个赞!
2020-11-27 15:30
0
雪    币: 14517
活跃值: (17538)
能力值: ( LV12,RANK:290 )
在线值:
发帖
回帖
粉丝
7
dayday向上8 之前也搞过,没你这详细,点个赞![em_63]
额。。。才发现你也搞过,我还留言了,居然忘了参考你的教程了
2020-11-27 15:40
0
雪    币: 3126
活跃值: (3266)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
8
pureGavin 额。。。才发现你也搞过,我还留言了,居然忘了参考你的教程了
哈哈,没啥可参考的,我要向你学习
2020-11-27 18:20
0
雪    币: 213
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
9
文章写的很好,有视频、有工具。干货呀
2020-12-17 10:16
0
雪    币: 1689
活跃值: (178)
能力值: ( LV7,RANK:103 )
在线值:
发帖
回帖
粉丝
10
为什么前面算的溢出偏移是1043,但后面的poc是0x3cd?
2020-12-26 20:54
0
雪    币: 14517
活跃值: (17538)
能力值: ( LV12,RANK:290 )
在线值:
发帖
回帖
粉丝
11
Snowleo 为什么前面算的溢出偏移是1043,但后面的poc是0x3cd?

请仔细看赋值给寄存器的值在栈中的位置

2020-12-26 21:58
0
雪    币: 4
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
12
我也想问 溢出的偏移大小 为什么前面是1043, 写exp时候就变成1009了  我自己调也是1043,不知道是什么问题
2020-12-30 16:45
0
雪    币: 14517
活跃值: (17538)
能力值: ( LV12,RANK:290 )
在线值:
发帖
回帖
粉丝
13
jayus 我也想问 溢出的偏移大小 为什么前面是1043, 写exp时候就变成1009了 我自己调也是1043,不知道是什么问题[em_85]
我上面的图已经说明了为什么会变成1009了,ROP链中需要用到的寄存器有 s0 s1 和 s2;如果你还是搞不明白,就把偏移改成1043试试看会产生什么问题
2020-12-31 08:58
0
雪    币: 0
活跃值: (633)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
楼主想过这类漏洞如何通过fuzz 出来吗
2021-1-2 15:22
0
雪    币: 14517
活跃值: (17538)
能力值: ( LV12,RANK:290 )
在线值:
发帖
回帖
粉丝
15
Qira 楼主想过这类漏洞如何通过fuzz 出来吗
正在做,GitHub上有个一叫 firmAFL 的项目,是国外一个大神根据AFL魔改的,从介绍里得知是专门用来做固件fuzz的,但是我还在熟悉这个工具,如果能成功使用fuzz复现挖洞的话,我也会写成文章上传到看雪的
2021-1-3 00:04
0
雪    币: 388
活跃值: (892)
能力值: ( LV3,RANK:32 )
在线值:
发帖
回帖
粉丝
16
太详细了,膜拜
2021-1-26 17:41
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
17

qemu4.2下载好后,也成功make install了,可是qemu还是2.11版本,请问怎么样才能改变使用的版本呢?

最后于 2021-3-10 20:00 被huken编辑 ,原因:
2021-3-10 19:55
0
雪    币: 14517
活跃值: (17538)
能力值: ( LV12,RANK:290 )
在线值:
发帖
回帖
粉丝
18
huken qemu4.2下载好后,也成功make install了,可是qemu还是2.11版本,请问怎么样才能改变使用的版本呢?
请使用Ubuntu20.04,我在文章的最后给出了下载链接了
2021-3-16 20:53
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
19
pureGavin 请使用Ubuntu20.04,我在文章的最后给出了下载链接了
好的
2021-3-25 16:07
0
雪    币: 0
活跃值: (125)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20

看到你的gdb是8版本,是直接apt安装的吗
我用gdbserver7.7.1 mipsel,gdb 9.2,可以连接调试,但是会报错
Ignoring packet error, continuing...
不知道你用gdb8调试的时候有没碰到过





已解决

最后于 2022-11-3 20:18 被赌博大师编辑 ,原因:
2022-11-3 11:00
0
雪    币: 14517
活跃值: (17538)
能力值: ( LV12,RANK:290 )
在线值:
发帖
回帖
粉丝
22
mb_lsbkdyei 找你做单可行不
做啥?
2023-3-1 10:28
0
雪    币: 229
活跃值: (309)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
感谢大佬用心的制作分享,新手也能跟着学
2024-6-24 17:32
0
游客
登录 | 注册 方可回帖
返回
//