AICon 上海站|90%日程已就绪,解锁Al未来! 了解详情
写点什么

物联网渗透测试(十二):MIPS 架构下的漏洞利用

  • 2020-05-20
  • 本文字数:3951 字

    阅读完需:约 13 分钟

物联网渗透测试(十二):MIPS 架构下的漏洞利用

编者按:本文节选自华章网络空间安全技术丛书《物联网渗透测试》一书中的部分章节。

MIPS 架构下的漏洞利用

现在我们已经掌握了逆向二进制文件的基本方法,那么是时候深入了解如何对 IoT 设备所采用的主要平台架构开展漏洞利用了。由于本节内容只是帮助读者了解二进制文件漏洞利用的基础知识,所以在这里我们只关注 MIPS 架构,但是强烈建议读者采用相同的方法自行针对基于 ARM 的架构开展漏洞利用练习。

准备工作

为了开展 MIPS 架构下的漏洞利用,在这里我们主要使用 QEMU 仿真器和 chroot 命令,这些内容我们在本章开头已经进行了简要介绍。现在将研究如何在 MIPS 二进制文件中进行缓冲区溢出漏洞利用,并改变程序的执行流程使其跳转到我们想要执行的内容,而不是程序原本应该执行的代码。为了简化漏洞利用过程,在这里我们不会涉及诸如面向返回的编程(Return Oriented Programming,ROP)之类的内容,这样可以使利用过程尽量简单一些。

测试流程

在这个练习中需要用到以下工具:


  • 路由器漏洞攻防演练靶机(Damn Vulnerable Router Firmware,DVRF)—该靶机可以从 GitHub 下载

  • GDB-Multiarch

  • GDB Enhanced Features(GEF 脚本)

  • QEMU

  • chroot

  • IDA Pro/Radare2(可选)


下面我们将对上述工具及其安装部署方式进行逐一介绍。首先从下面的 URL 链接下载 DVRF 固件:


https://github.com/praetorian-inc/DVRF/tree/master/Firmware


DVRF 是由 b1ack0wl 专门为 MIPS 平台开发的固件。尽管该固件原本用于 Linksys E1550 设备,但其也可以在基于 QEMU 的仿真环境中运行,我们随后开展的漏洞利用也在该环境中加以演示:


1)现在我们已经拿到了固件,为了便于漏洞利用过程中的调试,接下来安装 GDB(GNU 调试器)和 GEF:


sudo apt install gdb-multiarch# Installing GEFsudo pip3 install capstone unicorn keystone-enginewget -q -O- https://github.com/hugsy/gef/raw/master/gef.sh | sh
复制代码


同时还要确保已经在系统中安装了所需的 QEMU 软件包。现在我们已经准备就绪了,接下来利用 QEMU 提供的二进制仿真功能运行其中的二进制文件。


2)仿真之前,首先需要使用 Binwalk 工具从固件中提取出文件系统,操作命令如图 1 所示。



图 1


3)提取出文件系统后,就可以将对应架构下的 QEMU 二进制文件复制到文件系统的根目录下,在本例中是 squashfs-root 文件夹,如图 2 所示。但是在此之前需要确认目标二进制文件是基于 MIPS 架构的,通过 readelf 命令可以查看目标二进制文件的架构信息。



图 2


4)根据图 2 所示,目标二进制文件需要运行在小端的 MIPS 架构上,如图 3 所示。



图 3


5)此时将针对小端 MIPS(mipsel)架构的 QEMU 二进制文件复制到 squashfs-root 文件夹下:


cp $(which qemu-mipsel-static) .
复制代码


6)将 qemu-mipsel-static 文件复制到当前文件夹下后,再使用 chroot 命令和 QEMU 虚拟机仿真运行目标二进制文件,同时使二进制文件认为其根目录就是当前我们执行命令的目录。上述操作命令如下:


