IoT固件逆向入门

0x00 前言

一篇入门级别的IoT固件逆向文章

0x01 固件下载

  1. tp-link 固件下载

https://www.tp-link.com/in/support/download/

此外tp-link还提供了在线的仿真环境

  1. 小米智能家居的环境

https://github.com/dgiese/dustcloud

0x02 常用工具

Linux系统自带工具

file — 用来检测是否是有效的文件和文件类型
xxd - 会生成给定文件或者标准输入的十六进制格式,也可以将十六进制格式转换回原始的二进制格式
hexdump —16进制导出工具
strings 跟hexdump类似但是可以以可读的形式展示
dd — 从二进制文件中挖掘数据
lzma — 解压LZMA文件

第三方工具

Radare2 - 逆向工程和二进制分析的完整框架
ghidra - nsa开源的逆向分析工具
IDA Pro - 不用多解释的超强逆向分析工具
Firmware_Slap - 使用约束求解和函数聚类自动发现固件中的漏洞
firmwalker - 在安装的固件文件系统中搜索敏感的文件
binwalk - 通过固件文件头来分析文件和文件系统
Fireware Mod Kit — 自动化分析固件文件的一系列脚本
squashfs-tools— 可以通过apt-get squashfs-tools 来安装。用来处理squashfs的一系列工具

0x03 分析示例

此处下载固件 TL-WR841N(EU)_V14_180319

下载之后解压文件

1
unzip TL-WR841N\(EU\)_V14_180319.zip

B10BD5C0-8820-49A2-ABC1-EA4BF20150C0.png

之后使用使用file命令来识别文件类型,此处识别后发现目标是数据类文件
CD422AAB-9C09-46DD-BD27-C56273444ADB.png

既然是数据文件我们就可以使用hexdumpstring来对其中的信息进行分析,作为初始的信息收集过程。
PS:

  1. 因为一般输出的信息非常多,所以此处将输出的信息导入输出文件,方便随后查看。
  2. hexdump -C 参数可以设置输出为hex+ASCII的方式。

9A44A5CB-CAA3-462C-A15A-7EB5A423E0DF.png

之后就可以在文件中搜索自己想要的信息,比如搜索一下文件系统常用的boot loader名字u-boot,就可以在文件中看到相关信息。
C8AB21C5-BC26-46F7-9A50-AC6A099BC222.png

之后可以使用binwalk来对目标进行分析。分析结果主要分为三个部分进行展示:文件地址的十进制和十六进制展示以及对应位置发现的详细描述。从分析结果中也可以确认此处使用的boot loader就是U-boot。
21E84A59-EB8C-4469-BA57-8C5E1F1706A2.png

分析完之后可以使用binwalk -e来对固件的各个部分进行提取。提取完成后就可以进入文件系统获取自己想要的信息了,比如我只关注web页面的源码文件,那么就进入squashfs-root/web
1A6B56C2-CA38-4618-8B35-4DFB05F9A6F2.png

PS: binwalk其它的常用参数
-M:递归扫描提取的文件
-r:提取后删除剩余文件
-e:自动提取已知文件类型
所以一般会使用binwalk -Mre file.bin来提取固件中的信息。

当然此处也可以使用dd命令来对特定位置的文件来提取

1
dd if=TL-WR841Nv14_EU_0.9.1_4.16_up_boot\[180319-rel57291\].bin skip=1049088 bs=1 of=TP.sfs

B25D6B9F-1B47-42F0-8BAC-1B630954E8E0.png
PS:

  1. dd 可以跨文件、设备、分区和卷复制数据
  2. if 标准文件输入
  3. of 标准文件输出
  4. bs 块大小
  5. skip用于跳过指向固件二进制映像中特定地址的指针

最终得到dd命令分割之后的文件TP.sfs,这是一个存储Squashfs文件系统的文件。之后可以使用unsquashfs工具来对其中的文件系统进行提取。提取完成后会自动创建一个squashfs-root文件夹。
A08A2109-0C9F-4C3E-86FA-A23D0A678977.png

此外,我们还可以使用Google出的firmware-mod-kit来完成对固件的解包和打包,这样我们就可以很方便的在对目标完成修改后重新打包固件(比如植入后门之后重新打包)。
PS: Google已经不对这个工具进行更新,在最新的系统上编译可能会出现问题,所以推荐以下两个第三方修改版。
适用于Linux: https://github.com/rampageX/firmware-mod-kit
适用于macOS: https://github.com/cinquemb/firmware-mod-kit-osx
解包操作如下所示
EA859A97-35DE-4C7D-8013-C6F4F07FB24B.png
重建固件包如下所示
FAAC8614-47CF-41F6-BD2A-293E3AAAC0F7.png

到此为止,我们已经提取了固件的整个文件系统,现在我们可以开始分析文件系统中存在的二进制文件或者某些文件了。

分析文件的话一般是先看etc目录下的配置文件和启动脚本
B4DD20FF-8797-4633-9540-C1F57C2D2700.png
比如说此处可以看到一个passwd文件和init.d文件夹,init.d文件夹下存储的是启动的时候初始化服务和环境rcS文件,可以看一下文件的内容。
909A5DC6-5F72-467D-92E5-24F1C12F7C25.png
可以看到启动的时候将cp -p /etc/passwd.bak /var/passwd,再看passwd.bak文件就可以得到一些默认口令
4CB3F00A-6E9D-4120-BCC3-F038026F0988.png

之后在bin目录下看到login文件,可以使用IDA来对这个文件的登录逻辑进行分析,可能存在登录绕过或者命令注入等漏洞。

6E87135C-D407-4D8E-AD80-DE25BBED2EA3.png

不过再对mips指令集的分析上ghidra更好一些
1C720AAD-26F9-492A-AFDD-E00F3B91F2EB.png

0x04 trick

  1. 在整个二进制文件中搜索字符串
    参数izz | more
    47BCD0CA-59D7-4A3E-806A-1A5346F7BCB4.png
  2. 使用firmwalker扫描敏感文件
    98B7ADDE-2020-44AA-AFB2-AB437AF3E899.png
  3. 使用Firmware Slap扫描漏洞

0x05 总结

文章对目前常用的固件分析工具以及固件的分析流程做了简单的介绍,作为一篇入门级别的文章。

0x06 参考

《How to Start IoT device Firmware Reverse Engineering?》
《逆向路由器固件之解包 Part1》
《IOT渗透测试》
《逆向路由器固件之信息泄露》
《Multiple D-Link Authentication Bypass Vulnerabilities》