
FortinetHunter (@YogSoth0) aplicación de cracking de binarios. Parte del CTF para FortinetHunter. Puerta ELF: un Nuitka onefile stripped, un verificador Argon2id con XOR ofuscado, integridad AES-GCM.

TUI que re-clava el "Fortinet Hunter 2026" Nuitka password gate. Parte de un reto capture-the-flag de @YoSoth0) Write-up: Hunting the Fortinet Hunter 0-day
El ELF nunca se ejecuta en el host. GateX desempaqueta estáticamente el payload onefile, desenmascara con XOR el hash Argon2id y el banner AES-GCM ofuscados, reescribe esos blobs para que FH_PASS=gatex satisfaga ambas comprobaciones, y luego ejecuta el binario interno dentro de una jaula Docker bloqueada.
Esto no recupera la passphrase original del autor. Argon2id (m=65536,t=3,p=4) está haciendo su trabajo. Los plugins ya estaban compilados dentro del ELF interno; la contraseña solo desenvuelve un banner.
abraxas
7350FH.zip (no incluido)El payload es código no confiable con forma de malware de CTF. GateX solo lo exec-uta bajo:
--platform linux/amd64--network none--read-only + tmpfs para el desempaquetado--cap-drop ALL --security-opt no-new-privileges:true65532, 2 GiB de RAM, 1 CPU, 256 pidsgit clone [email protected]:abraxas/GateX.git
cd GateX
python3 -m venv .venv
.venv/bin/pip install -r requirements.txt
Coloca el zip del reto (o el ELF interno) donde GateX pueda verlo:
mkdir -p files
cp /path/to/7350FH.zip files/7350FH.zip
TUI:
.venv/bin/python -m gatex --target files/7350FH.zip
Dentro de 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
Sin interfaz:
# 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
El opcional --session name mantiene el estado bajo ~/.gatex/sessions/ (modo 0600).
| Comando | Qué hace |
|---|---|
/help | Lista de comandos |
/probe | Desempaquetado estático + ensamblado del hash Argon2id (sin exec) |
/bypass [password] | Re-clava los blobs del gate (por defecto gatex) y ejecuta en la jaula |
/cmd [args…] | argv pasado al ELF parcheado (list, --help, --version, …) |
/sandbox /sandbox up /sandbox down | Estado de Docker / construir / destruir |
/target <zip|elf> | Cambiar de binario |
/session name | Cambiar de sesión reutilizable |
/timeout <seconds> | Tiempo de espera de exec en la jaula |
/quit | Guardar y salir |
F1 = ayuda.
KAY + zstd). La imagen interna es 7350FH.bin.BYTES de Nuitka c + fh-slim-hardened-v2.utf-8(xor(b64decode(ct), cycle(b64decode(key)))). Tres fragmentos ensamblan el PHC real. Una cadena Argon2 en texto plano en el binario es el señuelo del doctest de argon2-cffi — ignórala.fh-slim-v2-salt-2026 / fh-slim-v2-core) → AES-256-GCM de un banner de 79 bytes. Luego cli.main(). Los exploits no están en el texto cifrado./bypass escribe un nuevo PHC de una contraseña que conoces, cifra un banner de reemplazo bajo el AAD b"fh-slim-hardened-v2" (el valor de bytes, no la aguja cfh-… en disco), y ejecuta el interno parcheado como /opt/fh/7350FH.bin con LD_LIBRARY_PATH=$ORIGIN.El interno original + FH_PASS=gatex sigue imprimiendo [!] access denied. Ese es el experimento.
docker exec en vivo contra el interno re-clavado, linux/amd64, net none, caps eliminadas, uid 65532. Capturado el 2026-08-26.




Transcripciones completas: files/evidence/*.txt y files/hunter-cli/.
.venv/bin/pip install pytest
.venv/bin/python -m pytest tests/test_offline.py -q
Las pruebas de patch/unpack que necesitan files/7350FH.zip se omiten si el zip no está presente.
Escrito para un CTF que el autor permitió. No apuntes esto a sistemas que no poseas. GateX no incluye exploits ni copia de 7350FH.