搁废品站捡的 4G 工业路由
拆解
硬件版本号 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
颇有 DD-wrt 风味
原厂 Uboot Web UI
无 DHCP
静态IP 192.168.1.1
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
固件加密
- 内层加密
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
文件
刷写固件
刷写 Breed
刷了就死循环重启, 必砖!
应该是 GPIO 看门狗没喂狗导致的
Breed Console Bauds: 57600 8N1
通过 UART 进入 UBoot 刷写
U-Boot WebUI 和 UART Console 升级固件有 Header Magic 验证, 更新内核 和 更新rootfs 也会检查 Header. 不过检查的是 uImage 和 squashfs header
内核分区只有 1.5M, OpenWRT 内核超过这个大小
所以我们必须先更新 rootfs,然后 启动固件一次 (直接启动 initramfs-kernel 失败, 自动重启)
然后我们可以去 openwrt 并将完整固件刷入到 SPI NOR
固件格式有双层加密, 而且同样会检查分区大小, 无法刷入最新固件, 所以搞出来也没有意义
- 使用静态 IP 地址配置 PC 并设置 TFTP 服务器。
- 将 rootfs 和 sysupgrade (固件) 放入 tftp 目录中.
- 按照 PCB 上的说明连接 UART
- 启动设备并按 Ctrl+C 中断自动启动
- 使用
system 6
命令并按照说明设置设备和 tftp 服务器 IP 地址并输入 rootfs 文件名
然后 U-boot 将加载 rootfs 并将其写入闪存。 - 使用
system 1
命令并按照说明设置设备和 tftp 服务器 IP 地址并输入固件文件名
然后 U-boot 将引导固件一次 - 登录 LuCI 并使用 LuCI 升级固件
4 条评论
按照ttl接法不跑码,无显示,能不能详细讲一下怎么修改dts以及封装,最近搞了几天没有任何头绪,似乎网络中对其研究的颇少,感谢大神的无私奉献!
什么型号的
宏电h8920好像,cpu是7628nn的,ssh进去后分区都是有的,ttys默认是2,应该是没有ttys2的,我改成0想能不能封装回去看看ttl能不能跑码,可惜不会封装回去。在ssh中刷机就成砖了,我有原包,用ch340a又刷回去了,刷不死breed也是一样砖
H8922S 还是 5G 版本?
加我Q 3788148273