一步一步pwn路由器之路由器环境修复&&rop技术分析
前言
本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274
拿到路由器的固件后,第一时间肯定是去运行目标程序,一般是web服务程序。我们可以去 /etc/init.d/
找启动文件,或者看看一些有可能的目录。一般来说路由器的程序很少的情况下是可以直接用qemu运行起来的。我们需要做一些修复的工作,本文会介绍一个常用的方法,后面会分析在 mips uclibc
中常用的 rop
手法。
正文
运行环境修复
由于路由器运行时会去 nvram中获取配置信息,而我们的qemu中是没有该设备,路由器中的程序可能会因为没法获取配置信息而退出。我们可以使用 https://github.com/zcutlip/nvram-faker
配合着设置 LD_PRELOAD
环境变量来使用( 类似于一种 hook
)。如果你的mips交叉编译工具链和它脚本里面的不一样就要修改它的脚本,比如
编译后把 libnvram-faker.so
和 nvram.ini
放到 /
目录,然后使用 LD_PRELOAD
来加载。即可
|
|
如果程序还会在其他地方保错,就要自己分析程序,然后根据实际情况,在 nvram-faker
增加 hook代码
注:
- 要注意目标应用是用的
glibc
还是uclibc
,从而选择对应的交叉编译工具链来进行编译。 - 先使用
firmadyne
运行看看,然后优先选择qemu-system-mips-static
来调试,实在不行用qemu-system
- 如果需要某些静态编译(给生成的Makefile里面增加
-static
选项)的程序,建议去qemu-system
编译,交叉编译太麻烦了。
MIPS ROP分析
看了 Exploiting a MIPS Stack Overflow 做的实验,因为 tplink
上没有对应版本的固件了。于是只能自己写一个栈溢出的程序,并配合着gdb调试,来模拟整个rop过程。
代码如下:
因为要使用 qemu-mips-static
来调试程序,这样就不方便找到libc的基地址。于是在程序运行时把libc中的函数地址打印出来,然后计算基地址,便于我们找到gadgets具体在内存中的位置。然后使用 uclibc的交叉编译工具链来编译。
把它扔到一个路由器文件系统目录中,这样就不用单独拷贝它依赖的lib了。
可以看到程序使用了 uClibc,通过查看qemu的maps,找到uClibc的路径
拿到ida中分析找 gadgets.具体可以看上面的那篇文章。找到的gadgets如下。
rop的过程,和对应的sp寄存器的值。
gdb调试的部分截图
断在函数返回地址被覆盖的时候,使用gdb命令,设置$pc
寄存器的值,伪造劫持程序流程到 rop_gad1
汇编代码如下
第一次进入rop_gad2
第二次运行到 rop_gad2 时的寄存器状态。
t9
指向 sleep
函数,接下来调用 sleep(1)
刷新 cache
, 便于后面指向 shellcode
。次数的 $ra
为 rop_gad3
的地址,便于在 sleep
返回后继续 rop
,获取一个栈的指针到寄存器,便于后面直接跳过去。
进入rop_gad3
进入 rop_gad4,跳到栈上执行shellcode
分析完毕。
总结
修复环境要注意使用的gcc, 必要时自己跟踪,逆向代码,修复运行环境。看了几篇mips漏洞利用的文章,rop的思路就是上面的思路,估计那就是通用思路吧,记录下来,以备不时只需。调rop的过程还是有趣的。
参考链接:
http://www.devttys0.com/2012/10/exploiting-a-mips-stack-overflow/
注:
本文先发布于:https://xianzhi.aliyun.com/forum/topic/1509/
本站文章均原创, 转载注明来源
本文链接:http://blog.hac425.top/2017/10/26/step_by_step_pwn_router_part2.html