以DVRF(路由器漏洞靶机)为例解读JEB固件漏洞利用

本文讲的是以DVRF(路由器漏洞靶机)为例解读JEB固件漏洞利用

在本文中,我将介绍JEB的MIPS反编译器是如何帮助你查找和利用嵌入式设备中的软件漏洞。

DVRF

DVRF(Damn_Vulnerable_Router_Firmware) 是一个基于路由器Linksys E1550的路由器固件,里面包含了开发者写的一些存在漏洞的二进制文件,可以在路由器中安装该固件进行安全测试。

DVRF模拟了一个比较真实的环境,比较适合初学路由器漏洞挖掘,不过前提是对其他CPU架构(MIPS)有一个基本的了解。

对于有兴趣挑战的读者,我建议你遵循DVRF教程,并获得完整的MIPSEL Debian QEMU映像,因为该映像可以在Linux上使用常用的漏洞开发利用工作流程,而不会对可用工具产生任何限制。

JEB

JEB是一个功能强大的为安全专业人士设计的Android应用程序的反编译工具。用于逆向工程或审计APK文件,可以提高效率减少许多工程师的分析时间。具有以下4大特点:

1.全面的Dalvik反编译器

JEB的独特功能是,其Dalvik字节码反编译为Java源代码的能力。无需DEX-JAR转换工具。

2.交互性

分析师需要灵活的工具,特别是在处理混淆的或受保护的代码块时。JEB的强大的用户界面,使你可以检查交叉引用,重命名的方法,字段,类,代码和数据之间导航,做笔记,添加注释,以及更多。

3.可全面测试APK文件内容

检查解压缩的资源和资产,证书,字符串和常量等。追踪你的测试进展情况。

不会让以前研究的工作付诸东流,可以保存你的分析,对JEB数据库文件,通过JEB的修订历史记录机制和跟踪进展。

4.多平台

JEB支持Windows,Linux和Mac OS。

漏洞利用环境设置

首先,我从二进制解压缩固件中提取二进制文件。我先对第一个文件做一些分析:

加载到JEB后,我可以看到几个有趣的功能:

在一些经典的libc有趣的例程中(system,strcpy……),我注意到了被命名为“dat_shell”的函数。

正如上图所显示的,此函数可以帮你解决问题,并通过调用系统产生一个shell。现在,我要将执行流重定向到dat_shell函数。接下来,我看到二进制调用“strcpy”,这可能只是缓冲区溢出。如下图所示,通过检查main函数,我发现strcpy被调用。

原因有三:

首先,它会检查我是否提供了命令行参数;

其次,它会将用户输入复制到局部变量中,并打印输入的内容;

最后,它会告诉我“再试一次”然后返回。幸运的是,strcpy不检查其输入大小,否则,将导致栈缓冲区溢出。

构建利用

和x86二进制程序中的情况类似,我会先用一个大的参数运行调试器中的二进制文件来验证是否会发生溢出。

为此,我在我的QEMU VM上启动了一个gdbserver,并使用JEB的调试器接口(参见调试手册了解更多信息)。在MIPS ISA中,来自例程调用的返回地址存储在名为$ra的特定寄存器中,该寄存器也通过栈填充,就像通常在x86上看到的那样,然后跳转到保存的返回地址。

在我的二进制文件中,我通过提供一个大的参数(一系列0x4F字节)来确认返回地址是可以被用户控制的,并在strcpy调用后显示寄存器状态:

我检查了以下我重构的栈框架,以计算适当的填充。你可以使用你选择的函数中的Ctrl+Alt+k快捷方式访问该视图。我将变量buf的类型更改为变量开始和下一个之间的所有可用大小的char数组,其中有200字节。

实际上,变量var04和var08是保存的返回地址和主函数保存的帧指针。结果发现,这个偏移量是204字节,因为我用200字节填充缓冲区,并用另外四个字符覆盖保存的帧指针。让我尝试以下漏洞:

#!/usr/bin/python
 
padding = "O"* 204
 
