搁废品站捡的 4G 工业路由

拆解

TTL Console

硬件版本号 v30-s705c

硬件信息

  • SoC: MediaTek MT7620A
  • Flash: 16 MB
  • RAM: 128 MB
  • 电源: DC 5V-36V 1.5A
  • 以太网: 1x WAN, 4x LAN (10/100 Mbps)
  • 无线: 802.11n 2.4g-only
  • LED:
    System/Power (RUN): GPIO/26 active-low
    Ethernet: 1x WAN, 4x LAN
    Modem 1: GPIO/66 active-low
    RF 1 (Modem 1 Signal): GPIO/67 active-low
    Modem 2: GPIO 71 active-low
    RF 2 (Modem 2 Signal): GPIO/24 active-low
    WLAN: GPIO/72 active-low
    WPS: GPIO/12 active-low
  • 按钮:
    WPS / RESET: GPIO/34 active-low
  • UART: 1x UART on PCB - 115200 8N1
  • GPIO 看门狗: GPIO/62 mode=toggle timeout=1s
  • PCIe: 2x miniPCIe for modem (只焊了1个 另外一个需要自己焊)
  • SIM Slots: 2x SIM Slots

固件分析

原厂 Web UI

Factory Web UI

颇有 DD-wrt 风味

原厂 Uboot Web UI

无 DHCP
静态IP 192.168.1.1

Uboot Web UI

HTTP upload is done! Upgrading...
Bad firmware Magic Number,0x56190527
## Error: HTTP ugrade failed!

有校验

OS 版本

内核版本 3.10.44

root@router:~# cat /etc/openwrt_release
DISTRIB_ID="OpenWrt"
DISTRIB_RELEASE="Bleeding Edge"
DISTRIB_REVISION="r20476"
DISTRIB_CODENAME="barrier_breaker"
DISTRIB_TARGET="ramips/generic"
DISTRIB_DESCRIPTION="OpenWrt Barrier Breaker r20476"
DISTRIB_TAINTS="no-all no-ipv6 busybox"
root@router:~# cat /etc/openwrt_version
r20476

内核命令行

root@router:~# cat /proc/cmdline
console==/dev/null,115200 rootfstype=squashfs,ro

分区布局

root@router:/sys/class/leds# cat /proc/mtd
dev:    size   erasesize  name
mtd0: 00030000 00010000 "u-boot"
mtd1: 00180000 00010000 "kernel"
mtd2: 00a50000 00010000 "rootfs"
mtd3: 00400000 00010000 "rootfs_data"

没有 eeprom 的 factory 分区, 网卡MAC 存储在 /etc/hdconfig/systeminfo/system.info, /etc/system.info/etc/defconfig/system.info 文件内

GPIO

root@router:/# cat /sys/kernel/debug/gpio
GPIOs 0-23, platform/10000600.gpio, 10000600.gpio:

GPIOs 24-39, platform/10000638.gpio, 10000638.gpio:
 gpio-24  (modem2_signal1      ) out hi
 gpio-25  (led_data            ) out hi
 gpio-26  (led_sys             ) out lo
 gpio-29  (modem2_signal2      ) out hi
 gpio-30  (J2_6                ) in  hi
 gpio-31  (J2_9                ) in  hi
 gpio-32  (J2_4                ) in  hi
 gpio-33  (J2_1                ) in  hi
 gpio-34  (reset               ) in  hi

GPIOs 40-71, platform/10000660.gpio, 10000660.gpio:
 gpio-60  (3g1                 ) out hi
 gpio-61  (3g2                 ) out hi
 gpio-62  (hw_watchdog         ) out hi
 gpio-63  (sd                  ) out hi
 gpio-64  (gps                 ) out lo
 gpio-65  (simcard_s           ) out lo
 gpio-66  (modem               ) out hi
 gpio-67  (modem_signal1       ) out hi
 gpio-68  (gps_oe              ) out hi
 gpio-69  (temperature         ) out hi
 gpio-70  (modem_signal2       ) out hi
 gpio-71  (modem2              ) out hi

GPIOs 72-72, platform/10000688.gpio, 10000688.gpio:
 gpio-72  (led_wifi            ) out hi

使用 GPIO 看门狗而不是 MT7620A 内置的看门狗

部分 LED 无效, 板子 DTS 是 H9350 的, 看上去是几个板子的通用 DTS

端口监听状态

