固件安全实战1

1.1固件安全实战

固件加载流程

什么是固件?

固件(Firmware)就是写入EPROM(可擦写可编程只读存储器)或EEPROM(电可擦可编程只读存储器)中的程序。

固件是指设备内部保存的设备“驱动程序”,通过固件,操作系统才能按照标准的设备驱动实现特定机器的运行动作,比如光驱、刻录机等都有内部固件。

固件是担任着一个系统最基础最底层工作的软件。而在硬件设备中,固件就是硬件设备的灵魂,因为一些硬件设备除了固件以外没有其它软件组成,因此固件也就决定着硬件设备的功能及性能。

——百度百科

固件是一种软件,可以和底层硬件交互。

固件构成

嵌入式linux固件常见结构:

  • bootloader:如uboot.bin
  • kernel:如ulmage
  • filesystem:rootfs

BootRom(固化在硬件中)调用Bootloader

Bootloader调用Kernel(内核)

Kernel去调用 filesystem(文件系统)

常见的Bootloader

文件系统及操作系统

文件系统

微信截图_20231004174242

说人话,就是文件目录。

根文件系统

首先根文件系统是内核启动时所mount的第一个文件系统,内核代码映像文件保存在根文件系统中,而系统引导启动程序会在根文件系统挂载之后从中把一些基本的初始化脚本和服务等加载到内存中去运行。

微信截图_20231004174628

常见嵌入式文件系统

使用df -ahT命令查看当前系统的所有文件系统

-h显示大小

-T显示文件系统类型

-a打印所有文件系统

graph TD
a[常见嵌入式文件系统]-->b[基于存储设备的文件系统]
a-->c[基于逻辑的虚拟文件系统]
b-->b1[内存文件系统]
b1-->b11[tmpfs]
b1-->b12[ramdisk]
b-->b2[flash文件系统]
b2-->b21[cramfs]
b2-->b22[squashfs]
b2-->b23[jffs/jffs2]
b2-->b24[yaffs/yaffs2]
b2-->b25[ubifs]
b-->b3[扩展SD卡文件系统]
b3-->b31[FAT32]
b3-->b32[ext2/ext3]
b-->b4[网络文件系统]
b4-->b41[NFS]
b4-->b42[Samba]
c-->c1[进程文件系统]
c1-->procfs
c-->c2[设备文件系统]
c2-->devfs
c2-->sysfs
  • 内存文件系统包括tmpfs和ramdisk。

    • tmpfs文件系统是一种临时的文件系统,由linux内核来支持,只需要在内存中指定一个区域,指定最大的大小,就可以直接使用,不需要对内存进行格式化。

    • ramdisk是将一部分固定大小的内存( RAM )空间模拟出硬盘分区,断电后会丢失。

  • flash文件系统包括cramfs和squashfs和jffs/jffs2和yaffs/yaffs2和ubifs。

    • cramfs是只读压缩的文件系统,可以将文件系统进行压缩,提高存储效率。

    • squashfs是只读压缩的文件系统,相比于cramfs可以支持更大的单个文件大小。

    • jffs/jffs2是可以读写压缩的日志闪存文件系统,主要是应用于nor flash。

    • yaffs/yaffs2是另一种日志闪存文件系统,主要是为nand型flash设计的文件系统,为了应对flash容量的快速增长。

    • ubifs是作为jffs2的后继文件系统,满足大容量的需求。

  • 扩展SD卡文件系统包括FAT32和ext2/ext3。

    • FAT32是微软专为windows开发的文件系统,在windows上有很好的兼容性。

    • ext2/ext3是Linux上的日志文件系统,可靠性好,但在windows上支持不太好。

  • 网络文件系统包括NFS和Samba。

    • NFS是开发板与宿主机进行挂载的文件系统。

    • Samba是windows与Linux之间的共享机制。

文件系统的基础结构

微信截图_20231004185036

操作系统

  • 按内核结构划分
    • 微内核
    • 宏内核
  • 按用途划分
    • 通用操作系统(pc等)
    • 嵌入式操作系统(物联网设备)
    • 专用操作系统(军事、医疗)
  • 根据实时性来划分
    • 实时操作系统(RTOS,Vxworks等)
    • 分时操作系统(Linux)

常见漏洞及环境搭建

常见漏洞

  • 信息泄露
    • 漏洞描述:D-Link DIR850L 信息泄露漏洞
  • XSS
  • 命令执行(授权、未授权)
    • 漏洞描述:在cgibin程序的genacgi——main函数中,sprintf方法直接用/gena.cgi中的service参数。攻击者可以构造一个有效载荷来执行任意恶意代码。
  • 任意文件操作
  • 堆栈溢出
  • 拒绝服务
    • 漏洞描述:Tenda AC9 openSchedWifi功能未对数据输入长度进行校验。
  • 硬编码漏洞
    • 漏洞描述:D-Link DIR-620硬编码的默认凭证。
  • 未授权访问
    • 漏洞描述:ZIO ROUTER路由器
  • DNS缓存中毒
  • 后门漏洞
  • 等等

环境搭建

  1. 操作系统

    • windows7
    • windows10
    • Ubuntu14/16/20
  2. 固件解包工具

    • binwalk:常用的固件提取工具

      走这里

      Linux下载安装:

      1
      2
      3
      
      git clone https://github.com/ReFirmLabs/binwalk.git
      cd binwalk
      python setup.py install
      

      使用方法:

    • dd:任何数据的任何位置(使用较为复杂),提取某处地址或偏移的文件

    • lzma,unzip等:压缩/解压工具

    • unsquashfs:文件系统提取工具

    • fcrackzip:压缩包密码破解工具(在官网下载一些压缩包时往往被加密。使用暴力破解进行破解的工具)

    • strings:提取以null结尾字符串的工具

    • hexdump,winhex:十六进制查看工具

    • fdisk:磁盘操作工具(有些固件很大,虚拟机或者防火墙)

  3. 逆向分析工具

    • IDA7.5支持mips
    • ghidra开源的,支持mips
    • gdb/gdbserver
  4. 固件模拟

    • 当我们不能去买一整套的设备

    • qemu(系统模拟和用户模式):固件模拟

      去这里

    • firmadyne:固件模拟框架(简化模拟过程)

    • FirmAE:固件模拟框架

  5. 自动分析框架

    • FACT_core
    • firmwalker(获取敏感信息)
updatedupdated2023-10-082023-10-08