ZTE光猫开启telnet·备份固件·记录

下载工具

  • factorymode_crack
  • zteOnu

前提

  • 你的光猫是中兴的

  • 运营商还没有下发配置(意味着你需要reset)

  • factorymode_crack 适用老款光猫

  • zteOnu 兼容新款光猫

  • 在中兴F653GV9上测试通过

factorymode_crack 使用方法

  1. cd 到 factorymode_crack 目录

  2. 运行相关命令

1
./factorymode_crack.exe -l xxx open -i 192.168.1.1 -u CMCCAdmin -pw aDm8H%MdA -p 80

如果不行可以将80端口改为8080端口

zteOnu 使用方法

  1. cd 到 zteOnu 目录

  2. 运行相关命令

1
./zteOnu --ip 192.168.1.1 --user CMCCAdmin --pass aDm8H%MdA --port 80

加上 --telnet 参数可以固化telnet,但在我这台机器上不行,所以我就不加了

telnet

使用windows自带的telnet工具可能会出现无法打开23端口的情况,可以使用putty工具

1
telnet 192.168.1.1

可以看一下路由器的配置

1
ls /proc/capability/

然后 cat 里面的文件,可以看到一些配置信息

1
2
3
4
5
# 把光猫背面的普通用户提升为超级管理员
sendcmd 1 DB set DevAuthInfo 1 Level 1
# 设置修改超级管理员的用户名和密码
sendcmd 1 DB set DevAuthInfo 0 User xxxxxxxx
sendcmd 1 DB set DevAuthInfo 0 Pass yyyyyyyy

本人的光猫是移动版中兴 F653GV9

在此记录具体信息

通过命令,可以得知以下信息:

项目型号
处理器ARMv7 Processor rev 1 (v7l)
内存512MB
内核版本4.1.25
芯片ZX279127S
核心数1
芯片厂商ZXIC
固件大小256M
设备树ZTE ZX27912X
BogoMIPS1987.37
主频(推测)993.7MHz

这个光猫还是不错的,虽然单核A9的处理器配512MB内存很难绷得住,但是全千兆端口、无Wifi、稳定性很好,不过没有源码,只能充当光电转换的角色。

点击查看具体信息

固件和芯片

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
/ # uname -a
Linux F653GV9 4.1.25 #1 SMP Fri Jul 22 10:26:33 CST 2022 armv7l GNU/Linux
/ # cat /proc/version
Linux version 4.1.25 ([email protected]) (gcc version 4.9.4 (Buildroot 2017.05-svn2186) ) #72 SMP Sun Jun 06 21:16:58 CST 2021
/ # cat /proc/cpuinfo
processor : 0
model name : cortex-a9 (arm v7l)
BogoMIPS : 1987.37
Features : half fastmult edsp tls
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x4
CPU part : 0xc09
CPU revision : 1

Hardware : ZTE ZX27912X (Device Tree)
Revision : 0000
Serial : 0000000000000000
/ # cat /proc/capability/boardtype
type : F653GV9
flag : 1
vid : 167
optype : 0
optname : DF
tmtype : 0
cpuname : ZX279127S
cpuid : 4
chipvendor : ZXIC
/ # cat /proc/capability/ethernetmac
IfName EMAC Mode Speed Duplex AutoNeg CurMode Port
eth0 0 1 1000Mbps full 1 GMII 3
eth1 0 1 1000Mbps full 1 GMII 2
eth2 0 1 1000Mbps full 1 GMII 1
eth3 0 1 1000Mbps full 1 GMII 0
wan_lport: 3
/ # free
total used free shared buffers
Mem: 524288 208224 316064 1144 3432
Swap: 0 0 0
Total: 524288 208224 316064
/ # cat /proc/stat
cpu 21685 0 30484 4788950 5442 0 6943 0 0 0
cpu0 21685 0 30484 4788950 5442 0 6943 0 0 0
intr 16666950 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4853504 0 0 644176 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 55191 0 0 0 0 1353694 0 0 7 7 2 7 0 0 0 0 9706974 0 0 0 0 0 0 0 53388
ctxt 52842244
btime 4294967295
processes 2134
procs_running 1
procs_blocked 0
softirq 17183364 9706467 4853357 19422 1354886 3090 0 61 0 0 1246081
/ # cat sys/bus/cpu/devices/cpu0/uevent
OF_NAME=cpu
OF_FULLNAME=/cpus/cpu@0
OF_TYPE=cpu
OF_COMPATIBLE_0=arm,cortex-a9
OF_COMPATIBLE_N=1