Sudo chroot . ./qemu-mipsel-static pwnable/Intro/stack_bof1
复制代码


7)运行结果如图 4 所示,即使某个二进制文件最初是针对其他架构开发的,我们依然能够运行该文件。基于 QEMU 虚拟机对目标系统的仿真,再通过 chroot 命令对根目录进行调整,上述操作是可能实现的。



图 4


8)正如我们在命令输出结果所看到的那样(如图 4 所示),该二进制文件在运行时需要输入参数。此外,如果我们查看目标二进制文件的源代码,会发现该文件存在栈溢出漏洞。图 5 是二进制文件 stack_bof_01 的源代码。



图 5


从源代码中不难发现,变量 buf 在栈中的缓冲区容易遭受缓冲区溢出攻击,而实施溢出攻击的目的则在于修改程序执行流程,使其指向 dat_shell 的地址,这样我们就可以利用该漏洞来获得 shell。


9)现在开始调试程序,运行 QEMU 和 chroot 命令,运行 chroot 命令时使用参数-g 把调试器 GDB 附加到进程之上:


sudo chroot . ./qemu-mipsel-static -g 1234./pwnable/Intro/stack_bof1
复制代码


10)如图 6 所示,此时程序暂停执行,等待调试器的连接。



图 6


11)程序暂停运行后,我们即可以启动 GDB 调试器,使用之前分配的端口连接目标进程进行远程调试。另外我们还需要将架构设置为 MIPS 以确保能够正确地反汇编二进制文件,如图 7 所示。



图 7


12)当我们连接上目标进程时,会发现进程已经暂停,此时可以输入字符 c 让进程继续执行。


13)我们还可以输入 info functions 命令在屏幕上打印出二进制文件中可用函数的列表,如图 8 所示,这样可以帮助分析人员从渗透测试的角度查找可能存在漏洞的函数。



图 8


14)接下来输入 disass main 命令反汇编 main 函数查看函数内部结构。


15)disass main 命令的执行结果如图 9 所示,此时得到 main 函数的反汇编代码。



图 9


如果读者熟悉反汇编结果中的某些指令,会发现这些指令非常有用。反汇编结果中依次指示了指令地址、指令和操作数。


MIPS 架构中共包含 32 个通用寄存器,分别是$zero、$at、$v0~$v1、$a0~$a3、$t0~$t9、$s0~$s7、$k0、$k1、$gp、$sp、$fp 和$ra。在这些寄存器中,$a0~$a3 寄存器的作用是存放函数参数,$t0~$t9 寄存器用于临时数据存储,$gp 寄存器存放全局指针(在利用过程中尽量不要修改$gp 寄存器的值),$sp 寄存器存放栈指针,$fp 寄存器存放帧指针,$ra 寄存器存放返回地址。另外还有一个专用寄存器即程序计数器(Program Counter,PC),其作用是存储下一条指令的内存地址,也就是当前正在执行指令的下一条指令。


为了控制基于 MIPS 架构的二进制代码执行流程,我们主要关注 2 个寄存器,即 RA 寄存器和 PC 寄存器。在处理 MIPS 架构下的二进制文件时,读者可能已经意识到相对于 RA 寄存器而言,控制 PC 寄存器中的内容更加复杂。因此,为了简单起见,在本练习中我们将主要关注如何控制 RA 寄存器中的内容。


16)由于我们已经知道了当前分析的二进制文件 stack_bof_01 中存在栈溢出漏洞,因此在程序运行时可以尝试带上一个非常长的参数。我们将使用 GEF 的模式字符串创建功能生成该参数,运行结果如图 10 所示。



图 10


17)生成了测试用的模式字符串后,我们就可以将其作为程序 stack_bof_01 的参数运行程序,看看执行过程中是否会导致 RA 寄存器溢出。本例中,我们使用 GEF 生成了 300 个字符长的字符串,以该字符串为参数,程序 stack_bof_01 后的执行情况如图 11 所示。



