
FortinetHunter (@YogSoth0) applicazione di binary cracking. Parte della CTF per FortinetHunter. ELF door: un Nuitka onefile stripped, un verificatore Argon2id con scrambling XOR, integrità AES-GCM.

TUI che ri-genera le chiavi del gate password Nuitka "Fortinet Hunter 2026". Parte di una capture-the-flag challenge di @YoSoth0) Write-up: Hunting the Fortinet Hunter 0-day
L'ELF non viene mai eseguito sull'host. GateX decomprime staticamente il payload onefile, de-maschera con XOR l'hash Argon2id offuscato e il banner AES-GCM, riscrive quei blob in modo che FH_PASS=gatex soddisfi entrambi i controlli, quindi esegue il binario interno all'interno di una gabbia Docker blindata.
Questo non recupera la passphrase originale dell'autore. Argon2id (m=65536,t=3,p=4) sta facendo il suo lavoro. I plugin erano già compilati nell'ELF interno; la password sblocca solo un banner.
abraxas
7350FH.zip (non incluso)Il payload è codice CTF non attendibile a forma di malware. GateX lo execa solo sotto:
--platform linux/amd64--network none--read-only + tmpfs per l'unpack--cap-drop ALL --security-opt no-new-privileges:true65532, 2 GiB RAM, 1 CPU, 256 pidsgit clone [email protected]:abraxas/GateX.git
cd GateX
python3 -m venv .venv
.venv/bin/pip install -r requirements.txt
Metti lo zip della challenge (o l'ELF interno) dove GateX può vederlo:
mkdir -p files
cp /path/to/7350FH.zip files/7350FH.zip
TUI:
.venv/bin/python -m gatex --target files/7350FH.zip
Dentro la TUI:
/probe # static zstd unpack + assemble the Argon2id hash (no exec)
/sandbox up # start Docker, build gatex-cage:noble
/bypass # re-key to FH_PASS=gatex and exec list in the cage
/cmd --help # argv against the patched inner ELF
/cmd --version
/cmd score --ml
Headless:
# unpack + print the assembled argon2id hash (no TUI, no exec)
.venv/bin/python -m gatex --target files/7350FH.zip --probe
# re-key + exec list in the cage
.venv/bin/python -m gatex --target files/7350FH.zip --bypass
L'opzionale --session name mantiene lo stato sotto ~/.gatex/sessions/ (mode 0600).
| Comando | Cosa fa |
|---|---|
/help | Lista dei comandi |
/probe | Unpack statico + assembla l'hash Argon2id (nessun exec) |
/bypass [password] | Ri-genera le chiavi dei blob del gate (default gatex) ed esegue nella gabbia |
/cmd [args…] | argv passati all'ELF patchato (list, --help, --version, …) |
/sandbox /sandbox up /sandbox down | Stato Docker / build / destroy |
/target <zip|elf> | Cambia binario |
/session name | Cambia sessione riutilizzabile |
/timeout <seconds> | Timeout exec nella gabbia |
/quit | Salva ed esci |
F1 = help.
KAY + zstd). L'immagine interna è 7350FH.bin.BYTES c + fh-slim-hardened-v2.utf-8(xor(b64decode(ct), cycle(b64decode(key)))). Tre frammenti assemblano il PHC reale. Una stringa Argon2 in chiaro nel binario è il decoy del doctest di argon2-cffi — ignorala.fh-slim-v2-salt-2026 / fh-slim-v2-core) → AES-256-GCM di un banner da 79 byte. Poi cli.main(). Gli exploit non sono nel ciphertext./bypass scrive un nuovo PHC di una password che conosci, cifra un banner sostitutivo sotto AAD b"fh-slim-hardened-v2" (il valore in byte, non l'ago su disco cfh-…), ed esegue l'interno patchato come /opt/fh/7350FH.bin con LD_LIBRARY_PATH=$ORIGIN.L'interno originale + FH_PASS=gatex stampa ancora [!] access denied. Questo è l'esperimento.
docker exec dal vivo contro l'interno ri-generato, linux/amd64, net none, caps rimosse, uid 65532. Catturato il 2026-08-26.




Trascrizioni complete: files/evidence/*.txt e files/hunter-cli/.
.venv/bin/pip install pytest
.venv/bin/python -m pytest tests/test_offline.py -q
I test di patch/unpack che richiedono files/7350FH.zip vengono saltati se lo zip è assente.
Scritto per una CTF che l'autore ha permesso. Non puntare questo contro sistemi che non possiedi. GateX non include exploit né copie di 7350FH.