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 | ![DSL-224 板子](https://static.pigsec.cn/wp-content/uploads/repos/cas/2e/2e32f7d05b09b17f23e9742b07098b4c189955aac2e761af7b2b1f59cd3a7ec8.jpg) ## UART 访问 开发板在 **CN3** 处暴露了一个 4 针串口插针,引脚 1 带有标记,顺序为 `VCC GND TX RX`。VCC 保持断开;目标由其自身电源供电,并共用一个接地。 ![板子上的 CN3 调试插针](https://static.pigsec.cn/wp-content/uploads/repos/cas/72/72e709ba900deea75f1fb466960d9daa678a696bba5deb22fb03fa32be21a5a8.jpg) 控制台参数是通过测量而非猜测得出的。启动时的 TX 线信号在示波器上被捕获,通过直接读取波形轨迹上的最窄位宽,得出了 **115200 8N1** 的结果。 ``` CN3 1 VCC (not connected) 2 GND -> host GND 3 TX -> host RX 4 RX -> host TX ``` ![启动时 TX 线的示波器捕获图像;直接从波形轨迹中测量位宽](https://static.pigsec.cn/wp-content/uploads/repos/cas/1c/1c470bb2d3ef1085fa72b41af0b8a2316c89881179bec36e9cfe9362d7d5be6a.jpg) 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 ``` ![通过 nc 从设备流式提取完整的 8 MB flash](https://static.pigsec.cn/wp-content/uploads/repos/cas/b4/b4e0cefbb7e2eb217bad71e8a86ea1bd078096556411284a58a7c72641174dfa.png) `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)。 ![运行设备上的交互式 root shell (uid 0)](https://static.pigsec.cn/wp-content/uploads/repos/cas/96/96561308863dedaf0ad4dfcb2a283e20408d008cdcea999cf806abdc2adb4727.png) **管理员凭据。** 设备上的 `/etc/passwd` 包含一个内联的 MD5-crypt 哈希: ``` admin:$1$lX4V2Kov$W3Mb6EkrSxcT1aHhrA8C//:0:0:root:/:/bin/sh ``` 使用 hashcat(`-m 500`,rockyou 字典)将其破解为 `admin`。 ``` $1$ MD5-crypt lX4V2Kov salt ``` ![hashcat 破解 MD5-crypt 管理员凭据](https://static.pigsec.cn/wp-content/uploads/repos/cas/31/31bdddb4ce0886e956d325e60a397b61603591dd1fc6fc0b6430d80a728c1e3b.png) 这个哈希是固化在固件镜像中(在所有设备上都是静态的),还是每个设备单独生成的,目前正在通过与提取的 rootfs 和其他固件版本进行比对来验证。在确认之前,请勿将其视为默认凭据漏洞。 ## 正在进行中 - 确认出厂固件中的凭据 salt 是否是固定的,并且在所有 DSL-224 固件版本中是否相同。 - 映射其余的 MTD 分区(`boot`、`MAK`、`config`)并记录其内容。 - 在 Ghidra 中对 `httpd` 请求处理分发程序进行静态分析,以寻找内存安全和命令注入的攻击面。 - 使用 gdb-multiarch 和交叉编译的静态 big-endian MIPS gdbserver 在目标设备上进行动态分析。 ![在 Ghidra 中进行静态分析的分割出的 rootfs](https://static.pigsec.cn/wp-content/uploads/repos/cas/fb/fb6b1d9a7bf183fbe02284befd2ff05ad9b2792d5a35e77562d708947412985b.png) ## 注意事项 所有工作均在我自己拥有的硬件上进行。请勿对您不拥有或未获准测试的设备执行本文档中的任何操作。
标签:云资产清单, 固件分析, 嵌入式系统, 情报收集, 漏洞研究, 物联网安全, 硬件黑客, 逆向工程