路由器解固件包构建固件包(详解一)
0x01 前言
一篇关于路由器解固件包和构建固件包的文章,顺便记录一些关于在提取固件中常用的工具以及使用的方法。一方面是自己记录的笔记,另一方面分享给大家。
0x02 常用工具
Linux系统自带工具
file — 用来检测是否是有效的文件和文件类型 后面会讲的到
xxd - 会生成给定文件或者标准输入的十六进制格式,也可以将十六进制格式转换回原始的二进制格式
这个工具没用过
hexdump — 将固件中的内容以16进制的格式导出来。 后面会讲到
strings 跟hexdump类似, 可以将固件的内容转成字符串的格式导出来。 后面会提到
dd — 从二进制文件的特定位置中挖掘数据 后面会将 到
lzma — 解压LZMA文件
有的固件包的压缩方式是lzma 的格式,大多数路由器的文件压缩都是这个格式。
第三方工具
Radare2 - 缩写为r2 逆向工程和二进制分析的完整框架
这里有关于radare2的讲解,感觉写的不错【radare2】
ghidra - nsa开源的逆向分析工具
这个相比ida来说,对mips的支持会更好,有的时候ida打开效果不好,可以试试这个工具
IDA Pro - 不用多解释的超强逆向分析工具, 逆向用的最多的工具
Firmware_Slap - 使用约束求解和函数聚类自动发现固件中的漏洞
没用过
firmwalker - 用于搜索提取或者安装的固件文件系统的简单bash脚本,它将搜索解压缩或者装入的固件文件系统,以获取感兴趣的东西
binwalk - 通过固件文件头来分析文件和文件系统,可以用来解开固件包,kali里面自带,但是不太好用,有的固件包解不开。
我都是直接用binwalk -Me firmware 直接解。
Fireware Mod Kit — 自动化分析固件文件的一系列脚本,简称fmk, 一般是用来解开固件包,打包固件包的。
squashfs-tools— 可以通过apt-get squashfs-tools 来安装。用来处理squashfs的一系列工具
qemu 在固件中的作用是模拟固件的运行。可以模拟固件中文件需要执行的环境,如arm,mipsel,mips 常见架构。 后面会专门写一篇对这三种架构环境的模拟搭建。
firmware-analysis-toolkit 固件分析工具,可以用来模拟执行路由器。我只要是用它来模拟路由器,然后可以访问路由器的web界面。一步到位,比较自动化
这些第三方工具,安装过程可以参考我这篇文章路由器固件模拟环境搭建(超详细)
0x03 固件分析
这里使用的固件是TP-link 的一款路由器 TL-WR841N https://static.tp-link.com/2018/201804/20180403/TL-WR841N%28EU%29_V14_180319.zip
下载下来的包是一个压缩包,解包的过程就不概述了。固件包就是下图中 的bin 文件,有的是trx 文件,二者的区别可以去查一查。
使用file命令来识别文件类型,这是数据类文件
可以使用hexdump 和 strings 读取固件文件中的信息,传输到文件中,以便后面查看是否有可以利用的信息。
之后就可以在文件中搜索自己想要的信息,比如搜索一下文件系统常用的boot loader名字u-boot,就可以在文件中看到相关信息。有的时候可以看到设备里面有哪些启动程序。
使用binwalk -Me 解开固件,从输出的信息中可以看到,这个固件是用lzma的压缩方式,以及是Squashfs类型的文件系统。
解开之后是如下图所示的。另外也可以使用 dd 命令来提取特定的文件系统。可binwalk的作用是一样的。
但是使用binwalk 解开的包,用firmware-mod-kit重新再打包不是很支持。
0x04 firmware-mod-kit 解构固件包
firmware-mod-kit 来完成对固件的解包和打包,这样我们就可以很方便的在对目标完成修改后重新打包固件(比如植入后门之后重新打包)
1. 下载固件
git clone https://github.com/rampageX/firmware-mod-kit.git
2. 安装依赖
sudo apt-get install git build-essential zlib1g-dev liblzma-dev python-magic
3. 编译文件(如果你不想编译,也可以直接解固件,解固件的时候会自动编译,我是跳过这一步)
cd firmware-mod-kit/src
./configure && make
4. 解开固件包
使用extract-firmware.sh 解开固件包
解完固件包之后,固件的内容在fmk中,其中images_parts 文件夹是存储中间文件的位置,如果需要替换内核(完全不建议),可以通过在此处替换适当的文件(通常为segment2)来替换;rootfs 是固件的文件系统所在的位置,可以在此处修改文件内容;logs 是解包的输出日志信息。
修改etcz中rcS 文件中的内容,当然我这里只是在做测试,各位大佬,可以想一些奇技淫巧。
5. 重新构建固件包
使用build-firmware.sh 构建固件包, 它会自动的把fmk 文件夹中解开的固件包自动重新打包回去。
使用binwalk重新构建的固件包,查看/etc/ini.d/rcS内容,发现修改成功
使用firmware-analysis-toolkit启动的时候,会发现启动自启动的文件rcS,并且执行了里面的内容
0x05 总结
其实有的固件包由于固件包加密,压缩方式的不同等种种原因使用以上的工具是解不开的,这时候需要用其他的方式来进行解包,各位大佬会的可以指导DD
但是大部分的固件包但是可以接开的。
0x06 参考
【技术分享】物联网设备的固件分析技术
https://www.anquanke.com/post/id/85036
IoT固件逆向入门
https://zeroyu.xyz/2019/08/15/How_to_start_IoT_Reverse/#0x02-%E5%B8%B8%E7%94%A8%E5%B7%A5%E5%85%B7