IOT_cheat_sheet
IOT cheat sheet
记录iot安全中常用的工具/命令,用作备忘录方便查看,持续施工中
固件解包
hexdump
hexdump -C filename | grep -i 'string'
搜索文件中的指定字符串,并查看数据的16进制形式及地址。
strings
strings filename | grep -i 'string'
在文件中搜索指定字符串,常用于查找签名或特征字符串。
dd
dd if=输入文件名 of=输出文件名 bs=一个数据块的字节数 skip=从文件头开始跳过数据块的数量 count=输出数据块的数量
用于更细粒度地提取文件中的数据。
file
识别常见文件类型
dd | file
可结合dd命令分析指定区块数据的文件类型。
binwalk
binwalk filename
分析文件。
binwalk -Y filename
使用 capstone 反汇编器识别文件的 CPU 架构。
binwalk -E filename
计算文件的熵值。熵值越大,越有可能是加密的或是压缩过的。
binwalk -Me filename
提取文件并在提取过程中自动尝试解密已知的加密算法。
lzma
LZMA,历史遗留的老文件格式,正在被xz取代,只支持.lzma
lzma -d -k filename
xz
xz又称LZMA2,是LZMA压缩的替代,支持.xz和.lzma
xz -d -k filename
有的厂商会魔改压缩算法后使用自定义的魔改xz工具
find
根据文件名在指定目录中递归地查找某文件,文件名可使用通配符
find /path_to/dictionary -name "*.txt"
grep
列出字符匹配的文件内容或文件名
grep -rnw './' -e 'update\|firmware\|upgrade\|download'
文件系统解压
squashfs
unsquashfs filesystem
适用于解压标准SquashFS格式文件镜像,源于Squashfs-tools项目
sasquatch filesystem
针对非标准的SquashFS格式文件镜像(如LZMA和XZ),项目地址
tips:常见squashfs压缩算法包括GZIP、LZMA、LZO、XZ(LZMA2)等。很多厂商在打包文件系统时使用自定义的非标准squashfs压缩算法(如魔改LZMA和魔改XZ)。如果无法直接binwalk
提取,则需要手动搜索squashfs文件系统的头部特征字符串,找到大小和偏移并提取出文件系统镜像,然后用sasquatch
以及厂商自定义的lzma
、xz
等工具解压。
针对魔改squashfs,unsquashfs时出现Can’t find a valid SQUASHFS superblock报错,说明很可能文件头部的超级块结构被修改,我们需要将其与正常文件对照或逆向相关程序对超级块进行恢复。该结构体的定义位于squashfs-tools源码中的squashfs_fs.h文件,含义参考该文章。
squashfs-info工具可以输出squashfs的超级块各字段值。
1 |
|
Yaffs/Yaffs2
Yaffs(Yet Another FlashFile System)文件系统是专门针对NAND闪存设计的嵌入式文件系统,目前有YAFFS和YAFFS2两个版本,两个版本的主要区别之一在于YAFFS2能够更好的支持大容量的NAND FLASH芯片。
解包工具
unyaffs
打包工具
mkyaffs2
源码: https://code.google.com/archive/p/yaffs2utils/
unyaffs可通过pip install安装
JFFS/JFFS2
- 解包工具
jefferson
:项目地址
cramfs
使用cramfsprogs
包中的cramfsck
工具解析cramfs文件系统镜像
cramfsprogs
包从ubuntu1804开始不再支持,所以需要手动安装。
网址1可以下载deb包,通过sudo apt install -f file.deb
安装
网址2可以下载源码,在源码中添加#include <sys/sysmacros.h>
头文件后sudo make
编译得到所需工具
cramfsck
工具提取时需要root权限来创建设备节点,否则提取不完全。
Ubifs
可使用现成开源解包工具ubi_reader
,也可通过挂载方式读取文件,挂载的方式比较繁琐。
- ubi_reader
项目地址:https://github.com/jrspruitt/ubi_reader
可以直接通过pip安装
1 |
|
ubi_reader提供了4个命令
1 |
|
ubi卷上的squashfs
ubi镜像的卷(volumn)上除了存放ubifs镜像,也可以存放squashfs等其它文件系统镜像。提取ubi镜像中除ubifs之外的文件系统中的文件时,由于ubireader_extract_files
命令只能识别ubifs,我们需要先ubireader_extract_images
提取出文件系统镜像,再使用对应工具提取文件。
binwalk
只使用ubireader_extract_files
提取ubi镜像的内容,所以当ubi镜像中存在其它文件系统时无法binwalk一把梭。
固件仿真
1 |
|
系统级仿真
armel
使用wget url
获取磁盘镜像、内核镜像以及initrd.img(ramdisk文件)
启动脚本run.sh
,配置宿主机网卡并启动仿真机
1 |
|
配置仿真机网卡
1 |
|
从宿主机将文件系统压缩并传入仿真机
1 |
|
仿真机解压文件系统
1 |
|
将仿真机的/dev
和/proc
挂载到下一步chroot的环境中
1 |
|
根目录切换至固件文件系统并启动chroot环境的shell
1 |
|
armhf
使用wget url
获取磁盘镜像、内核镜像以及initrd.img(ramdisk文件)
启动脚本run.sh
1 |
|
配置仿真机网卡
1 |
|
从宿主机将文件系统压缩并传入仿真机
1 |
|
仿真机解压文件系统
1 |
|
将仿真机的/dev
和/proc
挂载到下一步chroot的环境中
1 |
|
根目录切换至固件文件系统并启动chroot环境的shell
1 |
|
aarch64
mipsel
long-arch
x86-64
cleanup
关闭仿真机
1 |
|
取消挂载
1 |
|
用户态仿真
chroot + qemu/qemu-static
1 |
|
可在qemu命令后添加-strace
输出仿真程序运行时的系统调用信息
文件系统挂载
挂载,指将文件系统中的顶级目录连接到Linux根目录下的某一目录,挂载操作会使得原有目录中文件被隐藏。进行系统级仿真时需要将解包出的文件系统挂载到仿真机中。
mount
或cat /etc/mtab
查看已挂载的设备
mount device/filesystem dir
将设备文件/文件系统挂载到dir
目录。加-t fstype
参数可以指定文件系统类型,否则自动识别文件系统类型
例: mount /dev/sdb1 /mnt/data
,将sdb1
分区挂载到mnt/data
目录
mount --bind olddir newdir
把目录树的一棵子树挂载到其他地方
umount [参数] -t [文件系统类型] [设备名称]
卸载已经挂载的设备或文件系统
/etc/mtab
记录了当前挂载的文件系统信息。
格式:设备名称 挂载点 分区的类型 挂载选项 dump选项 fsck选项
/etc/fstab
文件系统挂载的配置文件,定义了系统启动时应该自动挂载的文件系统,并指定了挂载选项。
- 磁盘分区文件命名规则
以/dev/sda5
为例 : /dev
说明这是一个硬件设备;sd
表示是存储设备;a
表示系统中同类型接口中第一个被识别到的设备,比如有两个硬盘设备,则分别为sda和sdb;5
表示设备中逻辑分区的编号。
抓包
tcpdump
调试
gdb-multiarch
设备启动流程
IOT设备中很多服务程序为开机自启的守护进程(deamon),仿真及分析时需要了解其启动方式,寻找对应文件中的启动参数等,因此有必要了解嵌入式linux的大致启动流程,尤其是了解启动脚本等关键文件。
- 上电
- BIOS/UEFI
- bootloader
- 加载内核,挂载文件系统
- 运行根文件系统中的初始化脚本和服务
调试串口及串口shell
调试串口分类
能获取shell的串口主要是UART和SWD/JTAG;还有其它接口无法获取shell,但也存在安全风险
UART
SWD/JTAG
其它:I2C/SPI、OBD、USB等
串口shell
连上设备后先启动boot shell,再进入Linux shell
- boot shell
加载内核前boot阶段运行的裸机程序,功能一般包括:tftp获取外部文件、读内存、读写rom、查看rom分区等。
bootshell提供的指令因设备而异,在提供了内存或rom的读写功能时可以尝试从内存或rom提取固件。
关于串口的bootshell有这几种情况:直接进入bootshell、需要按键进入bootshell、没有bootshell。
除此之外,还有一种通过bootshell获取Linux root shell的思路:提取文件系统 -> 修改文件系统,删除关闭串口Linux Shell的代码并修改root用户密码 -> 将修改后的文件系统重新打包并通过tftp传入设备 -> 通过bootshell修改rom中固件的文件系统为我们传入的文件系统 -> 重启设备。参考文章
- linux shell
操作系统初始化完成后提供给串口的shell,有以下几种情况:
1.关闭了串口的终端
2.Linux shell存在密码
3.只提供功能受限的cli shell
厂商汇总及固件下载
华硕,选择路由器产品,服务支持->驱动程序和工具软件->BIOS & 固件
小米 下载->ROM
思科cisco(下载需要官方授权),最下方Select a Product->browser all
Linksys,Linksys是思科的一个部门,主营家用和小型网络产品,思科官网主要提供企业级路由器固件,家庭小型设备固件如EA系列路由器需要到Linksys官网下载
tp-link,下载中心->升级软件
tenda腾达,升级软件
华为/h3c->不公开,需要授权账号
友讯D-LINK,仓库和不再更新的产品仓库 ; 官网,台湾官网,中国官网->搜索型号或下方页面的下载选择型号
totolink->搜索或选择设备型号->跳转到设备界面后Download
vivotak->选择要下载的设备型号和资源类型,比如下图中筛选的是180°全景网络摄像头
openwrt->不同的openwrt版本下有固件下载链接,同一版本的openwrt针对不同路由器有不同的固件
锐捷->服务支持->软件下载
四海众联COMFAST -> 官网 -> 产品中心 -> 选择设备 -> 资料下载
科技侠sciener(智能门禁、智能锁厂商)