分区和挂载

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
/ # fdisk -l

Disk /dev/loop0: 20 MB, 20418560 bytes
255 heads, 63 sectors/track, 2 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Disk /dev/loop0 doesn't contain a valid partition table

Disk /dev/mtdblock0: 268 MB, 268435456 bytes
255 heads, 63 sectors/track, 32 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Disk /dev/mtdblock0 doesn't contain a valid partition table

Disk /dev/mtdblock10: 52 MB, 52428800 bytes
255 heads, 63 sectors/track, 6 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Disk /dev/mtdblock10 doesn't contain a valid partition table
/ # df
Filesystem 1024-blocks Used Available Use% Mounted on
/dev/root 32640 27332 5308 84% /
/dev/loop0 19968 19968 0 100% /kmodule
/dev/mtdblock3 4096 456 3640 11% /tagparam
tmpfs 20480 252 20228 1% /var
tmpfs 25600 0 25600 0% /vasdocker
tmpfs 81920 0 81920 0% /upgtempfile
tmpfs 2048 0 2048 0% /var/osstmp
tmpfs 2048 0 2048 0% /mnt
tmpfs 16384 24 16360 0% /var/felix-temp
tmpfs 15360 32 15328 0% /tmp
/dev/mtdblock5 8192 640 7552 8% /userconfig
/dev/mtdblock6 4096 384 3712 9% /kmodule/usr/local/ct
ubi0_0 41628 25872 15756 62% /kmodule/usr/tmp
/dev/loop1 26624 26624 0 100% /kmodule/usr/java
ubi1_0 55508 9788 42852 19% /kmodule/usr/plugin
/dev/mtdblock4 4096 404 3692 10% /wlan
cgroup_root 222696 0 222696 0% /sys/fs/cgroup
/ # cat /etc/fstab
# <file system> <mount point> <type> <options> <dump> <pass>

# The syntax of busybox's fstab entry's a little different than traditional
# mount, and doesn't work with the usual 'rootfs / rootfs rw 0 0' entry.
# Actually, it's not needed unless you're mounting from a non-nfs device,
# like a hard disk. In that case, you probably need something like the
# following:

# /dev/hda1 / ext3 rw 1 1

proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
#devpts /dev/pts devpts defaults 0 0
#tmpfs /var tmpfs rw 0 0
/ # cat /proc/mtd
dev: size erasesize name
mtd0: 10000000 00020000 "whole flash"
mtd1: 00200000 00020000 "u-boot"
mtd2: 00400000 00020000 "others"
mtd3: 00400000 00020000 "parameter tags"
mtd4: 00400000 00020000 "wlan"
mtd5: 00800000 00020000 "usercfg"
mtd6: 00400000 00020000 "middleware"
mtd7: 02000000 00020000 "kernel1"
mtd8: 02000000 00020000 "kernel2"
mtd9: 03200000 00020000 "osgi1"
mtd10: 03200000 00020000 "osgi2"
mtd11: 04100000 00020000 "plugin_data"
mtd12: 01fe0000 00020000 "rootfs"

备份固件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/ # mtd_debug read /dev/mtd0 0 0x10000000 /mnt/usb1_1/mtd0
/ # tftp -p -l mtd0 192.168.1.2
/ # tftp -p -l mtd1 192.168.1.2
/ # tftp -p -l mtd2 192.168.1.2
/ # tftp -p -l mtd3 192.168.1.2
/ # tftp -p -l mtd4 192.168.1.2
/ # tftp -p -l mtd5 192.168.1.2
/ # tftp -p -l mtd6 192.168.1.2
/ # tftp -p -l mtd7 192.168.1.2
/ # tftp -p -l mtd8 192.168.1.2
/ # tftp -p -l mtd9 192.168.1.2
/ # tftp -p -l mtd10 192.168.1.2
/ # tftp -p -l mtd11 192.168.1.2
/ # tftp -p -l mtd12 192.168.1.2

分区具体信息

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131

/ # cd /dev/
/ # mtd_debug info mtd0
mtd.type = MTD_NANDFLASH
mtd.flags =
mtd.size = 268435456 (256M)
mtd.erasesize = 131072 (128K)
mtd.oobblock = 2048 (2K)
mtd.oobsize = 64
mtd.ecctype = MTD_ECC_NONE
regions = 0

