1. 项目概述:为什么HG8120C光猫的超级密码值得花30分钟去拿
华为HG8120C是电信在2017—2020年间大规模铺货的FTTH终端设备,至今仍有大量在网运行。它外观小巧、功耗低、稳定性好,但出厂固件被深度定制——Wi-Fi设置锁死、DHCP不可关闭、桥接模式隐藏、IPTV VLAN无法手动配置,甚至连“恢复出厂设置”都会重置为运营商预设参数。很多用户想自己组网、换路由器、做旁路软路由、调试IPTV组播,或者单纯想把光猫从“智能网关”降级为纯粹的光电转换器(即桥接模式),第一步卡住的永远是那个写着“admin”的默认账号——它只能登录普通管理界面,连“高级设置”里的关键开关都灰掉。而真正的超级管理员账户(通常是root或telecomadmin)拥有完整shell权限、可读写Flash分区、能修改bootargs、甚至直接刷写固件。这篇记录不是教你怎么“破解”,而是还原一个真实场景下,一名网络工程师如何在不拆机、不短接、不依赖第三方工具的前提下,仅用一台笔记本+网线+基础命令行,于2021年12月12日当天,在一台实机HG8120C上成功获取root密码的全过程。核心关键词就三个:华为HG8120C、Telnet、超级管理员密码——它们不是孤立存在,而是一条技术链:Telnet是通道,HG8120C是载体,超级密码是钥匙。适合三类人细读:一是家里光猫卡在桥接环节、反复重置无效的普通用户;二是刚入行的装维师傅,想摆脱“打不开高级设置就只能报修”的被动;三是备考华为ICT认证或参与家庭网络改造的爱好者——因为这个过程里涉及的HTTP请求构造、Telnet会话维持、Flash分区结构认知,全是真刀真枪的实操能力。
我试过不下二十台不同批次的HG8120C,发现它的固件版本集中在V3R019C10SP03和V3R019C10SP05两个分支。前者出厂默认关闭Telnet服务,后者部分局点开启了但做了IP白名单限制。很多人搜到的“万能密码”列表(比如admin/admin、root/huawei、telecomadmin/nE7jA%5m)在新固件上基本失效,因为运营商已通过TR-069远程下发策略,动态覆盖了初始密码。真正可靠的路径只有一条:利用设备自身存在的HTTP接口缺陷,触发后台服务主动开启Telnet端口,并导出存储在Flash中的明文密码文件。这不是漏洞利用,而是对设备固件逻辑的逆向理解——就像知道老式机械锁的弹子排列后,用特制钥匙开门,而不是砸锁。整个过程不需要安装任何“光猫综合管理工具”,不调用中兴/烽火的通用脚本,更不涉及所谓“读取Bootloader”这种高风险操作。你只需要打开浏览器开发者工具、记事本、CMD或Terminal,全程可控、可中断、无副作用。下面我会把每一步背后的原理、可能失败的原因、以及我当时在测试机上看到的真实响应,全部摊开讲清楚。
2. 核心思路拆解:为什么必须绕过Web界面,直击HTTP API层
2.1 HG8120C的权限分层设计:Web UI只是个“前台窗口”
HG8120C的管理架构是典型的三层分离:最上层是用户看到的Web界面(HTML+JS),中间层是嵌入式Web服务器(通常是lighttpd或boa),最底层是Linux内核+BusyBox+定制守护进程(如webserver、tr069c、telnetd)。普通账号admin的权限被严格限定在Web服务器的ACL规则里——它能访问/html/advanced.html页面,但该页面的JS脚本在提交表单时,会向/cgi-bin/webcm发送POST请求,而webcm这个CGI程序内部做了硬编码校验:只有uid=0(即root)的进程才能执行set_bridge_mode()或write_flash_config()这类函数。换句话说,Web界面本身就是一个“权限过滤器”,它把用户输入包装成安全请求,再交给后台处理。你点十次“启用桥接”,只要没root权限,后台就返回{"result":"fail","reason":"permission denied"}。所以,想拿到超级密码,必须跳过这个过滤器,直接和后台服务对话。
2.2 Telnet不是“后门”,而是被刻意保留的运维通道
很多人误以为Telnet是厂商留的后门,其实恰恰相反——它是华为设备的标准运维接口。HG8120C的固件里始终内置telnetd进程,但默认处于stopped状态。运营商之所以关闭它,是因为Telnet传输明文密码,存在中间人窃听风险。但关闭不等于删除,相关二进制文件(/bin/telnetd)、配置文件(/etc/init.d/S50telnetd)、甚至密码文件(/var/passwd)都完整保留在Flash中。关键在于:如何让telnetd启动?答案藏在设备的TR-069协议栈里。HG8120C支持CWMP(CPE WAN Management Protocol),其tr069c进程会定期向ACS服务器(电信的自动配置系统)上报状态,并接收指令。其中一条标准指令是SetParameterValues,用于修改设备参数。而固件开发者为了方便远程维护,在tr069c的代码里埋了一个“调试开关”:当收到特定参数路径(如Device.ManagementServer.EnableCWMP)的值为false时,tr069c会顺带执行/bin/sh -c "telnetd -l /bin/sh -p 23"来启动Telnet服务。这个行为不是BUG,是设计文档里明确写的“本地调试模式”。我们做的,只是模拟ACS服务器,向这个接口发送一次合法的HTTP POST请求。
2.3 密码存储位置:为什么/var/passwd是明文,且不可被Web UI修改
HG8120C的密码并非哈希存储,而是以明文形式写入/var/passwd文件。这个文件结构类似标准Unix的/etc/passwd,但多了一列:username:password:uid:gid:gecos:home:shell。例如一行可能是root:$1$abc123$xyz456:0:0:root:/root:/bin/sh——注意第二字段是MD5加密的,但别急,这恰恰是突破口。固件里有个叫get_password的工具,它会读取/var/config/目录下的user.cfg(这是Web UI保存用户设置的地方),然后根据其中的super_user_pwd字段生成MD5值,再写入/var/passwd。而user.cfg本身是明文文本,用vi或cat就能查看。更关键的是:user.cfg的写入权限只对root开放,但读取权限是644(所有用户可读)。也就是说,只要你能通过Telnet以root身份登录,cat /var/config/user.cfg就能直接看到super_user_pwd=XXXXXX这一行。但问题来了——你还没登录,怎么读?答案是:利用webserver进程的一个未授权API。HG8120C的Web服务器在/cgi-bin/目录下暴露了getpage接口,它本意是供前端JS动态加载页面片段,但参数校验极松。当你GET/cgi-bin/getpage?pid=1&nextpage=login.asp时,服务器会返回login.asp的HTML源码;而当你GET/cgi-bin/getpage?pid=1&nextpage=/var/config/user.cfg时,它会直接读取并输出这个文件内容!这就是整个流程中最精妙的一环:用Web服务器的“文件包含”特性,绕过权限检查,提前拿到超级密码的明文。
2.4 方案选型对比:为什么不用“中兴光猫开启Telnet工具”或“RTX超级密码”
网络上流传的“一键开启Telnet工具”,本质是封装好的Python脚本,它模拟HTTP请求向光猫发送SetParameterValues指令。但HG8120C的固件对tr069c的指令校验非常严格:必须携带正确的SessionID、SOAPAction头、且POST body要符合CWMP XML Schema。很多工具用固定模板硬套,遇到SP05固件就失败。而“RTX超级密码”是另一款设备(华为RTG系列)的默认密码,与HG8120C无关,强行尝试只会触发设备锁定。至于“强制解除华为账号激活锁”,那是手机业务,和光猫固件完全隔离。我们选择纯手工HTTP请求+Telnet组合,是因为它:① 不依赖任何第三方工具,所有命令Windows CMD、macOS Terminal、Linux Bash都能执行;② 每一步都有明确响应码(HTTP 200/404/500)和返回体,失败时能精准定位是网络不通、密码错误还是固件版本不匹配;③ 全程不写入Flash,所有操作都在内存中完成,断电即恢复原状,零风险。
3. 实操细节解析:从连接光猫到拿到root密码的每一步
3.1 前置准备:物理连接与基础环境确认
首先,确保你的电脑和HG8120C在同一局域网。HG8120C默认管理IP是192.168.100.1,子网掩码255.255.255.0。如果你的电脑IP是192.168.1.100,那需要先手动改成192.168.100.x段(比如192.168.100.10),网关填192.168.100.1。不要试图用DHCP自动获取——有些固件版本会禁用DHCP Server,导致电脑根本拿不到地址。用网线直连光猫的LAN口(不是光纤口!),打开浏览器访问http://192.168.100.1,能正常显示登录页,说明物理层通了。此时用默认账号admin和密码(一般是admin或贴在光猫背面的字符串)登录,进入普通管理界面。这一步不是为了操作,而是确认设备在线且Web服务正常。> 提示:如果打不开网页,先检查网线是否插紧,再ping192.168.100.1。如果ping不通,可能是光猫重启中,等待2分钟再试;如果持续超时,拔掉光纤跳线,长按Reset键15秒复位,等指示灯全绿后再试。
3.2 第一步:用curl或浏览器开发者工具触发Telnet开启
现在打开浏览器开发者工具(F12),切换到Network标签页,勾选“Preserve log”。在地址栏输入http://192.168.100.1回车,观察Network面板里出现的第一个请求,通常是GET /。右键它,选择“Copy as cURL”。你会得到类似这样的命令:
curl 'http://192.168.100.1/' -H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'把它粘贴到CMD/Terminal里执行,应该返回HTML源码。现在,我们要构造一个特殊的POST请求,目标是/cgi-bin/webcm。这个接口是Web UI提交表单的统一入口,但它也接受一些调试参数。关键Payload是:
var:menu=setup var:page=telnet var:command=telnet_enable其中var:command=telnet_enable是固件里预留的调试命令。执行命令:
curl "http://192.168.100.1/cgi-bin/webcm" -X POST -d "var:menu=setup" -d "var:page=telnet" -d "var:command=telnet_enable" --cookie "sessionid=1234567890abcdef"注意--cookie参数里的sessionid需要从你登录后的浏览器Cookie里复制。在开发者工具Application → Cookies里找到sessionid的值,替换进去。如果返回<response><result>success</result></response>,说明Telnet服务已启动。验证方法:在CMD里执行telnet 192.168.100.1 23。如果出现黑屏光标闪烁,就是成功了;如果提示“连接被拒绝”,说明telnetd没起来,检查固件版本是否低于SP03(旧版需用另一套指令)。
3.3 第二步:用Telnet登录并提取密码文件
Telnet连接成功后,第一行会显示HG8120C login:。这里不要输admin,直接输root,密码留空回车。多数HG8120C的root密码为空,这是华为为方便现场调试设置的默认策略。如果提示Login incorrect,说明该设备启用了root密码保护,此时需用telecomadmin账号登录(密码通常是nE7jA%5m,这是电信定制版的通用密码)。登录后,你会看到BusyBox的Shell提示符#。执行:
cat /var/config/user.cfg | grep super_user_pwd如果返回super_user_pwd=Kx9fL2mN,恭喜,这就是你要的超级密码。但更保险的做法是导出整个文件:
cat /var/config/user.cfg > /tmp/user.cfg然后用FTP或TFTP把/tmp/user.cfg拉出来(HG8120C自带TFTP Server,监听69端口)。在电脑上开TFTP客户端(Windows可用tftp -i 192.168.100.1 GET user.cfg),就能拿到明文密码文件。> 注意:/var/config/是内存文件系统(tmpfs),重启后内容丢失,所以必须在Telnet会话中立即操作。
3.4 第三步:用超级密码登录Web UI高级设置
拿到super_user_pwd后,退出Telnet,重新打开浏览器访问http://192.168.100.1。这次不要用admin登录,而是用telecomadmin(或root)作为用户名,输入刚获取的明文密码。登录后,你会发现左上角菜单栏多出“高级设置”选项。点击进入,就能看到之前灰掉的“网络设置”→“宽带设置”→“连接模式”,这里可以选择“桥接”并填写PPPoE账号密码。保存后,光猫会重启,LAN口不再分配IP,变成纯粹的ONT设备。此时你的主路由器就可以接管拨号,实现真正的双路由组网。
3.5 关键参数计算与版本适配:SP03 vs SP05固件的差异处理
HG8120C的固件版本决定了HTTP接口的行为。SP03(2019年前)固件中,/cgi-bin/webcm的telnet_enable命令有效;SP05(2020年后)固件则移除了该命令,改用TR-069协议。此时需构造SOAP请求:
<?xml version="1.0"?> <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <cwmp:SetParameterValues> <ParameterList soap:arrayType="cwmp:ParameterValueStruct[1]"> <ParameterValueStruct> <Name>Device.ManagementServer.EnableCWMP</Name> <Value xsi:type="xsd:boolean">false</Value> </ParameterValueStruct> </ParameterList> <ParameterKey>12345</ParameterKey> </cwmp:SetParameterValues> </soap:Body> </soap:Envelope>用curl发送:
curl "http://192.168.100.1/cwmp" -X POST -H "Content-Type: text/xml" -H "SOAPAction: \"urn:dslforum-org:cwmp-1-0#SetParameterValues\"" -d @soap_request.xml其中soap_request.xml是你保存上述XML的文件。SP05固件返回<cwmp:Fault>表示失败,<cwmp:Response>表示成功。实测下来,SP05的成功率比SP03低约30%,因为部分局点ACS服务器会拦截非法CWMP请求。这时可尝试“降级法”:先用admin账号登录Web UI,进入“系统维护”→“软件升级”,上传一个SP03的官方固件包(从华为企业官网下载),等待升级完成后再执行Telnet开启步骤。
4. 完整实操流程:从零开始的逐行命令记录与现场反馈
4.1 环境初始化与网络连通性验证
我的测试环境是Windows 10 + HG8120C(固件版本V3R019C10SP05,序列号HWTCxxxxxx)。第一步,将电脑网卡IPv4设置为:
- IP地址:
192.168.100.10 - 子网掩码:
255.255.255.0 - 默认网关:
192.168.100.1
打开CMD,执行:
ping -n 4 192.168.100.1返回:
正在 Ping 192.168.100.1 具有 32 字节的数据: 来自 192.168.100.1 的回复: 字节=32 时间=2ms TTL=64 来自 192.168.100.1 的回复: 字节=32 时间=1ms TTL=64 来自 192.168.100.1 的回复: 字节=32 时间=2ms TTL=64 来自 192.168.100.1 的回复: 字节=32 时间=1ms TTL=64四次全部成功,说明物理链路正常。接着用浏览器访问http://192.168.100.1,输入admin/admin登录,进入管理界面。此时打开开发者工具Network面板,刷新页面,找到GET /请求,右键Copy as cURL,得到基础命令。这一步耗时约2分钟,是后续所有操作的前提。
4.2 Telnet服务开启:SP05固件下的SOAP请求实战
由于我的设备是SP05,直接POSTtelnet_enable会返回<response><result>fail</result></response>。于是新建文本文件soap_request.xml,内容为上节所述的SOAP XML。执行:
curl "http://192.168.100.1/cwmp" -X POST -H "Content-Type: text/xml" -H "SOAPAction: \"urn:dslforum-org:cwmp-1-0#SetParameterValues\"" -d @soap_request.xml返回体很长,关键部分是:
<cwmp:Response> <cwmp:Status>0</cwmp:Status> <cwmp:StartTime>2021-12-12T14:22:33Z</cwmp:StartTime> <cwmp:EndTime>2021-12-12T14:22:34Z</cwmp:EndTime> </cwmp:Response><cwmp:Status>0</cwmp:Status>表示成功。等待30秒,执行:
telnet 192.168.100.1 23屏幕立刻出现:
Trying 192.168.100.1... Connected to 192.168.100.1. Escape character is '^]'. HG8120C login:连接成功!这一步耗时约5分钟,包括写XML、调试Header、等待服务启动。
4.3 密码提取:从内存文件系统读取user.cfg
在Telnet会话中,输入root回车(密码为空),进入Shell。执行:
ls -l /var/config/输出:
-rw-r--r-- 1 root root 1234 Dec 12 14:20 user.cfg -rw-r--r-- 1 root root 567 Dec 12 14:19 deviceinfo.cfg确认user.cfg存在且可读。执行:
cat /var/config/user.cfg | grep super_user_pwd返回:
super_user_pwd=Qw3rTy7u为防万一,再执行:
cat /var/config/user.cfg > /tmp/user.cfg然后在CMD新开窗口,执行:
tftp -i 192.168.100.1 GET user.cfg当前目录下立即生成user.cfg文件,用记事本打开,确认内容一致。这一步耗时约3分钟,是整个流程中最稳定的部分。
4.4 Web UI高级设置启用与桥接配置
退出Telnet(Ctrl+],然后输入quit)。重新打开浏览器,访问http://192.168.100.1,用telecomadmin作为用户名,Qw3rTy7u作为密码登录。页面顶部出现“高级设置”按钮。点击后,左侧菜单展开,依次点击:
- 网络设置 → 宽带设置 → 连接列表 → 编辑第一个连接(通常是INTERNET_R_101)
- 将“连接模式”从“路由”改为“桥接”
- “VLAN ID”填入你ISP提供的值(电信一般是41,联通是101)
- “802.1P优先级”保持默认0
- 点击“保存”
页面提示“配置已保存,设备将在30秒后重启”。等待光猫所有指示灯熄灭再亮起,约2分钟。重启后,用手机连光猫Wi-Fi,发现无法上网(因为光猫已不拨号),此时用主路由器WAN口接光猫LAN口,路由器PPPoE拨号成功,网速恢复正常。至此,整个流程闭环完成,耗时总计约25分钟。
5. 常见问题与排查技巧实录:那些没写在教程里的坑
5.1 Telnet连接被拒绝的七种可能及对应解法
| 现象 | 可能原因 | 排查命令 | 解决方案 |
|---|---|---|---|
telnet: Unable to connect to remote host: Connection refused | telnetd进程未启动 | `ps | grep telnetd` |
telnet: Unable to connect to remote host: Connection timed out | 防火墙拦截 | netsh advfirewall show allprofiles | Windows防火墙临时关闭,或添加入站规则放行23端口 |
| 连接后黑屏无响应 | Shell未加载 | echo $SHELL | 执行/bin/sh手动启动,或改用busybox sh |
Login incorrect(root空密码失败) | root密码被重置 | cat /var/passwd | grep root | 用telecomadmin账号登录,或从/var/config/user.cfg读取super_user_pwd |
| Telnet登录后立即断开 | telnetd配置错误 | cat /etc/init.d/S50telnetd | 检查启动脚本中-l /bin/sh参数是否缺失 |
Connection closed by foreign host | 设备内存不足 | free | 重启光猫释放内存,或避免同时运行多个Telnet会话 |
能Telnet但cat /var/config/user.cfgPermission denied | 文件权限异常 | ls -l /var/config/user.cfg | 用chmod 644 /var/config/user.cfg修复权限 |
提示:HG8120C的内存只有64MB,同时开Telnet+Web UI+TR-069会导致OOM。建议操作前关闭所有浏览器标签页,Telnet登录后尽快执行
cat命令。
5.2 固件版本识别与降级实操避坑指南
判断固件版本最准的方法是登录Web UI后,在“系统状态”→“设备信息”里查看“软件版本”。但有时该页面被隐藏,此时可用HTTP请求:
curl "http://192.168.100.1/cgi-bin/webcm?var:menu=status&var:page=devinfo" --cookie "sessionid=xxx"返回HTML中搜索Firmware Version。SP03固件特征是V3R019C10SP03,SP05是V3R019C10SP05。降级时务必注意:华为官网下载的SP03固件包是.bin格式,但HG8120C要求.img后缀。需用十六进制编辑器(如HxD)打开.bin文件,将开头0x48 0x47 0x38 0x31 0x32 0x30 0x43(即"HG8120C" ASCII码)替换为0x48 0x47 0x38 0x31 0x32 0x30 0x43 0x5f 0x53 0x50 0x30 0x33(即"HG8120C_SP03"),再改后缀为.img。否则升级会失败并变砖。实测发现,降级后首次启动会慢(约5分钟),期间不要断电。
5.3 密码获取失败的终极方案:物理串口调试(仅限高手)
当所有网络方法失效,且你有焊接技能时,可考虑UART调试。HG8120C主板上有4个未标注的焊盘(J1),间距2.54mm,从左到右依次是GND、TX、RX、3.3V。用CH340T USB转TTL模块,GND接GND,TX接模块RX,RX接模块TX(注意交叉),3.3V悬空(避免烧毁)。波特率设为115200,打开串口助手,上电瞬间狂按Ctrl+C,可中断uboot,进入命令行。执行:
printenv查看bootargs参数,找到console=ttyS0,115200,确认串口配置。然后执行:
sf probe sf read 0x80000000 0x100000 0x100000将Flash第1MB区域读入内存,再用md.b 0x80000000 0x100查看,搜索super_user_pwd字符串。此法成功率近100%,但风险极高:焊错线会烧毁芯片,uboot命令输错可能导致无法启动。我只在报废设备上验证过,不推荐普通用户尝试。
5.4 安全与合规提醒:为什么这不是“破解”,而是合理权限获取
最后必须强调:HG8120C是用户购买或租用的终端设备,你对其拥有完全的物理控制权。运营商通过TR-069下发的配置,属于服务协议范畴,而非法律意义上的所有权限制。《电信条例》明确规定,用户有权知悉所用设备的技术参数和配置方式。我们所做的,是利用设备固件公开的、未被禁用的调试接口,恢复其本应具备的管理能力。这不同于攻击他人设备、窃取数据或绕过付费墙。实际操作中,我从未遇到因开启Telnet被运营商封号的情况——因为所有操作都在本地局域网完成,不产生任何外网流量。如果你的光猫是自购非电信定制版,这个过程更是天经地义。记住:技术本身无善恶,关键在于使用目的。把光猫调成桥接,是为了让家里的NAS跑得更快;拿到root权限,是为了给IPTV盒子配组播代理——这些,都是对家庭网络主权的正当行使。
我在实际操作中发现,HG8120C的/var/config/目录下还藏着pppoe_user.cfg和wifi_key.cfg,里面存着你的宽带账号和Wi-Fi密码。很多人说“怕被偷看”,其实只要光猫不连外网,这些文件比银行APP的本地缓存还安全。真正该警惕的,是那些打着“光猫神器”旗号、要求你下载APK或EXE的第三方工具——它们才可能偷偷上传你的设备信息。坚持用curl、telnet、cat这些操作系统自带的命令,才是最干净、最透明的路。