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以及厂商自定义的lzmaxz等工具解压。

针对魔改squashfs,unsquashfs时出现Can’t find a valid SQUASHFS superblock报错,说明很可能文件头部的超级块结构被修改,我们需要将其与正常文件对照或逆向相关程序对超级块进行恢复。该结构体的定义位于squashfs-tools源码中的squashfs_fs.h文件,含义参考该文章

squashfs-info工具可以输出squashfs的超级块各字段值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
struct squashfs_super_block {
unsigned int s_magic;
unsigned int inodes;
int mkfs_time;
unsigned int block_size;
unsigned int fragments;
unsigned short compression;
unsigned short block_log;
unsigned short flags;
unsigned short no_ids;
unsigned short s_major;
unsigned short s_minor;
squashfs_inode root_inode;
long long bytes_used;
long long id_table_start;
long long xattr_id_table_start;
long long inode_table_start;
long long directory_table_start;
long long fragment_table_start;
long long lookup_table_start;
};

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

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
2
3
4
5
//安装依赖
$ sudo apt-get install liblzo2-dev
$ sudo pip install python-lzo
//安装ubi_reader
$ sudo pip install ubi_reader

ubi_reader提供了4个命令

1
2
3
4
ubireader_display_info   //获取UBI信息以及布局块等信息
ubireader_extract_images //提取镜像
ubireader_extract_files //提取ubifs镜像中的文件内容
ubireader_utils_info //分析UBI镜像并创建shell脚本和UBI配置文件

ubi卷上的squashfs

ubi镜像的卷(volumn)上除了存放ubifs镜像,也可以存放squashfs等其它文件系统镜像。提取ubi镜像中除ubifs之外的文件系统中的文件时,由于ubireader_extract_files命令只能识别ubifs,我们需要先ubireader_extract_images提取出文件系统镜像,再使用对应工具提取文件。

binwalk只使用ubireader_extract_files提取ubi镜像的内容,所以当ubi镜像中存在其它文件系统时无法binwalk一把梭。

固件仿真

1
sudo apt-get install qemu-user qemu-system qemu-user-static gdb-multiarch 

qemu常用参数选项说明

系统级仿真

armel

镜像地址

使用wget url获取磁盘镜像、内核镜像以及initrd.img(ramdisk文件)

启动脚本run.sh,配置宿主机网卡并启动仿真机

1
2
3
sudo tunctl -t tap0 -u `whoami`
sudo ifconfig tap0 192.168.2.1/24
sudo qemu-system-arm -M versatilepb -kernel vmlinuz-3.2.0-4-versatile -initrd initrd.img-3.2.0-4-versatile -hda debian_wheezy_armel_standard.qcow2 -append "root=/dev/sda1" -net nic -net tap,ifname=tap0,script=no,downscript=no -nographic

配置仿真机网卡

1
root@debian-armel:~# ifconfig eth0 192.168.2.2/24

从宿主机将文件系统压缩并传入仿真机

1
2
tar -cvf squashfs-root.tar ./squashfs-root
scp ./squashfs-root.tar root@192.168.2.2:/root

仿真机解压文件系统

1
root@debian-armel:~# tar -xvf squashfs-root.tar

将仿真机的/dev/proc挂载到下一步chroot的环境中

1
2
mount -o bind /dev ./squashfs-root/dev
mount -t proc /proc ./squashfs-root/proc/

根目录切换至固件文件系统并启动chroot环境的shell

1
chroot ./squashfs-root/ sh

armhf

镜像地址

使用wget url获取磁盘镜像、内核镜像以及initrd.img(ramdisk文件)

启动脚本run.sh

1
2
3
sudo tunctl -t tap0 -u `whoami`
sudo ifconfig tap0 192.168.2.1/24
sudo qemu-system-arm -M vexpress-a9 -kernel vmlinuz-3.2.0-4-vexpress -initrd initrd.img-3.2.0-4-vexpress -drive if=sd,file=debian_wheezy_armhf_standard.qcow2 -append "root=/dev/mmcblk0p2" -net nic -net tap,ifname=tap0,script=no,downscript=no -nographic

配置仿真机网卡

1
root@debian-armhf:~# ifconfig eth0 192.168.2.2/24

从宿主机将文件系统压缩并传入仿真机

1
2
tar -cvf squashfs-root.tar ./squashfs-root
scp ./squashfs-root.tar root@192.168.2.2:/root

仿真机解压文件系统

1
root@debian-armhf:~# tar -xvf squashfs-root.tar

将仿真机的/dev/proc挂载到下一步chroot的环境中

1
2
mount -o bind /dev ./squashfs-root/dev
mount -t proc /proc ./squashfs-root/proc/

根目录切换至固件文件系统并启动chroot环境的shell

1
chroot ./squashfs-root/ sh

aarch64

mipsel

long-arch

x86-64

cleanup

关闭仿真机

1
sudo killall qemu-system-arm

取消挂载

1
2
umount ./squashfs-root/dev/
umount ./squashfs-root/proc/

用户态仿真

  • chroot + qemu/qemu-static
1
sudo chroot ./ ./qemu-mips-static /bin/sh

可在qemu命令后添加-strace输出仿真程序运行时的系统调用信息

文件系统挂载

挂载,指将文件系统中的顶级目录连接到Linux根目录下的某一目录,挂载操作会使得原有目录中文件被隐藏。进行系统级仿真时需要将解包出的文件系统挂载到仿真机中。

  • mountcat /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 & 固件

1

小米 下载->ROM

思科cisco(下载需要官方授权),最下方Select a Product->browser all

Linksys,Linksys是思科的一个部门,主营家用和小型网络产品,思科官网主要提供企业级路由器固件,家庭小型设备固件如EA系列路由器需要到Linksys官网下载

tp-link,下载中心->升级软件

tenda腾达,升级软件

网件Netgear,中国官网固件下载/国外官网固件下载

华为/h3c->不公开,需要授权账号

友讯D-LINK,仓库不再更新的产品仓库 ; 官网台湾官网中国官网->搜索型号或下方页面的下载选择型号

totolink->搜索或选择设备型号->跳转到设备界面后Download

vivotak->选择要下载的设备型号和资源类型,比如下图中筛选的是180°全景网络摄像头

2

openwrt->不同的openwrt版本下有固件下载链接,同一版本的openwrt针对不同路由器有不同的固件

锐捷->服务支持->软件下载

DrayTek -> 官网固件下载FTP服务器

四海众联COMFAST -> 官网 -> 产品中心 -> 选择设备 -> 资料下载

科技侠sciener(智能门禁、智能锁厂商)


IOT_cheat_sheet
https://lkliki.github.io/2024/10/13/IOT-cheat-sheet/
作者
0P1N
发布于
2024年10月13日
许可协议