图 11


18)正如我们所预期的一样,由于在命令中使用了-g 参数,命令执行后二进制文件处于暂停状态,等待调试器附加进来。现在打开 GEF 终端窗口敲入 target 命令,命令执行结果如图 12 所示。


target remote 127.0.0.1:1234
复制代码



图 12


19)使用 target 命令完成远程主机 IP 与端口的设置后,我们输入命令 c,程序将继续执行直到出现以下三种情况之一,即运行完成、命中断点或者出现异常。本例中,程序在执行过程中出现了 SIGSEGV 错误,如图 13 所示。



图 13


GEF 还显示出了捕获异常时栈和寄存器的全部状态。在本例中,我们可以看到 RA 寄存器中的值被覆盖为 0x63616162,这正是字符串 baac 的十六进制形式。


了解了上述信息后,可以使用模式搜索功能找到覆盖 RA 寄存器的字节的偏移。取得了偏移之后,我们就找到了放置恶意地址的位置,进而能够控制程序的执行流程。


20)我们可以使用命令 pattern search RA-overflown-bytes-in-hex 实现模式字符串的搜索工作,搜索命令如 14 所示。



图 14


根据命令执行结果,我们找到了导致寄存器 RA 溢出的字符串的偏移,在本例中该偏移为 204。这意味着访问到 RA 寄存器之前需要填充 204 字节的垃圾字节,而接下来的 4 个字节就是填充 RA 寄存器的值。


21)如果读者还记得本次练习的目的在于更改程序的执行流程,并调用在程序正常流程中原本不会调用的 dat_shell 函数,那么下一步工作就是确定 dat_shell 函数的地址。为了找到 dat_shell 函数的地址,我们要么打印出 dat_shell 函数的地址,要么通过反汇编查找 dat_shell 函数的起始地址。这可以通过命令 disass function-name 来完成,执行结果如图 15 所示。



图 15


从在上面的截图中我们可以看到,dat_shell 函数的起始地址为 0x00400950。然而,前 3 条指令中用到了全局指针(GP 寄存器),而我们并不希望在这个时候使用该指针,这就是我们跳转到 0x0040095c 而不是 0x00400950 的原因。


22)接下来在地址 0x0040095c 后填充 204 个垃圾字符后,继续运行二进制文件,这次我们去掉了参数-g,执行如下命令:


sudo chroot . ./qemu-mipsel-static ./pwnable/Intro/stack_bof_01"$(python -c "print 'A'*204 +  '\x5c\x09\x40'")"
复制代码


在图 16 中可见,二进制文件现在已经执行了我们想要执行的 dat_shell 函数。上述内容就是如何在 MIPS 架构下开展栈溢出漏洞利用的过程。

测试分析

缓冲区溢出漏洞的基本思路是在缓冲区中放入超过程序预期长度的字符串,这样就可以控制栈中的寄存器。而控制了栈中的寄存器就可以跳转到 shellcode 的位置或系统的 libc 库来执行其他载荷。



图 16

拓展学习

尽管在实验环境中我们成功对存在漏洞的二进制文件实现了漏洞利用,但通常在现实情况中遇到的场景更为复杂。其中一种情况是我们希望利用的函数在现实二进制文件中却并不存在,此时攻击者就需要跳转到 system 函数来执行 bin/sh,或者创建 ROP 链执行自己的 shellcode。


图书简介https://item.jd.com/12623610.html



相关阅读


物联网渗透测试(一):简介


物联网渗透测试(二):IoT 中的 Web 应用


物联网渗透测试(三):IoT 中的 移动应用


物联网渗透测试(四):IoT 渗透测试环境的部署


物联网渗透测试(五):威胁建模概念简介


物联网渗透测试(六):IoT 设备威胁建模剖析


物联网渗透测试(七):固件威胁建模


物联网渗透测试(八):IoT Web 应用威胁建模


