shlomi-k-avidan/dsl-224-research
GitHub: shlomi-k-avidan/dsl-224-research
针对 D-Link DSL-224 xDSL 网关的嵌入式安全研究项目,记录了通过 UART 调试和固件提取进行硬件逆向与漏洞分析的完整流程。
Stars: 0 | Forks: 0
# D-Link DSL-224 逆向工程
针对 D-Link DSL-224 xDSL 网关正在进行的嵌入式安全研究。目标是获取 root shell,提取位级精确的固件镜像,并分析平台中的漏洞。
**状态:正在进行中。** root shell 获取和全片 flash 提取已完成。固件的静态分析正在进行中。
## 目标
| | |
|---|---|
| 设备 | D-Link DSL-224 |
| SoC | Realtek RTL8685, MIPS 32-bit, big-endian |
| Flash | Winbond 25Q64JVSIQ, 8 MB SPI NOR, SOIC-8 |
| WLAN | Realtek RTL8192 系列 |
| 用户空间 | BusyBox |

## UART 访问
开发板在 **CN3** 处暴露了一个 4 针串口插针,引脚 1 带有标记,顺序为 `VCC GND TX RX`。VCC 保持断开;目标由其自身电源供电,并共用一个接地。

控制台参数是通过测量而非猜测得出的。启动时的 TX 线信号在示波器上被捕获,通过直接读取波形轨迹上的最窄位宽,得出了 **115200 8N1** 的结果。
```
CN3
1 VCC (not connected)
2 GND -> host GND
3 TX -> host RX
4 RX -> host TX
```

USB 串口链路是由一个闲置的 ESP8266(ideaspark 开发板,CH340)构建的。ESP 运行了一个小型的 SoftwareSerial 桥接脚本:路由器的 TX/RX 连接到 GPIO4/GPIO5,该脚本在软 UART 和通过板载 CH340 连接到 PC 的硬件 UART0 之间双向转发字节。这个方案可行,但 SoftwareSerial 是通过软件对线路进行 bit-bang 的,因此在 115200 全双工模式下,即使增大了 RX 缓冲区,它也会在突发数据(如启动时的日志刷屏、转储文件)期间发生丢字节的情况。
```
tio -b 115200 /dev/ttyUSB1
```
## Flash 布局
来自运行设备上的 `/proc/mtd`:
```
dev: size erasesize name
mtd0: 00020000 00001000 "boot" 128 KB bootloader
mtd1: 00010000 00001000 "MAK" 64 KB board data
mtd2: 00010000 00001000 "config" 64 KB settings
mtd3: 001c0000 00001000 "kernel" 1.75 MB kernel
mtd4: 00600000 00001000 "rootfs" 6 MB squashfs
mtd5: 007c0000 00001000 "Linux" 7.75 MB kernel + rootfs alias
mtd6: 00800000 00001000 "ALL" 8 MB full chip alias
```
`mtd5` 和 `mtd6` 是与前面分区相同的物理 flash 的别名,而不是独立的数据分区。
## 固件提取
主机和目标设备通过以太网连接在同一子网中(路由器 `192.168.1.1`,主机 `192.168.1.100/24`),然后使用 BusyBox 的 `nc` 流式传输并读取了整个芯片的内容。
```
# target
nc -l -p 5555 < /dev/mtd6
# host
nc 192.168.1.1 5555 > dsl224_full_8M.bin
```
在任何分析之前,先将其与数据源进行验证:
```
# target
md5sum /dev/mtd6
# host
md5sum dsl224_full_8M.bin
ls -l dsl224_full_8M.bin # 8388608 bytes
```

`binwalk` 在偏移量 `0x200000` 处找到了 root 文件系统:
```
2097152 0x200000 SquashFS filesystem, little endian, version 4.0,
compression: xz, inode count: 1496, image size: 3188780
```
分割并解包:
```
dd if=dsl224_full_8M.bin of=rootfs.sqfs bs=4096 skip=512
unsquashfs -d squashfs-root rootfs.sqfs
```
请注意,运行设备上实时的 `/etc` 目录是在启动时填充到 RAM 中的,其中包含运行时生成的文件(如无线 `.dat`、状态文件),这些文件在只读的 squashfs 中并不存在。提取出的 3.1 MB 镜像是出厂内置的模板。
## 发现
**Root shell。** 控制台直接进入了一个以 uid 0 运行的交互式 shell(`/bin/sh`,BusyBox)。

**管理员凭据。** 设备上的 `/etc/passwd` 包含一个内联的 MD5-crypt 哈希:
```
admin:$1$lX4V2Kov$W3Mb6EkrSxcT1aHhrA8C//:0:0:root:/:/bin/sh
```
使用 hashcat(`-m 500`,rockyou 字典)将其破解为 `admin`。
```
$1$ MD5-crypt
lX4V2Kov salt
```

这个哈希是固化在固件镜像中(在所有设备上都是静态的),还是每个设备单独生成的,目前正在通过与提取的 rootfs 和其他固件版本进行比对来验证。在确认之前,请勿将其视为默认凭据漏洞。
## 正在进行中
- 确认出厂固件中的凭据 salt 是否是固定的,并且在所有 DSL-224 固件版本中是否相同。
- 映射其余的 MTD 分区(`boot`、`MAK`、`config`)并记录其内容。
- 在 Ghidra 中对 `httpd` 请求处理分发程序进行静态分析,以寻找内存安全和命令注入的攻击面。
- 使用 gdb-multiarch 和交叉编译的静态 big-endian MIPS gdbserver 在目标设备上进行动态分析。

## 注意事项
所有工作均在我自己拥有的硬件上进行。请勿对您不拥有或未获准测试的设备执行本文档中的任何操作。
标签:云资产清单, 固件分析, 嵌入式系统, 情报收集, 漏洞研究, 物联网安全, 硬件黑客, 逆向工程