dat_shell_addr = "x50x09x40" # Partial overwrite with little-endian arch
 
payload = padding + dat_shell_addr
 
with open("input", "wb") as f:
 
f.write(payload

漏洞利用过程

令人惊讶的是,我的虚拟攻击使位于地址0x400970中的程序segfaults出现在dat_shell例程中。来看看JEB中的这个地址:

我可以在上图中看到地址的存储器访问吗,该地址是通过将偏移量0x801C添加到全局指针寄存器$gp而计算出的结果。但这里的问题是$gp最初设置在$t9寄存器的程序开头(见上图的0x4000958)。

那么$t9中的值来自哪里?通常在MIPS(调用约定)上调用例程:$t9寄存器首先设置为目标例程的地址,然后再传达到例如jalr $t9指令(请参阅MIPS ISA 的第50页)。全局指针$gp然后用$t9进行初始化,用于计算各种偏移量,特别是将调用的其他函数,因此必须保证绝对正确。

换句话说,如果$t9的值在执行此例程时不是dat_shell的地址,则在例程执行期间存在无效内存访问的可能性就会变得很大。为了构建一个成功的漏洞利用,我需要先从栈中加载任意值到$t9,然后再进行传递,因为它是一个真正的函数调用。

为了做到这一点,我需要一个“gadget”,在搜索这个gadget时,我首先检查使用“libs”调试器命令加载的动态库。

幸运的是,我有三个库以固定的内存地址加载:libc.so.0,libgcc_s.so.0和ld-uClibc.so.0。

JEB的ROP Gadget查找插件

使用Gadget是构建返回导向编程技术(Return-Oriented Programming,ROP)漏洞的常见方法,所以我决定开发一个Gadget查找插件。而且,我不是从本机指令中搜索Gadget,而是决定使用JEB中间表示(IR),例如我可以公开的在JEB处理的所有架构上找到Gadget。

最终的结果是,当在JEB中加载libc.so.0,libgcc_s.so.0和ld-uClibc.so.0库时,该插件会创建一个包含所有Gadget的视图:

输出没有重复的Gadget,按字母顺序排列,以方便查找有趣的Gadget。

那么,它是如何工作的?使用JEB的API,插件将本机代码转换为我的反编译管道第一阶段使用的IR。在这个阶段,本地指令的所有缺点都被暴露出来了,并且还没有进行优化。

要查找Gadget,以分支结尾的一系列指令,我只需在程序计数器寄存器中搜索指定并向后迭代,直到该寄存器上的另一个赋值为止。最后一步是过滤掉相对转移,不过这一步在漏洞利用中是不可能真正控制的。这样我就得到了一个很好的ROPGadget列表。

同样,因为它仅使用IR是,所以该方法适用于所有架构。例如,以下就是运行在ARMv7二进制文件的相同代码:

公开的代码可以在这里找到。

现在在libc库使用我刚刚找到的插件,我发现以下Gadget在偏移0x6b20处:

它将栈顶部的值复制到$t9寄存器中,并分支到$t9寄存器。

因此,该方法就是使用易受攻击的strcpy来首先执行这个Gadget,这样dat_shell地址将被调用为正常的例程调用。在我的测试设备上停用地址空间布局随机化(ASLR)后,我可以使用之前找到的libc基地址进行漏洞利用。最后的漏洞看起来像这样:

现在开始漏洞利用。

至此为止,我利用我的JEB ROPGadget查找器已在第一个栈缓冲区成功实现了溢出。下面,让我们来看看第二和第三个缓冲区溢出。

第二缓冲区溢出过程与第一个一样,首先进行漏洞利用环境设置

首先对文件进行分析:

接下来,我会检查主要函数。

它看起来与第一个缓冲区溢出几乎完全相同,只有在strcpy()调用中会出现不同的缓冲区大小。在确认我没有获取相关函数后,我可以重定向执行。

构建利用

由于栈是可执行的,借助易受攻击的strcpy(),我可以写一个相当大的缓冲区(508字节)。

首先,我从shellstorm中获取了一个MIPS shellcode,然后我将它翻译成了little-endian,这是为MIPSEL编译的目标二进制文件。接下来,我需要找到跳转的确切的栈地址。为了简化进程,我决定在shellcode前添加 NOP sled前缀。

为了构建NOP sled,我不能简单地使用MIPS NOP指令,因为它已被编码为四个空字节,因此不能用strcpy()复制。使用Keystone汇编器,我搜索了一个等效的指令,最后使用xor$ t0,$t0,$t0,其编码不包含空字节。

我只需要将所有的部分合并在一起,就会有完整的漏洞利用代码:

可以看到shellcode已成功执行,现在我有一个shell!

第三个缓冲区溢出

类似于第二个缓冲区溢出,但是涉及一个用开放的网络socket来接收用户输入: 

它以常用的socket样板代码开始,并绑定在指定为命令行参数的端口上。接受连接后,它将读取500字节,并发回用500字节输入格式化的字符串“nom nom nom, you sent me %s”。

该漏洞来自很小的sprintf()缓冲区,它只有52个字节长,如你在JEB stackframe中看到的那样:

我的策略与之前的漏洞类似,不过shellcode将是一个反向shell。

幸运的是,Jacob Holcomb已经对该方法有了详细的介绍,唯一的缺点是它连接到的IP是硬编码的:

为了方便使用这个shellcode,我添加了一条不能指向127.0.0.1或任何包含空字节的IP地址的指令。为了确保它的工作原理和调试偏移量,我会在JR $RA指令之前设置断点(Ctrl+B)并逐步用我的shellcode来运行JEB调试器中的漏洞。

然后我可以使用stepo调试器命令(或使用F6快捷方式),跳转到内存代码。

让我在端口31337上启动一个带有netcat的监听socket,并确认有一个shell:

原文发布时间为:2017年8月25日

本文作者:luochicun

本文来自合作伙伴嘶吼,了解相关信息可以关注嘶吼网站。

原文链接

时间: 2024-10-01 21:32:06

以DVRF(路由器漏洞靶机)为例解读JEB固件漏洞利用的相关文章

Flash MX实用编程百例解读一

编程 前些日子在网上下了<Flash MX 实用编程百例>,打开源代码看了一下,总的感觉例子还行,但代码太老,有的还是flash 4格式的,遂想将这些代码改编一下,一则也是一种学习,二则趁机将自己已有的知识梳理一下. Flash 实用编程百例解读一----透明度 放大及缩小 高品质和低品质 可见性 步骤 1.打开Flash MX 2004,新建文档,设置文档大小为300*300像素2.新建一按钮,将按钮拖至舞台上,复制6份,共产生7个按钮实例,并将它们排列好.3.用文字工具和线条工具在这些按钮

黑客的工作就是找漏洞,却忽略了最大的漏洞在哪儿

600余万个明文注册的邮箱账号和密码在网上遭到披露.警方历经40多天的缜密侦查,辗转10余个省市,最终破获这起用户数据泄露案,并成功带破另外4起网络泄密案件,共抓获并以涉嫌非法获取计算机数据罪刑事拘留曾某等5名"黑客".曾某承认于 2010年 4月利用CSDN网站漏洞,非法侵入服务器获取用户数据,此外,其还交代了曾经入侵过某充值平台及某股票系统. 同年的12月25日,天涯社区对外发布公告,同样称因黑客攻击,网站用户数据被盗. 今年,知名电商"1号店"多名注册用户内的

因图片处理软件一个漏洞,Facebook给出历史最高漏洞赏金

本文讲的是因图片处理软件一个漏洞,Facebook给出历史最高漏洞赏金, ImageMagick是一个免费开源的图像处理软件,用于创建.编辑.合成图片,可运行于大多数的操作系统,支持PHP.Ruby.NodeJS和Python等多种语言,使用非常广泛. 然而俄罗斯的安全研究员Andrew Leonov却在其上发现了一个漏洞,编号为CVE-2016-3714.ImageMagick处理的图片中可携带攻击代码,远程攻击者可利用它执行任意代码,甚至是控制服务器.2016年5月,该漏洞被公之于众,然而厄

D1net阅闻:97%的App都有漏洞 平均每个App有87个漏洞

希捷半月内第二次裁员 规模6500人主要针对制造部门   据外媒报道,硬盘生产商希捷周一宣布公司将在全球范围裁掉6500名员工,大约占员工总数的14%.希捷在不到两周之前刚刚宣布裁掉了1600名员工.   苹果挖角微软云计算高管 拓展数据中心   苹果公司目前正在计划扩展公司数据中心的基础设施,并且已成功挖角一名来自微软的云计算高管,使其转投苹果.   97%的App都有漏洞 平均每个App有87个漏洞   来自阿里巴巴的统计数据显示,2015年iOS漏洞增长1.28倍,Android漏洞增长1

漏洞预警!微软曝光震网三代漏洞,隔离网面临重大危机

北京时间6月14日,本月的微软补丁今天发布,经过360安全专家研判确认以下两个漏洞需要引起高度重视,采取紧急处置: LNK文件远程代码执行漏洞(CVE-2017-8464)和Windows搜索远程命令执行漏洞(CVE-2017-8543). 根据微软最新公告,LNK文件远程代码执行漏洞(CVE-2017-8464)已经发现了在野利用且具有国家背景,黑客可以通过U盘.光盘.网络共享等途径触发漏洞,完全控制用户系统,对基础设施等隔离网极具杀伤力,危害堪比前两代震网攻击. 该漏洞是一个微软Window

虚拟化漏洞呈增长趋势 VMware发布一批漏洞公告

本文讲的是 虚拟化漏洞呈增长趋势 VMware发布一批漏洞公告,11月22日,VMware发布两条安全建议,提请客户在该公司多个产品中打上信息披露漏洞的补丁. 建议之一描述了3个重要漏洞,影响的是 VCenter Server.VSphere Client 和 VRealize Automation.Positive Technologies 的研究人员发现了可导致信息披露的XML外部实体(XXE)漏洞,某些案例中可产生拒绝服务条件. 一个问题与单点登录功能相关,另一个则影响VMware旗下 L

漏洞漫舞的飞骋_漏洞研究

作者:玄猫[B.C.T]                                     网站:http://www.cnbct.org/&http://www.blackwoods.cn/   原件: http://www.cnbct.org/xuan1.doc   转载时,请注意版权,发于黑X2005年7期   一.前言.   初识飞骋似乎还是2002年,那时它推出了一个似乎叫飞骋邮局的东西,提供280M的空间(在当时算很大了),当时学SQL Injection的时候,曾用它练过手,

Flash 实用编程百例解读三

编程 前言:网络中的swf影片是可以实现边下载边播放的,由于受到当前网络传输的制约,对于大容量的影片,这种实时播放并不理想.为避免受众尴尬的等待,flash制作人员往往设计一个加载(loading)的画面,等影片的全部字节下载到本地后再播放,从而保证影片的播放质量.本文将介绍一种较为标准的loading制作方法. 步骤:1.打开Flash MX 2004,选择矩形工具,在主场景中画出下一个只有边框有矩形,本例该矩形大小为350*16像素.2.再在主场景中仍用矩形工具画出一个只有填充而无边框的矩形

Flash 实用编程百例解读

编程 前言:网络中的swf影片是可以实现边下载边播放的,由于受到当前网络传输的制约,对于大容量的影片,这种实时播放并不理想.为避免受众尴尬的等待,flash制作人员往往设计一个加载(loading)的画面,等影片的全部字节下载到本地后再播放,从而保证影片的播放质量.本文将介绍一种较为标准的loading制作方法. 步骤: 1.打开Flash MX 2004,选择矩形工具,在主场景中画出下一个只有边框有矩形,本例该矩形大小为350*16像素. 2.再在主场景中仍用矩形工具画出一个只有填充而无边框的