
TUIベースのActive Directoryデータコレクター。LDAPオブジェクトを取り込み、リモートRPC/SMB/HTTP収集を実行し、攻撃パス分析用のBloodHound CE互換ダンプを生成します。
Active Directory収集のためのTUI
このプロジェクトの主な目標は以下のとおりです。
Flashingestorは、他のコレクターが指定されたメソッドを単一のステップで実行するのとは対照的に、LDAP Ingestion、Remote Collection、Conversionの3つの基本的な個別ステップを実装しています。
Ingest (Ctrl+l) - LDAPから生のオブジェクト属性データを収集し、output/ldap以下の中間msgpackファイルに保存します。クエリはconfig.yamlでカスタマイズできます。
Remote (Ctrl+r) - これらの中間ファイルをメモリに読み込み、収集するコンピュータのリストを計算し、一連のRPC/SMB/HTTPリクエストを実行してComputerおよびEnterpriseCAオブジェクトの関連するリモート情報を取得し、output/remoteに保存します。
Convert (Ctrl+s) - 中間ファイルをメモリに読み込み、取り込みステップとリモート収集ステップの情報をマージし、output/bloodhound以下のBloodHound互換のダンプを生成します。このステップは完全にオフラインで実行されます。
詳細な技術情報や洞察については、📖 Wikiをご確認ください。
$ git clone https://github.com/Macmod/flashingestor
$ cd flashingestor
# To build only:
$ go build ./cmd/flashingestor
# To install the executable to $GOBIN or $GOPATH/bin:
$ go install ./cmd/flashingestor
[!NOTE] 提供されているReleasesからプリビルドバイナリを使用することもできます。
まず以下のいずれかで認証してください:
# Anonymous
# [Requires dSHeuristics of 0000002 in the DirectoryServices object
# and can have limited visibility due to lack of Read ACEs]
$ ./flashingestor -u '@<DOMAIN>' -p '' [...]
# User + Password
$ ./flashingestor -u <USER>@<DOMAIN> -p <PASSWORD> [-k] [...]
# User + NTHash
$ ./flashingestor -u <USER>@<DOMAIN> -H <NTHASH> [-k] [...]
# User + PFX
$ ./flashingestor -u <USER>@<DOMAIN> --pfx <PFXPATH> [--pfx-password <PFXPASS>] [-k] [...]
# User + PEM
$ ./flashingestor -u <USER>@<DOMAIN> --cert <PEMPATH> --key <KEYPATH> [-k] [...]
# User + AESKey
$ ./flashingestor -u <USER>@<DOMAIN> --aes-key <AESKEY> -k [...]
# User + Ticket
$ ./flashingestor -u <USER>@<DOMAIN> --ccache /path/to/ticket.ccache -k [...]
or
$ KRB5CCNAME=/path/to/ticket.ccache ./flashingestor -u <USER>@<DOMAIN> -k [...]
その後、希望に応じてステップを実行します。LDAPのみの収集(GPOLocalGroupとCertServicesを除くDCOnly)の場合は、Ctrl+lを実行して取り込みが成功したか確認し、次にCtrl+sを実行して最終ダンプを生成します。
flashingestorを実行する際は--dcと--dnsを指定することをお勧めします。--dcを指定しない場合、flashingestorはSRV/Aルックアップでそれを見つけようとし、最初のIngestステップが遅延する可能性があります。
標準のDNSサーバーがドメインを認識しない場合は、--dnsを指定する必要があります。AD統合DNSを使用している場合は、それをホストしているDCを--dnsに指定するだけです。さらに、--dcに関係なく、Remote Collectionステップを実行したいがDNSサーバーがドメイン内のコンピュータを認識しない場合は、ルックアップのために--dnsを指定する必要があります。
[!TIP] 複数のDCがある環境では、
dcprobeユーティリティを使用してすべてのDCへのレイテンシをベンチマークし、取り込みに適したターゲット候補を見つけることもできます:$ go build ./cmd/dcprobe $ ./dcprobe --dns 192.168.88.6 -d creta.local -r 10
設定ファイルがカレントディレクトリにconfig.yamlとして存在しない場合、または--configで指定されたパスに存在しない場合、デフォルトのオプション(提供されているconfig.yamlと同じ)が使用されます。これらはconfig/fallback.goにハードコードされています。詳細はConfiguration Fileをお読みください。
ログの出力ファイルを指定するには--logを、デバッグログメッセージを表示するには-vvを使用することを検討してください。これらは問題のトラブルシューティングに役立ちます。コマンドライン引数の完全なリファレンスはCommand-Line Argumentsをお読みください。
[!NOTE] 提供されている
config.yamlのデフォルトクエリは、BloodHound変換に必要な情報を考慮して設計されています。config.yamlでクエリや属性をカスタマイズすることもできますが、必要な属性を削除したり、検索フィルターの意味を変更したりしないようにすることをお勧めします。
recurse_trustsがtrueに設定されている場合、取り込みに提供された初期資格情報を使用して、再帰的に見つかった信頼されたドメインをすべて取り込みます。
search_forestがtrueに設定されている場合、初期ドメインと同じフォレストの一部であるドメインをConfigurationパーティションから取り込みます。これはデフォルトの取り込み計画の一部であるため、追加のクエリは発行されません。両方のオプションを同時に設定でき、flashingestorは見つかったドメインを(信頼経由または現在のフォレスト経由のいずれかで)一度だけ取り込みます。
recurse_trustsが有効で、recurse_feasible_onlyもtrueに設定されている場合、信頼が次の条件を満たす場合のみ、信頼されたドメインの取り込みを試みます:
つまり、送信専用の信頼はトラバースされず、最初のレベルの信頼を除いて、取り込みパスは非推移的信任で停止します。BがAを非推移的に信頼している場合、AはまだBに対して認証できますが、CもBを非推移的に信頼している場合、AはCに対して認証できません。
[!IMPORTANT]
recurse_trusts/search_forestは、提供された資格情報がプレーンパスワードまたはNTハッシュである場合にのみ、ソースドメインから指定された資格情報を使用して検出されたドメインのLDAPに対して認証します。この目的でTGTを使用して紹介チケットを発行することは理論的には可能ですが、adauthライブラリではまだ実装されていません。
Macmod/ldapxのミドルウェアチェーンをflashingestorで直接使用して、-f(--ldapx-filter)、-a(--ldapx-attrs)、-b(--ldapx-basedn)オプションを使用して取り込みステップのLDAPクエリを難読化することもできます。-vvを使用すると、難読化前後の生のクエリもログに表示されます。
リモート収集ステップを実行する場合は、有効になっているmethodsを確認してください。これらはおおよそSharpHoundが提供するメソッドに対応しており、RPCまたはHTTPを介して特定の収集を切り替えるために使用できます。
--remote-*引数を使用して、リモート収集用に別の資格情報セットを指定できます。指定しない場合、flashingestorは標準の取り込み引数(--user、--passwordなど)で提供されたユーザーの同じ資格情報を使用しようとします。
例えば--remote-user Administrator@.を指定することで、ローカル管理者をリモート収集に使用することもできますが、このアプローチの有効性は、アカウントが組み込み管理者であるかどうか、およびFilterAdministratorToken / LocalAccountTokenFilterPolicyレジストリキーの値に依存します。この動作の詳細については、Pass-the-Hash Is Dead: Long Live LocalAccountTokenFilterPolicyを参照してください。
compress_outputおよびcleanup_after_compressionオプションは、ディスク使用量を小さく保つのに役立ちます。BloodHoundで最終ダンプをロードした後、必要なければoutput/ldapおよびoutput/remote以下のファイルを手動で安全に削除できますが、これらのファイルは、完全な収集を再実行しなくても重要な情報を調べるために保持しておくことができます。
[!TIP]
output/ldapおよびoutput/remoteフォルダ内のmsgpackファイルの主な目的は、プロセス全体の責任を分離するための中間形式として機能することですが、これらのファイルをJSONに変換することで情報源としても使用できます。これにより、生のオブジェクト属性やリモート収集結果を調べる必要がなくなります:$ go build ./cmd/ingest2json $ ./ingest2json output/ldap/YOURDOMAIN/SelectedFile.msgpack -o output.json
イシューを開くかプルリクエストを送信することで貢献を歓迎します。
SpecterOpsのBloodHound、SharpHound / SharpHoundCommon、およびdirkjanmのBloodHound.pyに多大なる感謝を捧げます。これらが本ツールの主要な参考資料となりました。
rtpt-erikgeiser および RedTeamPentesting による adauth、そして p0dalirius による winacl に感謝します。どちらも非常に便利なライブラリです。