物联网渗透测试(九):IoT 移动应用威胁建模


物联网渗透测试(十):固件分析方法


物联网渗透测试(十一):固件分析流程


2020-05-20 10:001414

评论

发布
暂无评论
发现更多内容

在阿里巴巴内网找到的一份《Java核心宝典》简直太细了,如获至宝!

Java架构之路

Java 程序员 架构 面试 编程语言

你敢信?就是这个Netty的网络框架差点把我整疯了,哭jj

996小迁

Java 架构 面试 Netty

二层交换机和三层交换机之间VLAN的区别

Swift性能优化分析

ios swift

刷完这两份pdf轻松拿下了蚂蚁金服、头条、小米等大厂的offer。

Java架构之路

Java 程序员 架构 面试 编程语言

安卓开发不得不会!啃下这些Framework技术笔记,成功入职阿里

欢喜学安卓

android 程序员 编程开发 Android进阶

架构师训练营 1 期 -- 第十二周总结

曾彪彪

极客大学架构师训练营

如何通过易观Argo,免费快速搭起精细化运营平台?

易观大数据

TRX波场智能合约APP系统开发|TRX波场智能合约软件开发

系统开发

小熊派开发实践丨小熊派+合宙Cat.1接入云服务器

华为云开发者联盟

IoT 小熊派 实践

大厂iOS面试题全面讲解(上)

ios 面试

3种缓存读写策略都不了解?面试很难让你通过啊兄弟!

Java架构师迁哥

LeetCode题解:45. 跳跃游戏 II,贪心从后向前,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

中国SaaS的病与痛?

ToB行业头条

金九银十Android热点知识!架构师花费近一年时间整理出来的安卓核心知识,送大厂面经一份!

欢喜学安卓

程序员 面试 编程开发 Android进阶 Android开发

卧槽,牛皮了!某程序员苦刷这两份算法PDF47天,四面字节斩获心仪大厂offer!

Java架构之路

Java 程序员 架构 面试 编程语言

性能之巅:定位和优化程序CPU、内存、IO瓶颈

华为云开发者联盟

性能 cpu 优化

测试右移之日志收集与监控

BY林子

敏捷 软件测试

Nginx做web服务器linux内核参数优化

赖猫

c++ Linux 编程 后台开发 内核

ChaosBlade x SkyWalking 微服务高可用实践

阿里巴巴云原生

微服务 云原生 监控 混沌工程 CloudNative

架构师训练营第一期 - 第十一周学习总结

卖猪肉的大叔

极客大学架构师训练营

linux命令:查询占用端口文件所在位置

梁小航航

Linux

华为工程师:扔掉你手里的其他Netty资料吧,有这份足以

小Q

Java 学习 面试 Netty 网络

iOS逆向学习(arm64汇编入门)

ios 汇编

不为人知的网络编程(十):深入操作系统,从内核理解网络包的接收过程(Linux篇)

JackJiang

Linux 网络编程 TCP/IP

六度空间软件系统开发|六度空间APP开发

系统开发

Alibaba Java面试题大揭秘,把这些知识点吃透去面试成功率高达100%

Java架构之路

Java 程序员 架构 面试 编程语言

某Javva程序员金秋9月靠这份文档涨薪10K,你把这份Java进阶文档吃透涨薪超简单!

Java架构之路

Java 程序员 架构 面试 编程语言

4项探索+4项实践,带你了解华为云视觉预训练研发技术

华为云开发者联盟

AI 华为云 modelarts

浅谈ToB市场精细化运营

Linkflow

营销数字化 客户数据平台 CDP 精细化运营

足不出户带你体验专业实验室,技术实现不在话下

华为云开发者联盟

体验 平台 实验

物联网渗透测试(十二):MIPS 架构下的漏洞利用_安全_亚伦·古兹曼,阿迪蒂亚·古普塔_InfoQ精选文章