/ # mtd_debug info mtd1
mtd.type = MTD_NANDFLASH
mtd.flags =
mtd.size = 2097152 (2M)
mtd.erasesize = 131072 (128K)
mtd.oobblock = 2048 (2K)
mtd.oobsize = 64
mtd.ecctype = MTD_ECC_NONE
regions = 0

/ # mtd_debug info mtd2
mtd.type = MTD_NANDFLASH
mtd.flags =
mtd.size = 4194304 (4M)
mtd.erasesize = 131072 (128K)
mtd.oobblock = 2048 (2K)
mtd.oobsize = 64
mtd.ecctype = MTD_ECC_NONE
regions = 0

/ # mtd_debug info mtd3
mtd.type = MTD_NANDFLASH
mtd.flags =
mtd.size = 4194304 (4M)
mtd.erasesize = 131072 (128K)
mtd.oobblock = 2048 (2K)
mtd.oobsize = 64
mtd.ecctype = MTD_ECC_NONE
regions = 0

/ # mtd_debug info mtd4
mtd.type = MTD_NANDFLASH
mtd.flags =
mtd.size = 4194304 (4M)
mtd.erasesize = 131072 (128K)
mtd.oobblock = 2048 (2K)
mtd.oobsize = 64
mtd.ecctype = MTD_ECC_NONE
regions = 0

/ # mtd_debug info mtd5
mtd.type = MTD_NANDFLASH
mtd.flags =
mtd.size = 8388608 (8M)
mtd.erasesize = 131072 (128K)
mtd.oobblock = 2048 (2K)
mtd.oobsize = 64
mtd.ecctype = MTD_ECC_NONE
regions = 0

/ # mtd_debug info mtd6
mtd.type = MTD_NANDFLASH
mtd.flags =
mtd.size = 4194304 (4M)
mtd.erasesize = 131072 (128K)
mtd.oobblock = 2048 (2K)
mtd.oobsize = 64
mtd.ecctype = MTD_ECC_NONE
regions = 0

/ # mtd_debug info mtd7
mtd.type = MTD_NANDFLASH
mtd.flags =
mtd.size = 33554432 (32M)
mtd.erasesize = 131072 (128K)
mtd.oobblock = 2048 (2K)
mtd.oobsize = 64
mtd.ecctype = MTD_ECC_NONE
regions = 0

/ # mtd_debug info mtd8
mtd.type = MTD_NANDFLASH
mtd.flags =
mtd.size = 33554432 (32M)
mtd.erasesize = 131072 (128K)
mtd.oobblock = 2048 (2K)
mtd.oobsize = 64
mtd.ecctype = MTD_ECC_NONE
regions = 0

/ # mtd_debug info mtd9
mtd.type = MTD_NANDFLASH
mtd.flags =
mtd.size = 52428800 (50M)
mtd.erasesize = 131072 (128K)
mtd.oobblock = 2048 (2K)
mtd.oobsize = 64
mtd.ecctype = MTD_ECC_NONE
regions = 0

/ # mtd_debug info mtd10
mtd.type = MTD_NANDFLASH
mtd.flags =
mtd.size = 52428800 (50M)
mtd.erasesize = 131072 (128K)
mtd.oobblock = 2048 (2K)
mtd.oobsize = 64
mtd.ecctype = MTD_ECC_NONE
regions = 0

/ # mtd_debug info mtd11
mtd.type = MTD_NANDFLASH
mtd.flags =
mtd.size = 68157440 (65M)
mtd.erasesize = 131072 (128K)
mtd.oobblock = 2048 (2K)
mtd.oobsize = 64
mtd.ecctype = MTD_ECC_NONE
regions = 0

/ # mtd_debug info mtd12
mtd.type = MTD_NANDFLASH
mtd.flags =
mtd.size = 33423360 (31M)
mtd.erasesize = 131072 (128K)
mtd.oobblock = 2048 (2K)
mtd.oobsize = 64
mtd.ecctype = MTD_ECC_NONE
regions = 0

常用 telnet 命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 查看所有配置
sendcmd 1 DB p all # 有些版本不现实
#超密查询
sendcmd 1 DB p DevAuthInfo
#telnet密码查询
sendcmd 1 DB p TelnetCfg
#pppoe密码查询
sendcmd 1 DB p WANCPPP
#wifi密码查询
sendcmd 1 DB p WLANPSK

#1指的是APPID,对应进程cspd,可通过命令sendcmd -pc show 查看进程列表

# 关闭运营商远程操作
sendcmd 1 DB set MgtServer 0 Tr069Enable 0

配置分析

