前言
之前装机时移动给配发的光猫是ZXHN F7000MV3 。这个猫只有千兆电口,一直想着把它换掉。最近发现2.5G光猫包邮到手只要34元,遂下单了一只XG-140G-MD,这个猫评价还可以,重点是容易破解。
我这里移动宽带只验证LOID,填写LOID和密码(123456)就能过验证,无需修改SN、MAC等信息。至于配置信息,直接照抄F7000MV3即可,配置桥接模式毫无难度。
修改地区
超级用户:CMCCAdmin
超级密码:aDm8H%MdA
用上述默认信息登录光猫,访问 http://192.168.1.1/opid_setting.cgi 设置省份。不同地区TR069配置不同,如果想自动下发配置,本步骤必不可少,如果自行配置就无所谓了。
开启telnet
用默认的超级用户名及密码登录管理页面,然后访问 http://192.168.1.1/system.cgi?telnet 即可开启telnet。
默认user登录telnet拿不到root权限。拿root权限有2种方式:
ftp用户提权
首先在光猫管理页面中打开ftp功能,这是为了启用 user_ftp 这一用户:

然后用光猫背面的user及密码登录telnet。默认的user权限很低,不过可以免密切换到 user_ftp ,user_ftp 又可以免密切换到root,拿到root权限后就可以为所欲为了:
su user_ftp
su
cfgcli -s InternetGatewayDevice.DeviceInfo.X_CT-COM_ServiceManage.SuPassword aDm8H%MdA (修改root密码为aDm8H%MdA)记得第一时间改掉root密码,这里不要图省事用passwd root修改,要用系统提供的cfgcli工具。
直接破解root密码
本破解脚本来自移动光猫超级密码获取教程:诺基亚XG-04G-MF桥接模式设置详解:
脚本第3行做了小小修改,将依赖库改成了 pycryptodomex ,原始脚本依赖库搞不定,修改后运行完美:
python -m pip install pycryptodomeximport base64
from typing import Optional
from Cryptodome.Cipher import AES
class RouterCrypto:
"""路由器加密解密工具类"""
DEFAULT_KEY = '3D A3 73 D7 DC 82 2E 2A 47 0D EC 37 89 6E 80 D7 2C 49 B3 16 29 DD C9 97 35 4B 84 03 91 77 9E A4'
DEFAULT_IV = 'D0 E6 DC CD A7 4A 00 DF 76 0F C0 85 11 CB 05 EA'
def __init__(self, key: Optional[str] = None, iv: Optional[str] = None):
self.key = key or self.DEFAULT_KEY
self.iv = iv or self.DEFAULT_IV
self._cipher = None
self._init_cipher()
def _init_cipher(self) -> None:
"""初始化AES密码器"""
try:
key_bytes = self._hex_string_to_bytes(self.key)
iv_bytes = self._hex_string_to_bytes(self.iv)
self._cipher = AES.new(key_bytes, AES.MODE_CBC, iv_bytes)
except Exception as e:
raise ValueError(f"初始化密码器失败: {e}")
@staticmethod
def _hex_string_to_bytes(hex_string: str) -> bytes:
"""将十六进制字符串转换为字节"""
hex_clean = hex_string.replace(' ', '')
return bytes.fromhex(hex_clean)
@staticmethod
def _remove_pkcs7_padding(data: bytes) -> bytes:
"""移除PKCS7填充"""
if not data:
return data
padding_length = data[-1]
if padding_length > len(data) or padding_length == 0:
raise ValueError("无效的填充")
for i in range(padding_length):
if data[-(i + 1)] != padding_length:
raise ValueError("填充验证失败")
return data[:-padding_length]
def decrypt(self, encrypted_data: bytes) -> bytes:
"""解密数据"""
try:
self._init_cipher()
decrypted = self._cipher.decrypt(encrypted_data)
return self._remove_pkcs7_padding(decrypted)
except Exception as e:
raise ValueError(f"解密失败: {e}")
def decrypt_base64(self, base64_data: str, encoding: str = 'utf-8') -> str:
"""解密Base64编码的数据并返回字符串"""
try:
encrypted_bytes = base64.b64decode(base64_data)
decrypted_bytes = self.decrypt(encrypted_bytes)
return decrypted_bytes.decode(encoding)
except Exception as e:
raise ValueError(f"Base64解密失败: {e}")
def main():
# 将获取到的加密密码填入这里
encrypted_base64 = '这里填入SuPassword的v值'
try:
crypto = RouterCrypto()
decrypted_text = crypto.decrypt_base64(encrypted_base64)
print(f"解密结果: {decrypted_text}")
except Exception as e:
print(f"解密失败: {e}")
if __name__ == "__main__":
main()诺基亚光猫使用AES-CBC加密,密钥和向量固定:
密钥:3D A3 73 D7 DC 82 2E 2A 47 0D EC 37 89 6E 80 D7 2C 49 B3 16 29 DD C9 97 35 4B 84 03 91 77 9E A4
初始向量:D0 E6 DC CD A7 4A 00 DF 76 0F C0 85 11 CB 05 EA
打开 http://192.168.1.1/dumpdatamodel.cgi ,搜索 SuPassword ,定位到这样一段:
<SuPassword ml="64" rw="RW" t="string" v="LZ8gkScDdQUp2k+it/ADtw==" ealgo="ab"></SuPassword>LZ8gkScDdQUp2k+it/ADtw== 就是加密后的密码,把它复制到脚本中,赋值给 encrypted_base64 ,运行后即可逆向得到原始密码:
解密结果: aDm8H%MdA
赞美原脚本作者,他写的光猫破解教程很到位,推荐阅读。
至此光猫破解大功告成,后续照抄原猫配置即可。如果页面超密被远程更改,可以用root身份telnet登录后,执行
cfgcli -s InternetGatewayDevice.DeviceInfo.X_CT-COM_TeleComAccount.Password aDm8H%MdA
改回默认超级密码。
常用命令备份
在超级用户的状态下访问 http://192.168.1.1/system.cgi?telnet 开启telnet功能
使用 telnet 协议连接光猫 通过普通用户登录(光猫背面铭牌处)后以 su user_ftp(有些光猫可能为su useradmin_ftp 取决于光猫背面铭牌处的信息) 身份登录 ,密码和普通账户密码相同
输入su获取root权限
修改SN(必须三条都修改)
ritool set YPSerialNum NBEL5A01B711 (要修改的SN)
ritool set MfrID NBEL (要修改的SN的前四位,应该是厂商代码)
ritool set G984Serial 5A01B711 修改的SN的8位)
修改MAC
ritool set MACAddress 3c:bd:69:6b:6d:7a (修改MAC地址为3c:bd:69:6b:6d:7a)
修改root密码
cfgcli -s InternetGatewayDevice.DeviceInfo.X_CT-COM_ServiceManage.SuPassword aDm8H%MdA (修改root密码为aDm8H%MdA)
修改超级登录用户名
cfgcli -s InternetGatewayDevice.DeviceInfo.X_CT-COM_TeleComAccount.UserName CMCCAdmin (修改超级用户为CMCCAdmin)
修改超级登录密码
cfgcli -s InternetGatewayDevice.DeviceInfo.X_CT-COM_TeleComAccount.Password aDm8H%MdA (修改超级密码为aDm8H%MdA)
关闭虚拟机
cfgcli -s InternetGatewayDevice.SoftwareModules.ExecEnv.1.Enable false
cfgcli -s InternetGatewayDevice.SoftwareModules.ExecEnv.2.Enable false
开启全锥形网络
cfgcli -s InternetGatewayDevice.WANDevice.1.WANConnectionDevice.2.WANPPPConnection.1.X_ASB_COM_FullconeNATEnabled true (第二个参数2代表网络侧信息2_INTERNET_B_VID_41 如果不同则修改为自身光猫对应的参数
)
设备注册提示:1是关闭,0是开启
cfgcli -s InternetGatewayDevice.X_CT-COM_UserInfo.Status 0
cfgcli -s InternetGatewayDevice.X_CT-COM_UserInfo.Result 1
开启 ipv6
cfgcli -f -s InternetGatewayDevice.DeviceInfo.X_CT-COM_IPProtocolVersion.Mode 3
修改设备基本信息
ritool set MfrID HWTC (将生产厂家标识NBEL 改为HWTC)
ritool set Mnemonic G-140W-ME (设备型号改为G-140W-ME)
恢复出厂设置
cfgcli -r
重启设备
reboot 或 reset
开启EPON和GPON自适应(待验证)
cfgcli -s InternetGatewayDevice.X_ASB_COM_PON_MODE.EnableAutoPon true
查看当前连接数
cat /proc/sys/net/netfilter/nf_conntrack_count
查看最大值连接数
cat /proc/sys/net/netfilter/nf_conntrack_max
修改最大值连接线(推荐300000)
vi nf_conntrack_max
查看系统
查看所有设置:ritool dump
查看内存:cat /proc/meminfo
查看当前挂载分区:cat /proc/mounts
硬件中断统计:cat /proc/interrupts
查看负载:cat /proc/loadavg
cat /proc/stat
驱动程序设备ID: cat /proc/devices
常用配置网页:
选择省份界面 http://192.168.1.1/opid_setting.cgi
固件升级路径:http://192.168.1.1/upgrade.cgi
插件配置卸载路径:http://192.168.1.1/upgrade_plugin.cgi?
Upnp功能开启:http://192.168.1.1/upnp.cgi?
usb备份、恢复:http://192.168.1.1/usb.cgi?backup
TR069 RMS平台认证:http://192.168.1.1/tr69.cgi
AWIFI激活管理平台:http://192.168.1.1/awifi_config.cgi
设备码等信息查看:http://192.168.1.1/bucpe.cgi
设定password密码:http://192.168.1.1/gpon_config.cgi
设定LAN端IPV6: http://192.168.1.1/lan_cu.cgi
配置文件查看:http://192.168.1.1/dumpdatamodel.cgi
全部来自恩山帖子