物联网固件逆向工程基础
2023-3-19 21:0:0 Author: xz.aliyun.com(查看原文) 阅读量:9 收藏

物联网(IoT)是当今的热门话题,在这些设备中发现的关键漏洞数量巨大。由于这些设备通常连接到内部网络,因此成功的探索会给组织带来巨大的风险,犯罪分子会访问内部网络,因为最佳实践和网络安全指南尚未到位。

固件是嵌入在物联网设备中的软件的名称。这段代码提供对特定于设备的硬件组件的低级别控制。尽管在过去几年中已使用加密来保护设备的固件映像文件,但理解和发现弱点的原则与过去使用的原则相同。

首先,我们需要从官方存储库下载固件文件。如果无法做到这一点,请了解更新过程是如何完成的,并模拟对文件的合法访问。一个真实且常见的例子是设备在需要将固件更新到最新版本时使用自定义用户代理。通过拦截请求,我们可以轻松获取它们。

接下来的步骤没有神奇执行顺序。根据固件的不同,可能需要解密文件的映像保护机制,或者只是通过用户或完全仿真来解压缩和模拟文件。在下一节中,我们将简要了解如何做到这一点。

使用 binwalk 提取固件

在这个实验室中,我们将使用华硕的型号RT-AC5300。要查看固件文件中嵌入的文件,我们需要使用拼图工具。使用选项“-e”,可以从.trx文件中提取所有文件。


如屏幕截图所示,固件使用小端序来表示硬件字节。根据 binwalk 签名,设备在 3X ARM 版本或次要版本上执行(我们稍后会确认这一点)。

运行 binwalk 后,我们可以浏览路由器文件系统并分析源代码文件。这是一个完美的场景,使用 binwalk 进行简单的迭代带来了整个 www 文件系统。


从这一点开始,我们可以静态检查每个文件,或者简单地使用源代码静态分析器来查找潜在漏洞的入口点。

然而,挑战并不止于此。很多时候,部分运行文件系统(用户仿真)或以完整模式运行使我们能够识别奇怪的行为,甚至在运行时与系统交互,而无需通过设备支付大量费用。是时候了解两种不同类型的仿真了。

用户模式仿真

首先,获取有关我们要模拟的文件系统的扩展信息非常重要。此步骤对于使用实际设备上使用的相同变量和组件创建确切的环境至关重要。

通过分析“1C”文件;在执行 binwalk 工具时提取;我们可以观察到有趣的信息,即:

存在一些重要的路径(/dev 和 /root);
Linux 内核版本 2.6.36


在这些情况下,字符串实用程序是检索有关文件系统的更多信息的好朋友。使用以下命令行,我们可以获取有关“/root/initrd”文件的详细信息。

cat 1C | strings | grep "version"
Linux version 2.6.36.4brcmarm (yau@yau.chang) (gcc version 4.5.3 (Buildroot 2012.02) ) #1 SMP PREEMPT Fri Mar 4 20:12:49 CST 2016

2.6.36.4brcmarm SMP preempt mod_unload modversions ARMv7 

slabinfo - version: 2.1

squashfs: version 4.0 (2009/01/31) Phillip Lougher

cat 1C | strings | grep "/etc/" 
/etc/init
cat 1C | strings | grep "/root/"
/root/initrd

initrd 是用于引导文件系统的文件,我们稍后可以使用它通过 BuildRoot 工具引导系统。

总之,我们从文件中获得了以下信息:

内核版本:2.6.36.4
GCC 版本 4.5.3
构建根 2012.02(用于编译根 FS)
ARMv7 处理器 – 双核 32 位 ARMv7 (Cortex-A9) @ 1.4GHz
FS ini 存在于 /etc 和 /root 文件夹中
检查设备配置的另一个好方法是访问供应商页面或从互联网获取设备数据表。

为了模拟固件文件系统上可用的 HTTP 服务器,我们需要使用 qemu-user-static 方法。因此,通过在 rootfs 文件夹中移动静态二进制文件“qemu-arm-static”,我们可以执行 chroot 并在用户空间模式下模拟二进制文件。有关此技术的更多详细信息,请参阅此文章

