
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 に感謝します。どちらも非常に便利なライブラリです。
oiweiwei による go-msrpc に感謝します。彼のライブラリにより、RPCベースのリモート収集メソッドを実装することが可能になりました。
Protected Usersグループに属している場合や、セキュリティ設定でNTLM認証がブロックされている場合)または証明書(内部でPKINITを使用)を使用してリモート収集を実行する場合、リモート収集はユーザーが所属するドメインとは異なるドメインのコンピュータに対して認証を試みません。これはGPOLocalGroupメソッドにも適用され、そのような場合、取り込まれたデータに複数のドメインが含まれていても、他のドメインのDCからGPOファイルを読み取ろうとはしません。Computer型のSmbInfoはまだ基本的な実装です(レジストリチェックのみ)。HttpEnrollmentEndpointsは、提供されたユーザー名/パスワードでのみ動作します。AllowedToDelegateTo / ServicePrincipalNamesの解決はまだ基本的な実装です。SharpHoundで実装されているほぼすべてのプロパティがサポートされていますが、このツールとSharpHoundの間には多くのアーキテクチャ上の違いがあるため、出力が公式の実装と完全に一致することを期待しないでください(偶発的なバグを除く)。特に、RPCを介したリモート収集やCA/証明書の悪用に関連する収集など、より複雑な実装では、主要な違いが生じる可能性があります。
タイムアウトはまだほとんどが静的です。SharpHoundの実装はアダプティブタイムアウト(かなり賢い!)を使用していますが、まだそれを研究する時間がありませんでした。必要に応じて、--timeout、--computer-timeout、--method-timeoutオプションでタイムアウトをカスタマイズできます(config/config.goには他の操作固有のタイムアウトが指定されています)。
テストは現在実装されておらず、機能のごく一部のみを手動でテストしました。
MITライセンス (MIT)
Copyright (c) 2023 Artur Henrique Marzano Gonzaga
以下に定める条件に従い、本ソフトウェアおよび関連文書ファイル(以下「本ソフトウェア」)の複製を取得するすべての人に対し、無償で本ソフトウェアを扱う許可をここに付与します。これには、本ソフトウェアの使用、複製、改変、結合、公開、頒布、サブライセンス、および/または販売の権利、および本ソフトウェアを提供された者にこれを行うことを許可する権利を含みますが、これに限定されません。
上記の著作権表示およびこの許可通知は、本ソフトウェアのすべての複製または重要な部分に含まれるものとします。
本ソフトウェアは「現状のまま」提供され、明示的か黙示的かを問わず、商品性、特定目的への適合性、および非侵害の保証を含むがこれに限定されない、いかなる種類の保証もありません。いかなる場合においても、著作権者または権利者は、契約行為、不法行為、またはその他の行為にかかわらず、本ソフトウェアまたはその使用またはその他の取扱いに起因または関連して生じたいかなる請求、損害、その他の責任も負わないものとします。