一步一步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
来加载。即可
sudo chroot . ./qemu-mips-static -E LD_PRELOAD=/libnvram-faker.so /usr/bin/httpd
如果程序还会在其他地方保错,就要自己分析程序,然后根据实际情况,在 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过程。
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void getshell(){
system("sh");
sleep(1);
}
void vulnerable_function() {
char buf[128];
read(STDIN_FILENO, buf, 256);
}
int main(int argc, char** argv) {
printf("%p\n", (int *)write);
vulnerable_function();
write(STDOUT_FILENO, "Hello, World\n", 13);
}
因为要使用 qemu-mips-static
来调试程序,这样就不方便找到libc的基地址。于是在程序运行时把libc中的函数地址打印出来,然后计算基地址,便于我们找到gadgets具体在内存中的位置。然后使用 uclibc的交叉编译工具链来编译。
/home/haclh/router_exploit/cross-compiler-mips/bin/mips-gcc level1.c -o level1
把它扔到一个路由器文件系统目录中,这样就不用单独拷贝它依赖的lib了。
可以看到程序使用了 uClibc,通过查看qemu的maps,找到uClibc的路径
拿到ida中分析找 gadgets.具体可以看上面的那篇文章。找到的gadgets如下。
rop_gad1:
LOAD:00055C60 li $a0, 1
LOAD:00055C64 move $t9, $s1
LOAD:00055C68 jalr $t9 ; sub_55960
LOAD:00055C5C lui $s0, 2
gadg_2
LOAD:0001E20C move $t9, $s1
LOAD:0001E210 lw $ra, 0x28+var_4($sp)
LOAD:0001E214 lw $s2, 0x28+var_8($sp)
LOAD:0001E218 lw $s1, 0x28+var_C($sp)
LOAD:0001E21C lw $s0, 0x28+var_10($sp)
LOAD:0001E220 jr $t9
LOAD:0001E224 addiu $sp, 0x28
rop_gad3:
LOAD:000164C0 addiu $s2, $sp, 0x198+var_180
LOAD:000164C4 move $a2, $v1
LOAD:000164C8 move $t9, $s0
LOAD:000164CC jalr $t9 ; mempcpy
LOAD:000164D0 move $a0, $s2
rop_gad4:
LOAD:000118A4 move $t9, $s2
LOAD:000118A8 jalr $t9
rop的过程,和对应的sp寄存器的值。
sp:0x76fff710
首先进入 rop_gad1, $s1 gadg_2
sp:0x76fff710
进入 gadg_2,这时$s1还是gadg_2, 从内存加载数据到寄存器s1-->sleep, ra--> rop_gad3, $s0--->rop_gad4
sp:0x76fff738
再次进入 gadg_2,s1-->sleep, ra--> rop_gad3, $s0--->rop_gad4
sp:0x76fff760
进入 rop_gad3, 获取栈地址到$s2,跳到 $s0
进入rop_gad4,s2-->0x76fff778 跳进栈中,。。。
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/
一步一步pwn路由器之路由器环境修复&&rop技术分析的更多相关文章
- 一步一步pwn路由器之rop技术实战
前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 这次程序也是 DVRF 里面的,他的路径是 pwnable/She ...
- 一步一步pwn路由器之wr940栈溢出漏洞分析与利用
前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 这个是最近爆出来的漏洞,漏洞编号:CVE-2017-13772 固 ...
- 一步一步pwn路由器之环境搭建
前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 正式进入路由器的世界了.感觉路由器这块就是固件提取,运行环境修复比 ...
- 一步一步pwn路由器之uClibc中malloc&&free分析
前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 栈溢出告一段落.本文介绍下 uClibc 中的 malloc 和 ...
- 一步一步pwn路由器之radare2使用全解
前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 radare2 最近越来越流行,已经进入 github 前 25了 ...
- 一步一步pwn路由器之radare2使用实战
前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 前文讲了一些 radare2 的特性相关的操作方法.本文以一个 c ...
- 一步一步pwn路由器之栈溢出实战
前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 本文以 DVRF 中的第一个漏洞程序 stack_bof_01 为 ...
- 【计算机网络】一步一步学习IP路由流程
TCP/IP协议簇是目前互联网应用最广的协议栈,谈到TCP/IP协议栈就不能不讲一讲IP路由的问题,因为在我们使用的网络通信中几乎每时每刻都在发生着IP路由的事件…….当你在网络世界中还是一位新手的时 ...
- 一步一步教你将普通的wifi路由器变为智能广告路由器
一步一步教你将普通的wifi路由器变为智能广告路由器 相信大家对WiFi智能广告路由器已经不再陌生了,现在很多公共WiFi上网,都需要登录并且验证,这也就是WiFi广告路由器的最重要的功能.大致就是下 ...
随机推荐
- CentOS 7 安装程序介绍
(一).引导菜单 使用 UEFI 引导 Install CentOS Linux 7 选择此选项开始在你的计算机系统中使用图形安装程序安装 CentOS 7 Test this media & ...
- easy-mock本地部署成功,访问报错:EADDRNOTAVAIL 0.0.0.0:7300 解决方案
easy-mock本地部署成功后,迫不及待的想看看是否能正常访问,执行命令 npm run dev 启动项目,访问 127.0.0.1:7300 ,结果郁闷的是报错:EADDRNOTAVAIL 0.0 ...
- Cisco ASA 8.3前及8.3后版本Access-list 变化
8.2及之前 access-list:源地址是真实IP地址,目的地址是映射地址packet-tracer:源地址为真实IP地址,目的地址为映射地址 8.3及之后access-list:源地址和目的地址 ...
- weiFenLuo.winFormsUI.Docking.dll学习
引用方法: 1.建立一个WinForm工程,默认生成了一个WinForm窗体. 2.引用—>添加引用—>浏览—>weiFenLuo.winFormsUI.Docking.dll. 3 ...
- (Android+IOS)正在做一个新闻App,做的差不多了,听听大家的建议 (图)
(Android+IOS)正在做一个新闻App,做的差不多了,听听大家的建议! 新闻采集器做好了,前端展示APP界面感觉还不是很好,还需要改进改进,希望发布(Android和IOS版本)前听听大家的建 ...
- Android开源项目xUtils HttpUtils模块分析(转)
xUtils是github上的一个Android开源工具项目,其中HttpUtils模块是处理网络连接部分,刚好最近想整理下Android网络编程知识,今天学习下xUtils中HttpUtils. x ...
- js--常量,变量
常量 内存中的一个的固定的地址,其中的数值也是固定的 变量 内存的一个地址,其中的内容有我们更改维护 值类型与引用类型 改变值类型的变量时,影响值的变量 全大写的名称一般为常量 var a = 1 v ...
- 使用VNC访问Linux桌面
在一个严重依赖Windows的工作环境中,比如电子邮件被限定为Outlook(因为加密要求), VPN软件不支持Linux版本,那么,只使用Linux桌面是不够的,还需要在Linux桌面上跑个虚拟机运 ...
- 【c++】友元
c++引入友元的原因 在某些情况下,允许特定的非成员函数访问类的私有成员.在类中以关键字friend开始(只能出现在类定义的内部),声明为友元的可以为类.类的成员函数.普通的非成员函数. 速览 #in ...
- Linux笔记-Linux命令初解2
在看linux过程中,文件属性管理是一个难点,因而作为初学者的我来说,我直接将其放在后面来慢慢研究,因而我个人觉得先学习后面一些知识点之后,回过头来将一些你所不懂的去解透,这是极好的意见事情.对了,我 ...