which qemu-arm-static
/usr/bin/qemu-arm-static 

cp /usr/bin/qemu-arm-static squashfs-root/

cd squashfs-root/

sudo chroot . ./qemu-arm-static /bin/sh


此时,可以执行命令“httpd”以运行www服务器。尽管如此,可能会出现一些错误,例如与NVRAM相关的错误。这是我们在仿真固件期间面临的典型问题。有关如何模拟 NVRAM 的详细信息,请参阅本节。

设置 NVRAM 环境后,我们需要将路径导出到 “LD_PRELOAD” env var 中。再次运行 httpd 命令,文件系统将执行并与之交互。

sudo chroot . ./qemu-arm-static /bin/sh
export LD_PRELOAD="/firmadyne/libnvram.so"

httpd


如前所述,下一步是在 /etc/cert.pem 文件夹中创建一个证书。从这一点开始,就没有秘密了。我们需要跟踪启动路由器登录页面时出现的所有错误。

但是,qemu-static 方法在启动单个程序而不是整个文件系统时很有用。Httpd将启动所有路由器软件,在这种情况下,完全仿真将更有益,并且可能不那么难以实现。

完全仿真

当字符串命令被执行时,我们得到了一个有趣的字符串:Buildroot 2012.02。这表示用于编译内核版本 2.6.36 的文件系统的版本。简而言之,buildroot 是一个简单、高效且易于使用的工具,用于通过交叉编译生成嵌入式 Linux 系统。我们可以选择新目标系统的每个组件和所有特征,并从头开始编译一个新的内核。但首先,我们需要知道目标系统的详细信息,这就是我们在上一节中所做的。

此存储库获取正确版本的 Buildroot 后,必须提示命令“make menuconfig”,并选择最合适的选项。


本文中可以看到更多详细信息和扩展步骤。

最后,可以使用 make 命令编译内核。会发生一些错误,因此我们需要修复它们并学习很多东西。最后,将从头开始创建一个旧内核。

这样的结构将出现在我们的输出/图像文件夹中:

-rw-r--r-- 1 kali kali 62914560 Jul 27 18:30 rootfs.ext2
-rw-r--r-- 1 kali kali 1437696 Jul 27 18:30 rootfs.squashfs

-rw-r--r-- 1 kali kali 4085760 Jul 27 18:30 rootfs.tar

-rwxr-xr-x 1 kali kali 446 Jul 27 18:30 start-qemu.sh

-rwxr-xr-x 1 kali kali 8880 Jul 27 18:27 versatile-pb.dtb

-rw-r--r-- 1 kali kali 2871872 Jul 27 18:27 zImage

可以使用以下命令实现完全仿真:

qemu-system-arm -M versatilepb -kernel zImage -dtb versatile-pb.dtb -drive file=rootfs.ext2,if=scsi,format=raw -append "rootwait root=/dev/sda console=ttyAMA0,115200"


从这一点开始,我们可以与路由器的登录页面进行交互,并使用 burp-suite 对其进行调试,以查找通常由从初始固件映像中提取的文件系统内可用的组件或软件调用或引入的 Web 漏洞。

关于逆向工程的最终想法

固件的仿真并非易事,因为没有神奇的公式可以做到这一点。每个固件文件都是唯一的,根据文件的复杂性和保护,该过程可能很困难。例如,在旧内核版本下执行固件可能是一项艰巨的任务,主要是修复我们在此过程中可能出现的所有错误。另一方面,加密的使用增加了额外的复杂性。诀窍包括分析目标设备的旧固件版本,以了解加密过程如何工作或从实际设备获取解压缩的固件。

总之,仿真固件带来了许多好处,包括无需购买真实设备即可测试软件。让我们认真分析固件。

翻译至地址:https://resources.infosecinstitute.com/topic/fundamentals-of-iot-firmware-reverse-engineering/


文章来源: https://xz.aliyun.com/t/12320
如有侵权请联系:admin#unsafe.sh