
FortinetHunter (@YogSoth0) Binary-Cracking-Anwendung. Teil des CTF für FortinetHunter. ELF-Tür: eine gestrippte Nuitka-Onefile, ein XOR-verschleierter Argon2id-Verifier, AES-GCM-Integrität.

TUI, die den "Fortinet Hunter 2026"-Nuitka-Passwort-Gate neu verschlüsselt (re-keying). Teil einer Capture-the-Flag-Challenge von @YoSoth0) Write-up: Hunting the Fortinet Hunter 0-day
Die ELF wird niemals auf dem Host ausgeführt. GateX entpackt statisch die Onefile-Payload, XOR-demaskiert den verschleierten Argon2id-Hash und das AES-GCM-Banner, schreibt diese Blobs neu, sodass FH_PASS=gatex beide Prüfungen erfüllt, und führt dann die innere Binärdatei in einem abgeschotteten Docker-Käfig aus.
Dies stellt nicht die ursprüngliche Passphrase des Autors wieder her. Argon2id (m=65536,t=3,p=4) tut seine Arbeit. Die Plugins waren bereits in die innere ELF kompiliert; das Passwort entpackt nur ein Banner.
abraxas
7350FH.zip (nicht mitgeliefert)Die Payload ist nicht vertrauenswürdiger, CTF-Malware-artiger Code. GateX führt sie nur exec-mäßig aus unter:
--platform linux/amd64--network none--read-only + tmpfs zum Entpacken--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
Lege die Challenge-Zip (oder die innere ELF) dort ab, wo GateX sie sehen kann:
mkdir -p files
cp /path/to/7350FH.zip files/7350FH.zip
TUI:
.venv/bin/python -m gatex --target files/7350FH.zip
Innerhalb der TUI:
/probe # statisches zstd-Entpacken + Assemblierung des Argon2id-Hashes (kein exec)
/sandbox up # Docker starten, gatex-cage:noble bauen
/bypass # auf FH_PASS=gatex umschlüsseln und list im Käfig ausführen
/cmd --help # argv gegen die gepatchte innere ELF
/cmd --version
/cmd score --ml
Headless:
# entpacken + den assemblierten argon2id-Hash ausgeben (keine TUI, kein exec)
.venv/bin/python -m gatex --target files/7350FH.zip --probe
# umschlüsseln + list im Käfig ausführen
.venv/bin/python -m gatex --target files/7350FH.zip --bypass
Optionales --session name speichert den Zustand unter ~/.gatex/sessions/ (Modus 0600).
| Befehl | Was er tut |
|---|---|
/help | Befehlsliste |
/probe | Statisches Entpacken + Assemblierung des Argon2id-Hashes (kein exec) |
/bypass [password] | Gate-Blobs neu verschlüsseln (Standard gatex) und im Käfig ausführen |
/cmd [args…] | argv, das an die gepatchte ELF übergeben wird (list, --help, --version, …) |
/sandbox /sandbox up /sandbox down | Docker-Status / bauen / zerstören |
/target <zip|elf> | Binärdatei wechseln |
/session name | Wiederverwendbare Session wechseln |
/timeout <seconds> | Timeout für Käfig-exec |
/quit | Speichern und verlassen |
F1 = Hilfe.
KAY + zstd). Das innere Image ist 7350FH.bin.BYTES-Konstante c + fh-slim-hardened-v2.utf-8(xor(b64decode(ct), cycle(b64decode(key)))). Drei Fragmente assemblieren den echten PHC. Ein Klartext-Argon2-String in der Binärdatei ist der argon2-cffi-Doctest-Köder — ignoriere ihn.fh-slim-v2-salt-2026 / fh-slim-v2-core) → AES-256-GCM eines 79-Byte-Banners. Dann cli.main(). Die Exploits sind nicht im Ciphertext./bypass schreibt einen neuen PHC eines Passworts, das du kennst, verschlüsselt ein Ersatz-Banner unter AAD b"fh-slim-hardened-v2" (der Bytes-Wert, nicht die auf der Festplatte liegende cfh-…-Nadel) und führt die gepatchte innere Datei als /opt/fh/7350FH.bin mit LD_LIBRARY_PATH=$ORIGIN aus.Die originale innere Datei + FH_PASS=gatex gibt weiterhin [!] access denied aus. Das ist das Experiment.
Live docker exec gegen die neu verschlüsselte innere Datei, linux/amd64, net none, Caps entfernt, uid 65532. Aufgezeichnet am 2026-08-26.




Vollständige Transkripte: files/evidence/*.txt und files/hunter-cli/.
.venv/bin/pip install pytest
.venv/bin/python -m pytest tests/test_offline.py -q
Patch-/Entpack-Tests, die files/7350FH.zip benötigen, werden übersprungen, wenn die Zip fehlt.
Geschrieben für ein CTF, das der Autor erlaubt hat. Richte dies nicht auf Systeme, die dir nicht gehören. GateX enthält keine Exploits und keine Kopie von 7350FH.