IoT的安全问题主要集中在硬编码敏感信息、启用了硬件调试端口、不安全的固件、不安全的数据存储、未认证访问、不安全的通信通道、不安全的配置、数据输入未过滤。
IoT基础信息
- CPU架构:ARM、X86、MIPS、PPC
- 内存:
- 储存:Flash(NOR/NAND)、SD、TF
- Bootloader:Uboot
- 操作系统:Linux、RTOS、VxWorks
固件
固件提取
预留接口读取
JTag/SWD
Jlink/Xtag(GDBs/OpenOCD)插入Jtag->Jflash读取
UART/USART
- USB转TTL,连接主板UART口
- 使用PuTTY Serial模式连接COM口,Speed 9600
- 上电,拿到shell
- 通过init启动sh。printenv、setenv bootargs init=/bin/sh、saveenv、getshell
提权获得文件系统权限
利用一些提权漏洞或者后门获得完整Shell。
从存储芯片读取固件
飞线Flash芯片在线读取固件
通过芯片夹连接到芯片的引脚,连接电脑,使用编程器即可读取保存固件。
拆焊Flash芯片离线读取固件
将Flash芯片拆焊下来,通过烧录座编程器,离线读取保存固件。
拆焊STM32->插入烧录座->Jlink插入Jtag->JFlash读取。
其它获取固件方式
- 官网下载
- 找售后客服或代理商要
- 三方网站共享的
- 中间人抓包获取更新固件时的远程链接
- 有些产品固件更新需要借助独立的软件,可逆向该软件获得固件。
- 逻辑分析仪
- 修改uboot启动脚本,删除密码、启动sh、挂在硬盘等方式获取高权限和文件
- 通过uboot的md命令读取内存,NOR Flash使用
固件逆向
识别压缩算法
通过binwalk -E
可以看固件是否有压缩或加密,一般压缩算法包括 LZMA、LZO、LAMA2。
如果固件加密,最直接的方式是找到解密密钥。一般来说,解密程序本身会在固件内。存在几种情况
- 早期固件版本没有加密,解密程序随着某个过度版本提供,过度版本的固件未加密,找到这个版本提取解密程序来解密最新版本固件。
- 早期固件就开始加密,中间更改了加密方案,新解密程序随着某个过度版本提供,过度版本使用的还是老的加密方式,找到这个版本提取解密程序来解密最新固件。
- 早期固件就开始加密,中间更改了加密方案,没有过渡期间,后续的版本固件直接使用新加密方案。
一出现的概率比较高,二也有可能,三就比较难利用。
在之前固件中找到解密程序后,通过QEMU模拟执行解密程序,对新版本固件解密,之后使用binwalk提取即可。