揭秘家用路由器0day漏洞挖掘技术读书笔记 D-Link DIR-815 hedwig.cgi溢出漏洞分析

准备工作

环境搭建
问题1:
用32位的系统,原因之后会详细说。
问题2:
如果用wine+IDA6.8的话由于后续会使用到IDAPython插件,故还需要下载https://www.dllme.com/dll/download/14091/python27.dll并放置到ida根目录下。同时以如下方式启动idaq.exe:export PYTHONPATH=/usr/lib/python2.7 && wine idaq。吾爱破解有linux版的IDA6.4,建议直接用那个,省去安装wine的各种各样的麻烦。
问题3:
还需要一些IDA插件,git clone https://github.com/devttys0/ida.git之后按照说明安装。
固件下载地址

漏洞描述

这里写图片描述
这里主要讲hedwig.cgi中的漏洞成因及利用方式,第一次写详细点。

静态分析

下载之后解压缩得到DIR-815 FW 1.01b14_1.01b14.bin,通过binwalk提取出文件系统。
这里写图片描述
这里写图片描述
所以需要分析的是/htdocs/cgibin这个程序。在string窗口搜索cookie字符串,仅看到HTTP_COOKIE一项。进一步查看交叉引用也同样存在一处,地址为0x407d04,对应sess_get_uid。但sess_get_uid不存在如strcpy等危险的函数,所以对sess_get_uid查找交叉引用。hedwigcgi_main+0x1c8处之后发现sprintf,很有可能是导致溢出的位置。
这里写图片描述
同时分析sess_get_uid发现cookie的组织形式应该为uid=payload
这里写图片描述
分析hedwigcgi_main调用get_sess_uid函数前的代码得知环境变量REQUEST_METHOD需要设置为POST。
这里写图片描述
同时值得说明的是/var/tmp/temp.xml文件打开成功后同样会转入一处sprintf,而uid的cookie值会被带入,同样存在栈溢出漏洞,而binwalk进行提取的文件系统中var目录中为空。
这里写图片描述
这里写图片描述
第一次:
sprintf(栈,"%s/%s/postxml","/runtime/session",uid的内容)
第二次:
sprintf(栈,"/htdocs/webinc/fatlady.php\nprefix=%s/%s","/runtime/session",uid的内容)

动态调试

在真实的固件环境中存在/var/tmp/temp.xml,为了模拟真实的环境可以手工建立这个目录。使用书中的patternLocOffset.py生成2000个字节的pattern string。
这里写图片描述
运行下面的脚本进行动态调试。
这里写图片描述
打开IDA,Debugger->attach选择GDB Remote Debugger,输入IP和端口。
这里写图片描述
在Debug options中勾选如图所示的内容。
这里写图片描述
再点Set specific options设置一下处理器。
这里写图片描述
点击OK。
这里写图片描述
断在hedwigcgi_main的返回指令处,S0的值为0x366843235。
这里写图片描述
再次使用patternLocOffset.py定位偏移。
这里写图片描述
为了确定lib.so.0的基地址,运行脚本后ps -ef查看pid,cat /proc/pid/maps查看模块基地址。这里就出现一个很蛋疼的问题了。
32位的系统上应该是这样:
这里写图片描述
而我的64位系统上是这样:
这里写图片描述
这样就很尴尬,不知道怎么确定加载到内存里面的位置,所以前面说最好是用32位的系统。ida打开lib/lib.so.0(为符号链接指向libuClibc-0.9.30.1.so),查看到system函数位于lib.so.0偏移0x53200位置处。同时由于期望执行shell那么必须需要向system函数的参数填入对应参数,即让$a0参数指向/bin/sh。但是此时由于仅仅对栈空间到高地址有控制权,所以需要将布置好的可以溢出位置内填入/bin/sh后将其地址交给某个寄存器。
这里写图片描述
首先在Search菜单栏中点击mips rop gadgets激活mips ROP的插件。在IDA的python命令行窗口输入mipsrop.stackfinders()
这里写图片描述
第一个ROP gadget无法将填充的字符串作为参数交给system函数执行。
这里写图片描述
继续以如上判断方式去看发现直到第6个ROP gadget可以满足条件。下一个gadget的地址可以通过攻击者可控的$s0寄存器而来,system调用时参数可以从栈位置调整到$s5寄存器。
这里写图片描述
我们再来看一下hedwigcgi_main返回处。
这里写图片描述
目前覆盖的结构如下。
这里写图片描述
但是问题是存在截断字符\x00,办法是通过填充s0为偏移0x531ff,再通过一个gadget将其加1转换到偏移0x53200处。在libc.so.0中的python窗口中输入mipsrop.find("addiu $s0,1");
这里写图片描述
点击第一处地址进行查看并分析。
这里写图片描述
现在覆盖的结构如下。
这里写图片描述
看看metasploit里面的payload和我们分析的是一致的。
这里写图片描述
这里还要注意qemu模拟环境下偏移和真实环境是不一样的。
这里写图片描述

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值