东亚银行、岚图汽车带你解锁 AIGC 时代的数字化人才培养各赛道新模式! 了解详情
写点什么

物联网渗透测试(十二):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:001063

评论

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

机械加工行业云MES解决方案

万界星空科技

工业互联网 制造业 生产管理系统 mes 机械臂

观测云产品更新 | 单点登录新增 OIDC / Oauth2.0 协议、数据转发优化、场景优化等

观测云

可观测性 单点登录 #数据分析

TiDB故障处理之让人迷惑的Region is Unavailable

TiDB 社区干货传送门

集群管理 故障排查/诊断 扩/缩容

Mac电脑版红巨星粒子插件 Red Giant Trapcode Suite激活中文版

mac大玩家j

Mac软件 红巨星粒子插件 视觉效果插件

您的代理记账企业的数字化保卫和合作伙伴-智慧云

知者如C

趋势:国产数据库发展的五个一体化

科技热闻

飞码LowCode前端技术:如何便捷配置出页面 | 京东云技术团队

京东科技开发者

前端 低代码 低代码平台 企业号11月PK榜

自动化API测试工具ReadyAPI新增业务历史记录功能

龙智—DevSecOps解决方案

ReadyAPI

大模型在代码缺陷检测领域的应用实践

百度Geek说

知识图谱 大模型 企业号11月PK榜

TiDB基础运维操作汇总

TiDB 社区干货传送门

管理与运维 故障排查/诊断 6.x 实践

混音师必备软件:iZotope Ozone 11激活最新

胖墩儿不胖y

Mac软件 音频处理工具 母带处理软件

jar包的精细化运营,Java模块化简介 | 京东云技术团队

京东科技开发者

Java Java9 模块化 jar包

探秘英伟达显卡的制造之路 | 英伟达断供GPU,中国大模型何去何从?

蓝海大脑GPU

实用PCB拼版攻略,您的拼版合理吗?

华秋电子

拼板

ATC汽车电子与软件技术周:汽车行业客户使用静态代码扫描工具的案例与建议

龙智—DevSecOps解决方案

ACT

万界星空科技MES与WMS如何集成的?

万界星空科技

数字化转型 工业互联网 wms mes 3D仓库

PCB设计安规丨电气间隙与爬电距离要点

华秋电子

Nginx 知识点一网打尽:动静分离、压缩、缓存、跨域、高可用、性能优化

郑在暴富中

nginx 高可用 反向代理

OpenTiny Vue 3.11.0 发布:增加富文本、ColorPicker等4个新组件,迎来了贡献者大爆发!

OpenTiny社区

开源 TinyVue 前端组件库

【TiDB 社区智慧合集】史上最全的 158篇 TiDB 用户实践合集来啦!千万不要错过!

TiDB 社区干货传送门

vivo 网络端口安全建设技术实践

vivo互联网技术

网络端口风险治理 端口扫描 流量行为基线 端口管理规范 漏洞扫描平台

如何使用 NFTScan NFT API 在 Polygon 网络上开发 Web3 应用

NFT Research

NFT NFT\ NFTScan nft工具 API 接口

MegEngine 9-10 双月报:新版本发布,AI 生态升级,不容错过!

MegEngineBot

深度学习 开发者 开源社区 MegEngine

安全审计 合约审计:代币开发公司的一个关键方面

区块链软件开发推广运营

交易所开发 dapp开发 链游开发 NFT开发

【实践篇】一次Paas化热部署实践分享 | 京东云技术团队

京东科技开发者

热部署 PaaS平台化能力 企业数字化 PaaS 平台 企业号11月PK榜 Paas化

Windows、Linux 和 Mac:操作系统之间的比较

小齐写代码

活动回顾|OpenTiny 参与线下大会:共创开源未来,助力低代码技术创新

OpenTiny社区

开源 前端 低代码 UI组件库

KiCon Asia 2023 深圳

华秋电子

KiCon

TiDB x 北京银行丨新一代分布式数据库的探索与实践

TiDB 社区干货传送门

实践案例

新形势下芯片研发如何实现数智化转型,革“芯”未来?龙智即将携手Perforce及Atlassian亮相ICCAD 2023

龙智—DevSecOps解决方案

ICCAD

QCN9074 QCN9024|DR9074E Compatible with DR4019 Platform OpenWrt

wallyslilly

QCN9074 QCN9024

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