固件安全测试入门学习手册 (新手必看)
固件安全测试入门学习手册 (新手必看)
无论是公网连接还是独立网络,固件都是控制嵌入式设备的核心。因此,必须要了解如何分析固件以执行未授权的功能。
1、信息收集
在此阶段,收集有关目标的尽可能多的信息,以了解其基础技术的总体组成。尝试收集以下内容:
支持的CPU架构
操作系统平台
引导程序配置信息(Bootloader configurations)
硬件原理图
数据表
代码行(LoC)估计
源代码存储库位置
第三方组件
开源许可证(例如GPL)
更新日志
FCC ID
设计和数据流程图
威胁模型
以前的渗透测试漏洞报告
漏洞平台放出的漏洞(例如BugCrowd或HackerOne)
上面列出的信息应在安全测试工作之前收集好,确保利用内部产品线开发团队来获取准确和最新的数据。了解应用的安全控制以及项目资料,已知的安全问题以及与漏洞有关的信息。
2、获取固件
要开始查看固件内容,必须获取固件映像文件。尝试使用以下一种或多种方法获取固件内容:
直接从开发团队,制造商和供应商或客户那里获取
使用制造商提供的说明文件从头开始编译
针对文件扩展名和文件共享平台(例如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。
列出的每种方法的难度各不相同,根据项目目标和参与规则选择适当的方法。如果可能,需要拿到固件的调试版本和发布版本,以在发布版本中编译调试代码或功能时最大程度地覆盖测试用例。
3、分析固件
获取固件映像后,查看文件以识别其特征。使用以下步骤分析固件文件类型,root文件系统元数据,并进一步了解其编译平台。
4、提取文件系统
此阶段涉及查看固件内部并解析相关文件系统数据,以识别尽可能多的潜在安全问题。
5、分析文件系统
在此阶段,将收集有关动态和运行时分析阶段的线索。研究目标固件是否包含以下内容:
传统的不安全网络守护程序,例如telnetd(有时会伪装重命名文件)
硬编码的凭证(用户名,密码,API密钥,SSH密钥和后门变体)
硬编码的API端点和后端服务器详细信息
可用作入口点的服务器更新函数
查看未编译的代码并启动脚本执行远程代码
提取已编译的文件,以供使用反汇编程序进行脱机分析以供将来使用
6、固件仿真
使用前面步骤中确定的详细信息和线索,需要模拟固件及其文件以验证潜在的漏洞。为了完成仿真固件,下面列出了几种方法。
A.部分仿真(用户空间)-仿真从固件提取的文件系统(例如)获得的/usr/bin/shellback独立文件
B.完整的系统仿真-完整的固件仿真和利用伪造的NVRAM启动配置。
C.使用真实设备或虚拟机进行仿真-有时,由于硬件或体系结构的依赖性,部分或全部仿真可能无法正常工作。如果架构和字节序与拥有的设备(例如树莓派)匹配,则可以将根文件系统或特定文件传输到该设备以进行进一步测试。此方法还适用于使用与目标相同的体系结构和字节序的Build虚拟机。
7、动态分析
在此阶段,请在设备在其正常或仿真环境中运行时执行动态测试。此阶段的目标可能会因项目和访问级别而异。通常,涉及修改引导程序配置,Web和API测试,Fuzz(网络和应用程序服务),以及使用各种工具集进行主动扫描以获取root访问权限或代码执行。
8、运行时分析
运行时分析涉及在设备在其正常或仿真环境中运行时附加到正在运行的进程或文件。
9、漏洞利用
在从之前的步骤中识别出文件中的漏洞之后,需要适当的概念验证(PoC)来证明现实的影响和风险。开发漏洞利用代码需要具有较低级语言(例如ASM,C / C ++,shellcode等)的编程经验,以及特定目标体系结构(例如MIPS,ARM,x86等)中的背景知识,PoC代码涉及通过控制内存中的指令在设备或应用程序上获得任意执行。
在嵌入式系统中通常不存在二进制运行时保护(例如NX,DEP,ASLR等),需要ROP技术来绕过。ROP允许攻击者通过链接目标进程/二进制代码(称为gadget)中的现有代码来实施任意恶意功能,需要采取步骤来利用已识别的漏洞,例如通过形成ROP链来利用缓冲区溢出漏洞。