
FortinetHunter (@YogSoth0) aplicação de cracking de binários. Parte do CTF para FortinetHunter. ELF door: um Nuitka onefile stripped, um verificador Argon2id com XOR embaralhado, integridade AES-GCM.

TUI que re-chaveia o gate de senha Nuitka do "Fortinet Hunter 2026". Parte de um desafio capture-the-flag de @YoSoth0) Write-up: Hunting the Fortinet Hunter 0-day
O ELF nunca é executado no host. O GateX desempacota estaticamente o payload onefile, desmascara via XOR o hash Argon2id embaralhado e o banner AES-GCM, reescreve esses blobs para que FH_PASS=gatex satisfaça ambas as verificações, e então executa o binário interno dentro de uma jaula Docker restrita.
Isto não recupera a passphrase original do autor. O Argon2id (m=65536,t=3,p=4) está a fazer o seu trabalho. Os plugins já estavam compilados no ELF interno; a senha apenas desembrulha um banner.
abraxas
7350FH.zip (não incluído)O payload é código não confiável com forma de malware de CTF. O GateX apenas o executa sob:
--platform linux/amd64--network none--read-only + tmpfs para desempacotamento--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
Coloca o zip do desafio (ou o ELF interno) onde o GateX o possa ver:
mkdir -p files
cp /path/to/7350FH.zip files/7350FH.zip
TUI:
.venv/bin/python -m gatex --target files/7350FH.zip
Dentro da 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
O opcional --session name mantém o estado em ~/.gatex/sessions/ (modo 0600).
| Comando | O que faz |
|---|---|
/help | Lista de comandos |
/probe | Desempacotamento estático + montagem do hash Argon2id (sem exec) |
/bypass [password] | Re-chaveia os blobs do gate (padrão gatex) e executa na jaula |
/cmd [args…] | argv passado ao ELF remendado (list, --help, --version, …) |
/sandbox /sandbox up /sandbox down | Estado do Docker / construir / destruir |
/target <zip|elf> | Trocar de binário |
/session name | Trocar de sessão reutilizável |
/timeout <seconds> | Timeout de execução na jaula |
/quit | Guardar e sair |
F1 = ajuda.
KAY + zstd). A imagem interna é 7350FH.bin.BYTES c + fh-slim-hardened-v2.utf-8(xor(b64decode(ct), cycle(b64decode(key)))). Três fragmentos montam o PHC real. Uma string Argon2 em texto simples no binário é o decoy do doctest do argon2-cffi — ignora-a.fh-slim-v2-salt-2026 / fh-slim-v2-core) → AES-256-GCM de um banner de 79 bytes. Depois cli.main(). Os exploits não estão no ciphertext./bypass escreve um novo PHC de uma senha que conheces, encripta um banner de substituição sob AAD b"fh-slim-hardened-v2" (o valor em bytes, não a agulha cfh-… em disco), e executa o interno remendado como /opt/fh/7350FH.bin com LD_LIBRARY_PATH=$ORIGIN.O interno original + FH_PASS=gatex ainda imprime [!] access denied. Essa é a experiência.
docker exec ao vivo contra o interno re-chaveado, linux/amd64, net none, caps removidas, uid 65532. Capturado em 2026-08-26.




Transcrições completas: files/evidence/*.txt e files/hunter-cli/.
.venv/bin/pip install pytest
.venv/bin/python -m pytest tests/test_offline.py -q
Os testes de patch/unpack que precisam de files/7350FH.zip são ignorados se o zip estiver ausente.
Escrito para um CTF que o autor permitiu. Não apontes isto a sistemas que não possuis. O GateX não inclui exploits nem uma cópia de 7350FH.