#!/usr/bin/env python3 """Inspect login dst / DNS related to 'unknown host' after ticket login.""" import re import sys from pathlib import Path sys.path.insert(0, str(Path(__file__).resolve().parent)) RSC = r""" :put "===PROF===" /ip hotspot profile print detail where name=hs-otantik or name=hsprof1 :put "===DNS-STATIC===" /ip dns static print where comment~"otantik" or name~"status" or name~"otantik" or name~"hotspot" :put "===DNS===" /ip dns print :put "===HS-SERVER===" /ip hotspot print detail """ def peek_login(sftp, path: str) -> None: try: with sftp.file(path, "r") as f: data = f.read(120000) if isinstance(data, bytes): data = data.decode("utf-8", "replace") print("===FILE", path, "bytes", len(data), "===") for pat in [ r'name="dst"[^>]*>', r"name='dst'[^>]*>", r"doLogin\([\s\S]{0,400}\)", r"link-login-only|link-status|chap-id", r"unknown host|status\.html", ]: for m in re.finditer(pat, data, re.I): s = m.group(0).replace("\n", " ")[:220] print("MATCH:", s) # show all dst occurrences for m in re.finditer(r".{0,40}dst.{0,60}", data, re.I): print("CTX:", m.group(0).replace("\n", " ")[:140]) except Exception as e: print("ERR", path, type(e).__name__, e) def hub() -> None: from mk_hub_exec import run, HOST, USER, PASSWORD import paramiko print(run(RSC, timeout=50)) c = paramiko.SSHClient() c.set_missing_host_key_policy(paramiko.AutoAddPolicy()) c.connect(HOST, username=USER, password=PASSWORD, timeout=15, allow_agent=False, look_for_keys=False) sftp = c.open_sftp() peek_login(sftp, "hotspot/login.html") peek_login(sftp, "hotspot/alogin.html") c.close() def nko() -> None: from mk_rb4011_exec import run, JUMP, MK import paramiko print(run(RSC, timeout=50)) jump = paramiko.SSHClient() jump.set_missing_host_key_policy(paramiko.AutoAddPolicy()) jump.connect(JUMP[0], username=JUMP[1], password=JUMP[2], timeout=25, allow_agent=False, look_for_keys=False) chan = jump.get_transport().open_channel("direct-tcpip", (MK[0], 22), ("127.0.0.1", 0)) mk = paramiko.SSHClient() mk.set_missing_host_key_policy(paramiko.AutoAddPolicy()) mk.connect(MK[0], username=MK[1], password=MK[2], sock=chan, timeout=25, allow_agent=False, look_for_keys=False) sftp = mk.open_sftp() peek_login(sftp, "hotspot/login.html") peek_login(sftp, "hotspot/alogin.html") mk.close() jump.close() if __name__ == "__main__": (nko if (sys.argv[1:] == ["nko"]) else hub)()