超级管理员账号为CMCCAdmin,密码变成了CMCCAdmin+8位随机字符串(数字/字母/特殊字符)这个基本上是随机的没有规律

pppoe拨号的账号为手机号@net,密码为12345678

参考

  • 中兴光猫开临时telnet-修改超管密码-固化开启telnet—-第一期

  • 【天翼天邑】 中兴电信光猫天翼4.0破解获取超级密码教程

  • 【网络】 简单分享F7015TV3新款光猫详细参数及分享个人光猫修改经验

  • F653GV9 成功开启telnet 备份固件

  • 光猫破解教程二:固件备份(小白升级篇,同样适用于路由器)

  • 移动光猫固件备份、刷机、改sn和mac等

  • 中兴7015TV3 开启telnet 换光猫 折腾记录

  • 【中兴】 中兴光猫 ZXHNTelnet设置代码大全

  • 移动中兴ZXHN F6610M光猫拨号密码查询

后续 挂在 OpenWrt 上的 Python 脚本

这光猫的系统是 Linux,并且有 BusyBox,理论可以通过 BusyBox 的一些命令来实现一些高级操作

然而还是我想多了,这个光猫的 BusyBox 版本太低,而且有大量的命令被删除了,所以只能用来做一些简单的操作

比如 iptables,可以通过 iptables 命令来设置防火墙规则,然而并不生效

又比如 tc,可以通过 tc 命令来设置网络带宽,然而 qdisc 的算法都被删除了

或许你可以想到使用 shell 脚本来实现一些功能,然而这个光猫的固件使用了 UBI 文件系统,ROOTFS 是只读的,以及没有任何文本编辑器(vi、vim、nano、emacs 都没有),即使是 sh 也是 not found。

只有 ifconfig 还算正常,可以通过 ifconfig 命令来设置网络接口

故此,只能另辟蹊径了,比如使用 Python 来实现一些功能

可以利用上述脚本模拟延迟

把它添加应用到 bash 脚本中,再使用路由器的定时任务中,可以实现某时段的延迟

至于限速,目前则是无能为力了。

由于一些原因,不能直接从外网访问到该路由(并非是没有 IPv6),故,通过挂在其下的 OpenWrt 来实现

功能

我用于执行 ifconfig 命令,可以指定延迟和随机延迟,以及执行次数

一个 Python 脚本来生成一个计划任务列表,追加到 crontab 中

没有自己的服务器,我们要怎么把 IP 传递到外网呢?

可以通过 git 来实现,git 有一个功能,就是可以通过 git push 命令,把本地的文件推送到远程仓库

在 openwrt 上,安装 git、openssh-keygen、openssh-client、python3

搭配默认的 crontab 计划任务,每隔一段时间执行一次脚本,把 IP 写入到一个文件中,然后通过 git 推送到远程仓库

那么就可以实现通过 git 来获取 IP 了

在 openwrt 上执行以下命令

1
2
3
4
5
6
7
8
cat /proc/net/arp # 可以得到 ipv4 mac 连接的硬件接口
iwinfo phy1-ap0 info # 可以得到无线接口的信息
iwinfo phy1-ap0 assoclist # 可以得到无线接口连接的设备信息
iw dev phy1-ap0 station dump # 可以得到无线接口详细参数
cat /tmp/dhcp.leases # 可以得到 dhcp 信息(ipv4 mac 以及设备名)
cat /tmp/hosts/odhcpd # 可以得到 dhcp 信息(ipv6 以及设备名)
ifconfig # 可以得到所有接口的信息
ip addr # 可以得到所有接口的信息

结合以上命令,可以得到当前连接到路由器的设备的 IP 地址

一个 Python 脚本来检测 /tmp/python-script/ 目录下的所有 .log 文件的大小,当大小达到 1MB 时,删除前半段内容

同理,可以通过 git 来读取配置文件,然后执行相应的操作

使用方法

脚本文件

下载

将脚本文件解压到 openwrt 的 /usr/bin/ 目录下

然后在 openwrt 上执行以下命令

1
chmod +x /usr/bin/pyscript.py

然后编辑 cron 计划任务

1
vim /etc/crontabs/root

添加以下内容

1
2
# 每天 0 点执行一次
0 0 * * * /usr/bin/python3 /usr/bin/pyscript.py

我将一些路径设定在了 /tmp/python-script/ 目录下,你可以根据自己的需要修改这个路径重启后会清空,可以改到 /root/ 目录下,这个目录是可以持久化的