骑麦兜看落日

[Binary]Iot设备如何拿到调试shell

字数统计: 1.6k阅读时长: 7 min
2019/12/09 Share

0x00 前言

这篇基本为复现摘抄,原文见参考链接1

0x01 固件及其常见获取方式

固件(Firmware)就是写入EROM(可擦写只读存储器)或EEPROM(电可擦可编程只读存储器)中的程序

通常情况下,有以下几种获取固件的途径
| 途径 | 简介 |
| — | — |
| 官网直接提供固件下载 | 路由器、摄像头等设备通常可直接在官网下载到固件、而其他大部分IOT设备官方不提供固件下载支持.官网一般只提供最新的固件,不利于研究历史固件的漏洞 |
| 抓包分析固件的下载地址 | 手机控制器带有升级固件功能时,可以尝试使用这种方式获取固件.固件如果以补丁的方式升级,则无法获取完整固件,也可能遇到数据加密不好破解的问题. |
| 通过串口获取 | 从调试串口get shell,之后将系统文件打包上传. |
| 直接读取固件存储芯片 | 通过编程器直接读取固件存储芯片,这种方式最为简单直接.如果存在线路干扰,导致只能离线读取,焊接过程中可能损坏设备 |

0x02 通过调试串口进入系统

调试串口的寻找

这部分就属于硬件知识了,等待研究后再补充

串口工具minicom

确定PC串口设备名

1
dmesg | grep tty

和串口进行通信

1
minicom -D /dev/ttyUSB0

如果遇到权限问题

1
sudo chmod 777 /dev/ttyUSB0

登录绕过

在终端中获得了调试的shell,但是通常无法直接通过爆破得到密码,所以需要其他方法

uboot通常用来引导启动内核

  • 首先为内核设置启动参数
  • 将内核从Flash加载到内存
  • 跳转到内存中内核的起始地址并执行

其中init字段设置内核执行的初始化进程名,如果直接修改init=/bin/sh,则系统就会在还未初始化时访问根文件系统

打包上传固件

使用tartftp命令打包上传根文件系统到tftp服务器即可

0x03 暴力读写固件存储芯片

读取固件

通过编程器读取Flash芯片中的固件

固件解压

查看固件结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
$ binwalk firmware.bin
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
64 0x40 uImage header, header size: 64 bytes, header CRC: 0xDD0D6989, created: 2019-11-15 09:44:00, image size: 65536 bytes, Data Addres
s: 0x30000, Entry Point: 0x40000, data CRC: 0x57A22AD6, OS: Linux, CPU: ARM, image type: Firmware Image, compression type: gzip, image name: "env"
65664 0x10080 uImage header, header size: 64 bytes, header CRC: 0x8334FC0B, created: 2019-11-15 09:44:00, image size: 1636467 bytes, Data Addr
ess: 0x40000, Entry Point: 0x210000, data CRC: 0x6D89AE00, OS: Linux, CPU: ARM, image type: Firmware Image, compression type: gzip, image name: "kernel"
65728 0x100C0 uImage header, header size: 64 bytes, header CRC: 0x9CF7B9E9, created: 2019-09-27 06:09:45, image size: 1636403 bytes, Data Addr
ess: 0x40008000, Entry Point: 0x40008000, data CRC: 0xFB99548D, OS: Linux, CPU: ARM, image type: OS Kernel Image, compression type: none, image name: "Linux-4
.9.37"
65792 0x10100 Linux kernel ARM boot executable zImage (little-endian)
68256 0x10AA0 device tree image (dtb)
82104 0x140B8 device tree image (dtb)
88060 0x157FC device tree image (dtb)
89111 0x15C17 xz compressed data
89445 0x15D65 xz compressed data
1688528 0x19C3D0 device tree image (dtb)
1702195 0x19F933 uImage header, header size: 64 bytes, header CRC: 0xB0106374, created: 2019-11-15 09:44:04, image size: 1990656 bytes, Data Addr
ess: 0x210000, Entry Point: 0x430000, data CRC: 0x8D5F6B2A, OS: Linux, CPU: ARM, image type: Firmware Image, compression type: gzip, image name: "rootfs"
1702259 0x19F973 Squashfs filesystem, little endian, version 4.0, compression:xz, size: 1986766 bytes, 187 inodes, blocksize: 131072 bytes, creat
ed: 2019-11-15 09:44:04
3692915 0x385973 uImage header, header size: 64 bytes, header CRC: 0x4070721E, created: 2019-11-15 09:44:04, image size: 2871296 bytes, Data Addr
ess: 0x430000, Entry Point: 0x7F0000, data CRC: 0x1BF7DFAB, OS: Linux, CPU: ARM, image type: Firmware Image, compression type: gzip, image name: "user"
3692979 0x3859B3 Squashfs filesystem, little endian, version 4.0, compression:xz, size: 2867518 bytes, 125 inodes, blocksize: 131072 bytes, creat
ed: 2019-11-15 09:44:04
  • 内核编译之后会生成两个文件,一个Image,一个zImage,其中Image为内核映像文件,而 zImage为内核的一种映像压缩文件
  • uImage是uboot专用的映像文件,它是在zImage之前加上一个长度为64字节的头部,说明这个内核的版本、加载位置、生成时间、大小等信息
  • 固件使用的是squashfs文件系统,它是一套供Linux核心使用的GPL开源只读压缩文件系统,所以设备正常运行的时候是不能对固件进行修改的
  • 在固件的后一部分,包含一个JFFS2文件系统,它是在闪存上使用非常广泛的读/写文件系统,设备运行过程中修改过的配置信息和其他数据将被写入这个文件系统中

