Firmware Security Testing Methodology(FSTM)
https://github.com/scriptingxss/owasp-fstm/
1.信息收集 |
获取有关目标设备固件的所有相关技术文档的详细信息 |
2.获取固件 |
使用列出的一种或多种建议的方法获得固件 |
3.分析固件 |
检查目标固件的特征 |
4.提取文件系统 |
从目标固件中获取文件系统 |
5.分析文件系统 |
静态分析提取的文件的系统配置文件和二进制文件中的漏洞 |
6.固件仿真 |
模拟固件文件和组件 |
7.动态分析 |
针对固件和应用程序接口执行动态安全性测试 |
8.运行时分析 |
在设备运行时分析编译的二进制文件 |
9.二进制漏洞利用 |
利用在上述手段发现的漏洞来实现代码执行 |
在此阶段,请收集有关目标的尽可能多的信息,以了解其基础技术的总体组成。尝试收集以下内容:
免费的静态代码扫描工具:
https://github.com/mkj/dropbear
https://scan.coverity.com/
https://lgtm.com/#explore
http://www.denx.de/wiki/U-Boot/WebHome
要开始查看固件内容,必须获取固件映像文件。尝试使用以下一种或多种方法获取固件内容:
*注意:从公开的云提供商存储服务下载数据时,请确保遵守当地法律法规。
列出的每种方法的难度各不相同,不应视为详尽的列表。根据项目目标和参与规则选择适当的方法。如果可能,请请求固件的调试版本和发布版本,以在发布版本中编译调试代码或功能时最大程度地覆盖测试用例。
获取固件映像后,请浏览文件的各个方面以识别其特征。使用以下步骤分析固件文件类型,潜在的根文件系统元数据,并进一步了解为其编译的平台。
利用binutils,例如:
file
strings
strings -n5
binwalk
hexdump -C -n 512 > hexdump.out
hexdump -C | head # might find signatures in header
如果以上方法均未提供任何有用的数据,则可能会发生以下情况:
如果二进制文件可以加密,请使用binwalk使用以下命令检查熵:
$ binwalk -E
低熵=不太可能被加密;
高熵=可能已加密(或以某种方式压缩)。
也可以使用Binvis在线和独立应用程序使用其他工具。
此阶段涉及查看固件内部并解析相关文件系统数据,以开始识别尽可能多的潜在安全问题。使用以下步骤提取固件内容,以检查以下阶段中使用的未编译代码和设备配置。自动和手动提取方法如下所示。
1.使用以下工具和方法来提取文件系统内容:
$ binwalk -ev
文件将提取到“ _binaryname/filesystemtype/”
文件系统类型:squashfs,ubifs,romfs,rootfs,jffs2,yaffs2,cramfs,initramfs;
2a.有时,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
2b.运行以下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
或者,也可以运行以下命令。
$ dd if=DIR850L_REVB.bin bs=1 skip=$((0x1A0094)) of=dir.squashfs
2c.对于squashfs文件(在上面的示例中使用)
$ unsquashfs dir.squashfs
之后,文件将位于“ squashfs-root”目录中。
2d.CPIO存档文件
$ cpio -ivd --no-absolute-filenames -F
2f.对于jffs2文件系统
$ jefferson rootfsfile.jffs2
2d.对于具有NAND闪存的ubifs文件系统
$ ubireader_extract_images -u UBI -s
$ ubidump.py
在此阶段,将收集有关动态和运行时分析阶段的线索。研究目标固件是否包含以下内容(非穷举性):
手动静态分析文件系统内容和未编译的代码,或利用诸如Firmwalker之类的自动化工具来分析以下内容:
以下小节介绍了开源自动固件分析工具。
一个用于搜索固件文件系统敏感信息的脚本;对已解包的固件系统使用,搜索其中的敏感文件内容。
在~/tools/firmwalker的目录中执行firmwalker,并将firmwalker指向提取的文件系统根目录的绝对路径。Firmwalker使用/data/目录中的信息来解析规则,可以在GitHub上的https://github.com/scriptingxss/firmwalker上找到由Aaron Guzman修改并带有其他检查的自定义派生。在OWASP的IoTGoat上使用的firmwalker。其他易受攻击的固件项目在文档末尾的“ 易受攻击的固件”部分中列出。
$ ./firmwalker.sh /home/embedos/firmware/ _IoTGoat-rpi-2.img.extracted/squashfs-root/
将生成两个文件firmwalker.txt和firmwalkerappsec.txt。
https://github.com/fkie-cad/FACT_core
FACT功能包括以下内容:
自动检查上述多个二进制属性的脚本是checksec.sh。Checksec是一个bash脚本,用于检查可执行文件的属性(例如PIE,RELRO,PaX,Canaries,ASLR,Fortify Source)。
https://github.com/slimm609/checksec.sh
对于Microsoft二进制文件(EXE和DLL),请使用PE安全检查ASLR,DEP,SafeSEH,StrongNaming,Authenticode,Control Flow Guard和HighEntropyVA。
https://github.com/NetSPI/PESecurity
使用前面步骤中确定的详细信息和线索,必须模拟固件及其封装的二进制文件,以验证潜在的漏洞。为了完成仿真固件,下面列出了几种方法。
要开始部分仿真二进制文件,必须了解CPU架构和字节序,以便在以下步骤中选择适当的QEMU仿真二进制文件。
$ binwalk -Y
$ readelf -h
el 代表:little endian,小端结构
eb 代表:big endian,大端结构
字节序的获取:
使用Binwalk识别打包的固件二进制文件的字节序(不是提取固件中的二进制文件)。
$ binwalk -Y
确定CPU体系结构和字节序后,找适合的QEMU二进制文件以执行部分仿真(不是用于仿真完整固件,而是用于具有提取的固件的二进制文件。)
通常在:/usr/local/qemu-arch 或者 /usr/bin/qemu-arch
将适用的QEMU二进制文件复制到提取的根文件系统中。第二条命令显示将静态臂QEMU二进制文件复制到ZSH shell中提取的根文件系统,该文件显示了绝对路径。
> cp /usr/local/qemu-arch /extractedrootFS/
/home/embedos/firmware/_DIR850L_REVB_FW207WWb05_h1ke_beta1.decrypted.extracted/squashfs-root
> cp /usr/bin/qemu-arm-static .
执行 ARM 二进制文件(或其他的体系结构)使用 QEMU 和 chroot 进行仿真
$ sudo chroot ../qemu-arch
示例:
> sudo chroot . ./qemu-arm-static bin/busybox ls
开启5515上的侦听服务
sudo chroot . ./qemu-arm-static usr/bin/shellback
在另一个终端上开启本地监听,使用 netcat 尝试连接该服务
sudo lsof -i :5515
nc -nv 127.0.0.1 5515
MIPS CGI 二进制文件,向该文件发出POST请求
sudo chroot . ./qemu-mips-static -E REQUEST_METHOD="POST" -E REQUEST_URI= -E REMOTE_ADDR= -E HTTP_COOKIE= -g
通过上述手段模拟了目标二进制文件,可以使用其应用程序和网络接口,与其进行交互。
使用Firmadyne,固件分析工具包(FAT)或ARM-X固件仿真框架等自动化工具来执行固件的完整仿真。这些工具实际上是QEMU和其他环境功能(例如nvram)的包装器。
使用固件分析工具包,只需执行以下命令:
sudo python3 ./fat.py IoTGoat-rpi-2.img --qemu 2.5.0
参考行业标准的Web方法,例如OWASP的测试指南和应用程序安全验证标准(ASVS)。
检查内容:
根据产品及其应用程序界面的不同,测试用例也会有所不同。
修改设备启动和引导加载程序(例如U-boot)时,可尝试:
#printenv
#setenv bootargs=console=ttyS0,115200 mem=63M root=/dev/mtdblock3
mtdparts=sflash: rootfstype= hasEeprom=0 5srst=0 init=/bin/sh
#saveenv
#boot
#setenv ipaddr 192.168.2.2 #local IP of the device
#setenv serverip 192.168.2.1 #tftp server IP
#saveenv
#reset
#ping 192.168.2.1 #check if network access is available
#tftp ${loadaddr} uImage-3.6.35 #loadaddr takes two arguments: the address to load the file into and the filename of the image on the TFTP server
尝试上传自定义固件或已编译的二进制文件,以检查完整性或签名验证漏洞。
例如,使用以下步骤编译在启动中的后门。
如果已经从动态分析,引导加载程序操纵或硬件安全测试手段获得了root shell,请尝试执行预编译恶意二进制文件,例如即在二进制文件中植入程序或反向 shelll,使用自动化的有效载荷或工具( C&C )框架进行命令执行和控制,如可以使用Metasploit框架和msfvenom。
如果可能,请在启动脚本中确定一个漏洞,以在重新启动后获得对设备的持久访问。当启动脚本引用,符号链接或依赖位于不受信任的安装位置(例如SD卡)和用于在根文件系统外部存储数据的闪存卷时,会出现此类漏洞。
运行时分析涉及在设备在其正常或仿真环境中运行时附加到正在运行的进程或二进制文件。下面提供了基本的运行时分析步骤:
一些可能使用的工具:
在从之前的步骤中识别出二进制文件中的漏洞之后,需要(PoC)在真实环境中验证。编写漏洞利用代码需要掌握低级语言(例如ASM,C / C ++,shellcode等)的编程以及了解特定目标体系结构(例如MIPS,ARM,x86等)中的背景知识。PoC代码涉及通过控制内存中的指令在设备或应用程序上获得任意执行。
二进制运行时保护(例如NX,DEP,ASLR等)在嵌入式系统中并不常见,但是,当发生这种情况时,可能需要其他技术,例如:面向返回的编程 Return-oriented Programming(ROP),ROP允许攻击者通过链接目标进程或二进制代码中的现有代码来实施任意恶意功能。将需要采取步骤,通过形成ROP链来利用已识别的漏洞,例如缓冲区溢出。在这种情况下可能有用的工具是Capstone's gadget finder或ROPGadget- https://github.com/JonathanSalwan/ROPgadget。
利用以下参考资料提供进一步的指导:
在评估固件时将使用多种工具。下面列出的是常用工具。
要练习发现固件中的漏洞,请使用以下易受攻击的固件项目作为起点。