
FortinetHunter (@YogSoth0) バイナリクラッキングアプリケーション。FortinetHunter の CTF の一部。ELF door: ストリップされた Nuitka onefile、XOR でスクランブルされた Argon2id 検証器、AES-GCM 整合性。

「Fortinet Hunter 2026」のNuitkaパスワードゲートを再キーイングするTUI。@YoSoth0によるキャプチャ・ザ・フラッグチャレンジの一部。 Write-up: Hunting the Fortinet Hunter 0-day
このELFはホスト上では決して実行されない。GateXはonefileペイロードを静的に展開し、スクランブルされたArgon2idハッシュとAES-GCMバナーをXORアンマスクし、FH_PASS=gatexが両方のチェックを満たすようにこれらのブロブを書き換え、その後ロックダウンされたDockerケージ内で内部バイナリをexecする。
これは作者の元のパスフレーズを復元するものではない。Argon2id(m=65536,t=3,p=4)はその役割を果たしている。プラグインはすでに内部ELFにコンパイルされており、パスワードはバナーをアンラップするだけである。
abraxas
7350FH.zip(同梱されていない)ペイロードは信頼できないCTFマルウェア型のコードである。GateXは以下の条件下でのみこれをexecする:
--platform linux/amd64--network none--read-only + 展開用のtmpfs--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
チャレンジzip(または内部ELF)をGateXから見える場所に配置する:
mkdir -p files
cp /path/to/7350FH.zip files/7350FH.zip
TUI:
.venv/bin/python -m gatex --target files/7350FH.zip
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
ヘッドレス:
# 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
オプションの--session nameは状態を~/.gatex/sessions/(モード0600)に保持する。
| Command | What it does |
|---|---|
/help | コマンド一覧 |
/probe | 静的展開 + Argon2idハッシュの組み立て(execなし) |
/bypass [password] | ゲートブロブを再キーイング(デフォルトgatex)し、ケージ内でexec |
/cmd [args…] | パッチ済みELFに渡されるargv(list、--help、--version、…) |
/sandbox /sandbox up /sandbox down | Dockerの状態 / ビルド / 破棄 |
/target <zip|elf> | バイナリの切り替え |
/session name | 再利用可能なセッションの切り替え |
/timeout <seconds> | ケージexecのタイムアウト |
/quit | 保存して終了 |
F1 = ヘルプ。
KAY + zstd)。内部イメージは7350FH.bin。BYTES定数c + fh-slim-hardened-v2の前に位置する。utf-8(xor(b64decode(ct), cycle(b64decode(key))))。3つのフラグメントが実際のPHCを組み立てる。バイナリ内の平文Argon2文字列はargon2-cffiのdoctestデコイである — 無視すること。fh-slim-v2-salt-2026 / fh-slim-v2-core)→ 79バイトのバナーのAES-256-GCM。その後cli.main()。エクスプロイトは暗号文の中にはない。/bypassは既知のパスワードの新しいPHCを書き込み、AAD b"fh-slim-hardened-v2"(バイト値であり、ディスク上のcfh-…ニードルではない)の下で置換バナーを暗号化し、パッチ済みの内部を/opt/fh/7350FH.binとしてLD_LIBRARY_PATH=$ORIGIN付きで実行する。元の内部 + FH_PASS=gatexは依然として[!] access deniedを出力する。それがこの実験である。
再キーイングされた内部に対するライブdocker exec、linux/amd64、net none、caps dropped、uid 65532。2026-08-26に取得。




完全なトランスクリプト:files/evidence/*.txtおよびfiles/hunter-cli/。
.venv/bin/pip install pytest
.venv/bin/python -m pytest tests/test_offline.py -q
files/7350FH.zipを必要とするパッチ/展開テストは、zipが存在しない場合はスキップされる。
作者が許可したCTFのために書かれた。所有していないシステムに対してこれを向けてはならない。GateXはエクスプロイトも7350FHのコピーも同梱していない。