root@router:~# netstat -anp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:5188            0.0.0.0:*               LISTEN      1759/telnetd
tcp        0      0 0.0.0.0:2601            0.0.0.0:*               LISTEN      1613/zebra
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      1760/lighttpd
tcp        0      0 0.0.0.0:53              0.0.0.0:*               LISTEN      1944/dnsmasq
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1490/dropbear
tcp        0      0 0.0.0.0:23              0.0.0.0:*               LISTEN      1757/cli
tcp        0      0 0.0.0.0:1566            0.0.0.0:*               LISTEN      1753/socket_app
tcp        0    132 192.168.8.1:22          192.168.8.215:64557     ESTABLISHED 1004/dropbear
udp        0      0 0.0.0.0:53              0.0.0.0:*                           1944/dnsmasq
udp        0      0 0.0.0.0:67              0.0.0.0:*                           1944/dnsmasq
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags       Type       State         I-Node PID/Program name    Path
unix  2      [ ]         DGRAM                      2590 669/modem           /tmp/mp.listen
unix  2      [ ACC ]     STREAM     LISTENING       2855 1757/cli            /tmp/cli.sock
unix  14     [ ]         DGRAM                      2599 1752/syslogd        /dev/log
unix  2      [ ACC ]     STREAM     LISTENING       2149 1613/zebra          /var/run/quagga/zserv.api
unix  2      [ ACC ]     STREAM     LISTENING       2698 1757/cli            /tmp/.zserv
unix  2      [ ACC ]     STREAM     LISTENING        675 807/ubusd           /var/run/ubus.sock
unix  7      [ ]         DGRAM                      1785 1379/logd           /dev/log
unix  2      [ ]         DGRAM                      1924 1436/netifd
unix  2      [ ]         DGRAM                      2870 1892/dhcps
unix  3      [ ]         STREAM     CONNECTED       1349 1/procd
unix  3      [ ]         STREAM     CONNECTED       1788 807/ubusd           /var/run/ubus.sock
unix  2      [ ]         DGRAM                      2634 1756/natd
unix  2      [ ]         DGRAM                      1938 1436/netifd
unix  3      [ ]         STREAM     CONNECTED       1850 807/ubusd           /var/run/ubus.sock
unix  3      [ ]         STREAM     CONNECTED       1350 807/ubusd           /var/run/ubus.sock
unix  2      [ ]         DGRAM                     40520 669/modem
unix  2      [ ]         DGRAM                      1799 1/procd
unix  2      [ ]         DGRAM                      2633 1755/filterd
unix  2      [ ]         DGRAM                      1919 1004/dropbear
unix  3      [ ]         STREAM     CONNECTED       1849 1436/netifd
unix  2      [ ]         DGRAM                      2858 1761/openvpn_init
unix  2      [ ]         DGRAM                     39654 1763/time
unix  2      [ ]         DGRAM                      2651 1757/cli
unix  2      [ ]         DGRAM                      2624 1762/timing
unix  2      [ ]         DGRAM                      2144 1613/zebra
unix  2      [ ]         DGRAM                      1877 1465/crond
unix  2      [ ]         DGRAM                      2882 1944/dnsmasq
unix  3      [ ]         STREAM     CONNECTED       1787 1379/logd
unix  2      [ ]         DGRAM                      2644 1753/socket_app
unix  2      [ ]         DGRAM                      2629 1767/modem_mg
unix  2      [ ]         DGRAM                      2636 1754/ipfix

ROOT 密码 (OpenSSH/Telnet)

ROOT 密码是 superzxmn

OpenSSH 端口 TCP 22
Telnet 端口 TCP 5188

Telnet 23 端口被原厂定制的 CLI 程序吃了, 密码 super

CVE 链接

固件加密

  • 内层加密

XOR 配合 MD5 Salt 校验

package main

import (
    "crypto/md5"
    "os"
)

const (
    salt     = "hdm2mfreewifi"
    salt_len = len(salt)
)

func main() {
    data, err := os.ReadFile("input.bin")
    if err != nil {
        panic(err.Error())
    }

    encrypted := encrypt(data)
    output := addMD5(encrypted)

    os.WriteFile("encrypted.bin", output, 0644)
}

func addMD5(data []byte) []byte {
    hash := md5.New()

    hash.Write([]byte(salt))
    hash.Write(data)

    return hash.Sum(data)
}

func encrypt(data []byte) []byte {
    dataLen := len(data)
    fixedKey := dataLen / (salt_len + 1)
    encrypted := make([]byte, len(data))
    copy(encrypted, data)

    for i := range encrypted {
        key := (dataLen + i) - fixedKey
        encrypted[i] ^= byte(key)
    }

    return encrypted
}
使用 IDA 逆向原厂固件 /usr/sbin/encrypt 文件

刷写固件

OpenWRT PR地址 - 已合并

前往 OpenWRT 官网下载

刷写 Breed

刷了就死循环重启, 必砖!
应该是 GPIO 看门狗没喂狗导致的

Breed Console Bauds: 57600 8N1

Breed TTL Console

通过 UART 进入 UBoot 刷写

U-Boot WebUI 和 UART Console 升级固件有 Header Magic 验证, 更新内核 和 更新rootfs 也会检查 Header. 不过检查的是 uImage 和 squashfs header

内核分区只有 1.5M, OpenWRT 内核超过这个大小
所以我们必须先更新 rootfs,然后 启动固件一次 (直接启动 initramfs-kernel 失败, 自动重启)
然后我们可以去 openwrt 并将完整固件刷入到 SPI NOR

固件格式有双层加密, 而且同样会检查分区大小, 无法刷入最新固件, 所以搞出来也没有意义

  1. 使用静态 IP 地址配置 PC 并设置 TFTP 服务器。
  2. 将 rootfs 和 sysupgrade (固件) 放入 tftp 目录中.
  3. 按照 PCB 上的说明连接 UART
  4. 启动设备并按 Ctrl+C 中断自动启动
  5. 使用 system 6 命令并按照说明设置设备和 tftp 服务器 IP 地址并输入 rootfs 文件名
    然后 U-boot 将加载 rootfs 并将其写入闪存。
  6. 使用 system 1 命令并按照说明设置设备和 tftp 服务器 IP 地址并输入固件文件名
    然后 U-boot 将引导固件一次
  7. 登录 LuCI 并使用 LuCI 升级固件

原厂固件下载

H8922_v30.zip

最后修改:2025 年 03 月 10 日
如果觉得我的文章对你有用,请随意赞赏