hacktricks/physical-attacks/firmware-analysis
2024-02-09 02:09:47 +00:00
..
bootloader-testing.md Translated ['forensics/basic-forensic-methodology/memory-dump-analysis/R 2024-02-09 02:09:47 +00:00
firmware-integrity.md Translated ['forensics/basic-forensic-methodology/memory-dump-analysis/R 2024-02-09 02:09:47 +00:00
README.md Translated ['forensics/basic-forensic-methodology/memory-dump-analysis/R 2024-02-09 02:09:47 +00:00

固件分析

从零开始学习AWS黑客技术成为专家 htARTEHackTricks AWS Red Team Expert

支持HackTricks的其他方式

介绍

固件是一种基本软件,通过管理和促进硬件组件与用户交互的软件之间的通信,使设备能够正确运行。它存储在永久性存储器中,确保设备可以从通电时刻起访问重要指令,从而启动操作系统。检查和可能修改固件是识别安全漏洞的关键步骤。

收集信息

收集信息是了解设备构成和使用的技术的关键初始步骤。这个过程涉及收集以下数据:

  • CPU架构和运行的操作系统
  • 引导加载程序的具体信息
  • 硬件布局和数据表
  • 代码库指标和源位置
  • 外部库和许可证类型
  • 更新历史和监管认证
  • 架构和流程图
  • 安全评估和已识别的漏洞

为此,**开源情报OSINT**工具是非常宝贵的,通过手动和自动审查过程分析任何可用的开源软件组件。像Coverity ScanSemmles LGTM这样的工具提供免费的静态分析,可用于发现潜在问题。

获取固件

获取固件可以通过各种方式进行,每种方式都有其自己的复杂程度:

  • 直接从源头(开发人员、制造商)
  • 根据提供的说明构建固件
  • 从官方支持站点下载
  • 利用Google dork查询查找托管的固件文件
  • 直接访问云存储,使用诸如S3Scanner之类的工具
  • 通过中间人技术拦截更新
  • 通过UARTJTAGPICit等连接从设备提取
  • 在设备通信中嗅探更新请求
  • 识别和使用硬编码的更新端点
  • 从引导加载程序或网络转储
  • 当一切失败时,移除和读取存储芯片,使用适当的硬件工具

分析固件

现在您已经获得了固件,您需要提取有关固件的信息,以了解如何处理它。您可以使用不同的工具进行此操作:

file <bin>
strings -n8 <bin>
strings -tx <bin> #print offsets in hex
hexdump -C -n 512 <bin> > hexdump.out
hexdump -C <bin> | head # might find signatures in header
fdisk -lu <bin> #lists a drives partition and filesystems if multiple

如果使用这些工具没有找到太多信息,请使用 binwalk -E <bin> 检查图像的,如果熵低,则不太可能被加密。如果熵高,则很可能被加密(或以某种方式被压缩)。

此外,您可以使用这些工具来提取嵌入在固件中的文件

{% content-ref url="../../forensics/basic-forensic-methodology/partitions-file-systems-carving/file-data-carving-recovery-tools.md" %} file-data-carving-recovery-tools.md {% endcontent-ref %}

或者使用 binvis.io (code) 来检查文件。

获取文件系统

通过之前提到的工具,如 binwalk -ev <bin>,您应该已经能够提取文件系统
Binwalk通常会将其提取到一个以文件系统类型命名的文件夹通常是以下之一squashfs、ubifs、romfs、rootfs、jffs2、yaffs2、cramfs、initramfs。

手动提取文件系统

有时binwalk 在其签名中没有文件系统的魔术字节。在这些情况下使用binwalk来找到文件系统的偏移量并从二进制文件中切割压缩的文件系统,然后根据其类型手动提取文件系统,按照以下步骤操作。

$ binwalk DIR850L_REVB.bin

DECIMAL HEXADECIMAL DESCRIPTION
----------------------------------------------------------------------------- ---

0 0x0 DLOB firmware header, boot partition: """"dev=/dev/mtdblock/1""""
10380 0x288C LZMA compressed data, properties: 0x5D, dictionary size: 8388608 bytes, uncompressed size: 5213748 bytes
1704052 0x1A0074 PackImg section delimiter tag, little endian size: 32256 bytes; big endian size: 8257536 bytes
1704084 0x1A0094 Squashfs filesystem, little endian, version 4.0, compression:lzma, size: 8256900 bytes, 2688 inodes, blocksize: 131072 bytes, created: 2016-07-12 02:28:41

运行以下 dd 命令 对 Squashfs 文件系统进行切割。

$ dd if=DIR850L_REVB.bin bs=1 skip=1704084 of=dir.squashfs

8257536+0 records in

8257536+0 records out

8257536 bytes (8.3 MB, 7.9 MiB) copied, 12.5777 s, 657 kB/s

Alternatively, you can run the following command.

$ dd if=DIR850L_REVB.bin bs=1 skip=$((0x1A0094)) of=dir.squashfs

  • 对于 squashfs在上面的示例中使用

$ unsquashfs dir.squashfs

文件将位于“squashfs-root”目录中。

  • CPIO 存档文件

$ cpio -ivd --no-absolute-filenames -F <bin>

  • 对于 jffs2 文件系统

$ jefferson rootfsfile.jffs2

  • 对于 NAND 闪存的 ubifs 文件系统

$ ubireader_extract_images -u UBI -s <start_offset> <bin>

$ ubidump.py <bin>

分析固件

获取固件后,解剖固件以了解其结构和潜在漏洞至关重要。这个过程涉及使用各种工具来分析并从固件映像中提取有价值的数据。

初始分析工具

提供了一组命令,用于对二进制文件(称为 <bin>)进行初始检查。这些命令有助于识别文件类型,提取字符串,分析二进制数据,并了解分区和文件系统的详细信息:

file <bin>
strings -n8 <bin>
strings -tx <bin> #prints offsets in hexadecimal
hexdump -C -n 512 <bin> > hexdump.out
hexdump -C <bin> | head #useful for finding signatures in the header
fdisk -lu <bin> #lists partitions and filesystems, if there are multiple

评估图像的加密状态,可以使用 binwalk -E <bin> 检查。低熵表明缺乏加密,而高熵则表明可能存在加密或压缩。

要提取嵌入文件,建议使用file-data-carving-recovery-tools文档和binvis.io进行文件检查。

提取文件系统

使用 binwalk -ev <bin>,通常可以提取文件系统,通常会提取到以文件系统类型命名的目录中(例如 squashfs、ubifs。但是binwalk由于缺少魔术字节而无法识别文件系统类型时,就需要进行手动提取。这涉及使用 binwalk 定位文件系统的偏移量,然后使用 dd 命令切割出文件系统:

$ binwalk DIR850L_REVB.bin

$ dd if=DIR850L_REVB.bin bs=1 skip=1704084 of=dir.squashfs

文件系统分析

文件系统提取后开始搜索安全漏洞。注意不安全的网络守护程序、硬编码凭据、API 端点、更新服务器功能、未编译代码、启动脚本以及用于离线分析的已编译二进制文件。

需要检查的关键位置项目包括:

  • etc/shadowetc/passwd 中的用户凭据
  • etc/ssl 中的 SSL 证书和密钥
  • 潜在漏洞的配置和脚本文件
  • 用于进一步分析的嵌入式二进制文件
  • 常见物联网设备的 Web 服务器和二进制文件

有几种工具可帮助揭示文件系统中的敏感信息和漏洞:

对已编译二进制文件进行安全检查

必须仔细审查文件系统中找到的源代码和已编译二进制文件以查找漏洞。像 checksec.sh 用于 Unix 二进制文件,PESecurity 用于 Windows 二进制文件等工具有助于识别可能被利用的未受保护的二进制文件。

模拟固件进行动态分析

模拟固件的过程使得可以对设备的操作或单个程序进行动态分析。这种方法可能会遇到硬件或架构依赖性的挑战,但将根文件系统或特定二进制文件传输到具有匹配架构和字节序的设备(如树莓派)或预构建的虚拟机,可以促进进一步测试。

模拟单个二进制文件

对于检查单个程序,识别程序的字节序和 CPU 架构至关重要。

MIPS 架构示例

要模拟 MIPS 架构二进制文件,可以使用以下命令:

file ./squashfs-root/bin/busybox

并安装必要的仿真工具:

sudo apt-get install qemu qemu-user qemu-user-static qemu-system-arm qemu-system-mips qemu-system-x86 qemu-utils

MIPS架构仿真

对于MIPS大端架构使用qemu-mips,对于小端二进制文件,选择qemu-mipsel

ARM架构仿真

对于ARM二进制文件过程类似使用qemu-arm仿真器进行仿真。

完整系统仿真

类似FirmadyneFirmware Analysis Toolkit等工具可实现完整固件仿真,自动化流程并协助动态分析。

实践中的动态分析

在此阶段使用真实或仿真设备环境进行分析。保持对操作系统和文件系统的shell访问至关重要。仿真可能无法完全模拟硬件交互可能需要偶尔重新启动仿真。分析应重新查看文件系统利用暴露的网页和网络服务探索引导加载程序漏洞。固件完整性测试对于识别潜在后门漏洞至关重要。

运行时分析技术

运行时分析涉及使用诸如gdb-multiarch、Frida和Ghidra等工具与进程或二进制文件在其操作环境中交互通过模糊测试等技术设置断点并识别漏洞。

二进制利用和概念验证

为已识别的漏洞开发概念验证PoC需要深入了解目标架构并使用低级语言进行编程。嵌入式系统中的二进制运行时保护很少见但存在时可能需要使用Return Oriented ProgrammingROP等技术。

用于固件分析的准备操作系统

操作系统如AttifyOSEmbedOS提供了预配置的固件安全测试环境,配备必要工具。

用于分析固件的准备操作系统

  • AttifyOSAttifyOS是一个旨在帮助您执行物联网IoT设备的安全评估和渗透测试的发行版。通过提供预配置环境并加载所有必要工具为您节省大量时间。
  • EmbedOS基于Ubuntu 18.04的嵌入式安全测试操作系统,预装有固件安全测试工具。

用于练习的易受攻击固件

要练习在固件中发现漏洞,可以使用以下易受攻击的固件项目作为起点。

参考资料

培训和认证