提取文件系统

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ dd if=./camera.bin bs=1 skip=1702259 count=1986766 of=squashfs.bin && sync
1986766+0 records in
1986766+0 records out
1986766 bytes (2.0 MB, 1.9 MiB) copied, 5.17359 s, 384 kB/s

$ unsquashfs squashfs.bin
Parallel unsquashfs: Using 2 processors
162 inodes (189 blocks) to write

[=======================================================|] 189/189 100%

created 67 files
created 25 directories
created 95 symlinks
created 0 devices
created 0 fifos

重新封印

在启动执行的脚本中加入我们需要的命令
由于我们只修改了文件系统,所以只需要在不改变原始固件结构的前提下,将修改后的文件系统重新打包成固件

提取固件其他结构

1
2
3
4
5
6
7
8
9
$ dd if=./camera.bin bs=1702259 count=1 of=part1.bin 
1+0 records in
1+0 records out
1702259 bytes (1.7 MB, 1.6 MiB) copied, 0.0172052 s, 98.9 MB/s

$ dd if=./camera.bin bs=3692915 skip=1 of=part2.bin
0+1 records in
0+1 records out
2871360 bytes (2.9 MB, 2.7 MiB) copied, 0.00950068 s, 302 MB/s

重新打包

打包squashfs文件系统

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
$ mksquashfs squashfs-root squashfs-customize.bin -comp xz
Parallel mksquashfs: Using 2 processors
Creating 4.0 filesystem on squashfs-customize.bin, block size 131072.
[==========================================================\] 94/94 100%

Exportable Squashfs 4.0 filesystem, xz compressed, data block size 131072
compressed data, compressed metadata, compressed fragments,
compressed xattrs, compressed ids
duplicates are removed
Filesystem size 1940.00 Kbytes (1.89 Mbytes)
32.83% of uncompressed filesystem size (5908.40 Kbytes)
Inode table size 1298 bytes (1.27 Kbytes)
20.53% of uncompressed inode table size (6321 bytes)
Directory table size 1730 bytes (1.69 Kbytes)
52.46% of uncompressed directory table size (3298 bytes)
Number of duplicate files found 0
Number of inodes 187
Number of files 67
Number of fragments 17
Number of symbolic links 95
Number of device nodes 0
Number of fifo nodes 0
Number of socket nodes 0
Number of directories 25
Number of ids (unique uids + gids) 1
Number of uids 1
pwn (1000)
Number of gids 1
pwn (1000)

填充文件系统

1
$ python -c "print('\xff'*4095)" >> squashfs-customize.bin

连接各部分

1
2
3
cat part1.bin > new_firmware.bin
cat squashfs-customize.bin >> new_firmware.bin
cat part2.bin >> new_firmware.bin

刷回

利用编程器将修改后的固件离线刷入固件存储芯片即可

0x0n Link

摄像头漏洞挖掘入门教程(固件篇)
Linux下使用串口工具minicom

CATALOG
  1. 1. 0x00 前言
  2. 2. 0x01 固件及其常见获取方式
  3. 3. 0x02 通过调试串口进入系统
    1. 3.1. 调试串口的寻找
    2. 3.2. 串口工具minicom
      1. 3.2.1. 确定PC串口设备名
      2. 3.2.2. 和串口进行通信
    3. 3.3. 登录绕过
    4. 3.4. 打包上传固件
  4. 4. 0x03 暴力读写固件存储芯片
    1. 4.1. 读取固件
    2. 4.2. 固件解压
      1. 4.2.1. 查看固件结构
      2. 4.2.2. 提取文件系统
    3. 4.3. 重新封印
      1. 4.3.1. 提取固件其他结构
      2. 4.3.2. 重新打包
      3. 4.3.3. 连接各部分
    4. 4.4. 刷回
  5. 5. 0x0n Link