Firmware Analysis
Last updated
Last updated
学习和实践 AWS 黑客技术:HackTricks 培训 AWS 红队专家 (ARTE) 学习和实践 GCP 黑客技术:HackTricks 培训 GCP 红队专家 (GRTE)
固件是使设备正常运行的基本软件,通过管理和促进硬件组件与用户交互的软件之间的通信。它存储在永久内存中,确保设备在开机时能够访问重要指令,从而启动操作系统。检查和潜在修改固件是识别安全漏洞的关键步骤。
收集信息是理解设备构成和所用技术的关键初步步骤。此过程涉及收集以下数据:
CPU 架构和运行的操作系统
引导加载程序的具体信息
硬件布局和数据表
代码库指标和源位置
外部库和许可证类型
更新历史和监管认证
架构和流程图
安全评估和已识别的漏洞
为此,开源情报 (OSINT) 工具是不可或缺的,同时通过手动和自动审查过程分析任何可用的开源软件组件也很重要。像 Coverity Scan 和 Semmle’s LGTM 这样的工具提供免费的静态分析,可以用来发现潜在问题。
获取固件可以通过多种方式进行,每种方式的复杂程度不同:
直接从源头(开发者、制造商)
根据提供的说明进行构建
从官方支持网站下载
利用 Google dork 查询查找托管的固件文件
直接访问 云存储,使用工具如 S3Scanner
通过中间人技术拦截 更新
通过 UART、JTAG 或 PICit 等连接提取设备中的固件
在设备通信中嗅探更新请求
识别并使用 硬编码的更新端点
从引导加载程序或网络转储
在万不得已时,使用适当的硬件工具拆卸并读取存储芯片
现在你拥有固件,你需要提取有关它的信息,以了解如何处理它。你可以使用的不同工具有:
如果你用这些工具没有找到太多东西,可以用 binwalk -E <bin>
检查图像的 熵,如果熵低,那么它不太可能被加密。如果熵高,则很可能被加密(或以某种方式压缩)。
此外,你可以使用这些工具来提取 嵌入固件中的文件:
使用之前提到的工具,如 binwalk -ev <bin>
,你应该能够 提取文件系统。
Binwalk 通常会将其提取到一个 以文件系统类型命名的文件夹 中,通常是以下之一:squashfs、ubifs、romfs、rootfs、jffs2、yaffs2、cramfs、initramfs。
有时,binwalk 在其签名中没有文件系统的魔术字节。在这些情况下,使用 binwalk 查找文件系统的偏移量并从二进制文件中切割压缩的文件系统,并根据其类型使用以下步骤 手动提取 文件系统。
运行以下 dd 命令 切割 Squashfs 文件系统。
另外,可以运行以下命令。
$ 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>
)进行初步检查。这些命令有助于识别文件类型、提取字符串、分析二进制数据以及理解分区和文件系统的详细信息:
为了评估映像的加密状态,使用 binwalk -E <bin>
检查 entropy。低熵表明缺乏加密,而高熵则表示可能存在加密或压缩。
对于提取 embedded files,建议使用 file-data-carving-recovery-tools 文档和 binvis.io 进行文件检查的工具和资源。
使用 binwalk -ev <bin>
,通常可以提取文件系统,通常提取到一个以文件系统类型命名的目录中(例如,squashfs,ubifs)。然而,当 binwalk 由于缺少魔术字节而无法识别文件系统类型时,需要手动提取。这涉及使用 binwalk
定位文件系统的偏移量,然后使用 dd
命令提取文件系统:
之后,根据文件系统类型(例如,squashfs、cpio、jffs2、ubifs),使用不同的命令手动提取内容。
提取文件系统后,开始寻找安全漏洞。关注不安全的网络守护进程、硬编码凭据、API 端点、更新服务器功能、未编译代码、启动脚本和编译的二进制文件以进行离线分析。
关键位置和项目检查包括:
etc/shadow 和 etc/passwd 中的用户凭据
etc/ssl 中的 SSL 证书和密钥
配置和脚本文件中的潜在漏洞
嵌入的二进制文件以进行进一步分析
常见 IoT 设备的网络服务器和二进制文件
几个工具有助于揭示文件系统中的敏感信息和漏洞:
LinPEAS 和 Firmwalker 用于敏感信息搜索
固件分析和比较工具 (FACT) 用于全面的固件分析
FwAnalyzer、ByteSweep、ByteSweep-go 和 EMBA 用于静态和动态分析
必须仔细检查文件系统中发现的源代码和编译的二进制文件以寻找漏洞。像 checksec.sh 这样的工具用于 Unix 二进制文件,PESecurity 用于 Windows 二进制文件,帮助识别可能被利用的未保护二进制文件。
模拟固件的过程使得可以对设备的操作或单个程序进行动态分析。这种方法可能会遇到硬件或架构依赖性的问题,但将根文件系统或特定二进制文件转移到具有匹配架构和字节序的设备(例如 Raspberry Pi)或预构建的虚拟机上,可以促进进一步的测试。
检查单个程序时,识别程序的字节序和 CPU 架构至关重要。
要模拟 MIPS 架构的二进制文件,可以使用以下命令:
并安装必要的仿真工具:
对于 MIPS(大端),使用 qemu-mips
,而对于小端二进制文件,则选择 qemu-mipsel
。
对于 ARM 二进制文件,过程类似,使用 qemu-arm
模拟器进行仿真。
像 Firmadyne、Firmware Analysis Toolkit 等工具,促进了完整固件仿真,自动化了过程并帮助进行动态分析。
在这个阶段,使用真实或仿真的设备环境进行分析。保持对操作系统和文件系统的 shell 访问是至关重要的。仿真可能无法完美模拟硬件交互,因此需要偶尔重新启动仿真。分析应重新访问文件系统,利用暴露的网页和网络服务,并探索引导加载程序漏洞。固件完整性测试对于识别潜在后门漏洞至关重要。
运行时分析涉及在其操作环境中与进程或二进制文件进行交互,使用 gdb-multiarch、Frida 和 Ghidra 等工具设置断点,并通过模糊测试和其他技术识别漏洞。
为识别的漏洞开发 PoC 需要对目标架构的深入理解以及使用低级语言编程。嵌入式系统中的二进制运行时保护很少见,但在存在时,可能需要使用如返回导向编程(ROP)等技术。
操作系统如 AttifyOS 和 EmbedOS 提供了预配置的环境用于固件安全测试,配备了必要的工具。
AttifyOS:AttifyOS 是一个旨在帮助您对物联网(IoT)设备进行安全评估和渗透测试的发行版。它通过提供一个预配置的环境,加载所有必要的工具,为您节省了大量时间。
EmbedOS:基于 Ubuntu 18.04 的嵌入式安全测试操作系统,预装了固件安全测试工具。
要练习发现固件中的漏洞,可以使用以下漏洞固件项目作为起点。
OWASP IoTGoat
Damn Vulnerable Router Firmware Project
Damn Vulnerable ARM Router (DVAR)
ARM-X
Azeria Labs VM 2.0
Damn Vulnerable IoT Device (DVID)
学习和实践 AWS 黑客攻击:HackTricks Training AWS Red Team Expert (ARTE) 学习和实践 GCP 黑客攻击:HackTricks Training GCP Red Team Expert (GRTE)