Lab 3.2: BloodHound
オンライン演習
接続性:この演習を実行するには、クラス内ネットワーク(560A VPN経由)に接続している必要があります。VPNプロファイルが利用できない場合、bloodhound-python
とrusthound
からの既存のデータが /home/sec560/labs/bloodhound-data にあり、ステップ1と2でライブデータを収集する代わりに使用できます。
目的
bloodhound-python
とrusthound
を使用してBloodHoundデータを収集する- 収集したデータをBloodHoundに読み込む
- データを分析してKerberoast可能なユーザーからDomain Adminsへのパスを見つける
演習手順動画
演習のセットアップ
使用するVM:
- Linux
Linux VMから10.130.10.5にpingできることを確認してください:
コマンド
ping -c 4 10.130.10.5
想定される結果
sec560@560vm:~$ ping -c 4 10.130.10.5
PING 10.130.10.5 (10.130.10.5) 56(84) bytes of data.
64 bytes from 10.130.10.5: icmp_seq=1 ttl=127 time=159 ms
64 bytes from 10.130.10.5: icmp_seq=2 ttl=127 time=112 ms
64 bytes from 10.130.10.5: icmp_seq=3 ttl=127 time=189 ms
64 bytes from 10.130.10.5: icmp_seq=4 ttl=127 time=169 ms
--- 10.130.10.5 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3000ms
rtt min/avg/max/mdev = 112.306/157.392/189.090/28.165 ms
演習 – ステップバイステップの手順
1: bloodhound-pythonを使用してBloodHoundデータを収集する
BloodHound分析の一般的なワークフローは次のとおりです:
1. ターゲット環境内で、ドメインコントローラーやその他のドメイン参加システムへのネットワーク接続を持つ状態で、公式のSharpHound.exe
、bloodhound-python
、またはrusthound
などのインジェスターを使用してBloodHoundデータを収集します。
2. 抽出された情報(インジェスターとオプションに応じてJSONファイルまたはzipファイル)を、BloodHoundユーザーインターフェースがインストールされた外部システムに持ち出します。
3. 抽出された情報をBloodHoundユーザーインターフェースに読み込みます(ファイルをドラッグアンドドロップするか、Upload
ボタンを使用します)。
4. BloodHoundを使用して収集されたBloodHoundデータを分析し、侵害されたユーザーからDomain Adminsなどの高価値ターゲットへの有用な「パス」を見つけます。
5. ターゲット環境に戻り、BloodHoundから収集した情報を使用して、有用なアクセスを可能にする誤設定と機能のチェーンを悪用します(最初に侵害されたユーザーからDomain Adminsグループへのパスなど)。
BloodHoundデータを分析するのと同じシステムからBloodHoundデータを収集するため、データを持ち出す必要はありません。ただし、Neo4jデータベースを起動する必要があります:
コマンド
sudo systemctl start neo4j
Expected Results
このコマンドには出力がありません。
まず、bloodhound-python
を使用して、SEC560ライブラボ環境内からBloodHoundデータを収集します。これはSharpHoundのような、BloodHoundデータインジェスターの代替実装です。
まずコマンドの使用方法を確認しましょう。
コマンド
bloodhound-python
Expected Results
sec560@slingshot:~$ bloodhound-python
usage: bloodhound-python [-h] [-c COLLECTIONMETHOD] [-d DOMAIN] [-v]
[-u USERNAME] [-p PASSWORD] [-k] [--hashes HASHES]
[-no-pass] [-aesKey hex key]
[--auth-method {auto,ntlm,kerberos}] [-ns NAMESERVER]
[--dns-tcp] [--dns-timeout DNS_TIMEOUT] [-dc HOST]
[-gc HOST] [-w WORKERS] [--exclude-dcs]
[--disable-pooling] [--disable-autogc] [--zip]
[--computerfile COMPUTERFILE] [--cachefile CACHEFILE]
[--use-ldaps] [-op PREFIX_NAME]
Python based ingestor for BloodHound
For help or reporting issues, visit https://github.com/Fox-IT/BloodHound.py
optional arguments:
-h, --help show this help message and exit
-c COLLECTIONMETHOD, --collectionmethod COLLECTIONMETHOD
Which information to collect. Supported: Group,
LocalAdmin, Session, Trusts, Default (all previous),
DCOnly (no computer connections), DCOM, RDP,PSRemote,
LoggedOn, Container, ObjectProps, ACL, All (all except
LoggedOn). You can specify more than one by separating
them with a comma. (default: Default)
-d DOMAIN, --domain DOMAIN
[...additional output skipped...]
デフォルトではすべてのメソッドが使用されるわけではないことに注意してください。重要なことに、servicePrincipalName
属性(したがってKerberoast可能なユーザー)はデフォルトでは収集されません。この情報を収集するには、All
収集メソッドを指定します。そうしないと、特にBloodHoundユーザーインターフェースを介してこのデータを分析する際に、Kerberoast可能なユーザーを見つけることができなくなります。
ドメインコントローラーがDNSサーバーとして設定されていない場合があるため、bloodhound-python
では便利なことに、ネームサーバー(-ns
)をドメインコントローラーのIPアドレスに設定できます。これにより、DNS解決が正しく機能します。
コマンド
bloodhound-python -d hiboxy.com -u bgreen -p Password1 -c All -ns 10.130.10.4
Expected Results
sec560@slingshot:~$ bloodhound-python -d hiboxy.com -u bgreen -p Password1 -c All -ns 10.130.10.4
INFO: Found AD domain: hiboxy.com
INFO: Getting TGT for user
INFO: Connecting to LDAP server: dc01.hiboxy.com
INFO: Found 1 domains
INFO: Found 1 domains in the forest
INFO: Found 11 computers
INFO: Connecting to LDAP server: dc01.hiboxy.com
INFO: Found 573 users
INFO: Found 80 groups
INFO: Found 2 gpos
INFO: Found 10 ous
INFO: Found 20 containers
INFO: Found 0 trusts
INFO: Starting computer enumeration with 10 workers
INFO: Querying computer: sql02.hiboxy.com
INFO: Querying computer: file02.hiboxy.com
INFO: Querying computer: sql01.hiboxy.com
INFO: Querying computer: jump01.hiboxy.com
INFO: Querying computer: rdp01.hiboxy.com
INFO: Querying computer: file01.hiboxy.com
INFO: Querying computer: web01.hiboxy.com
INFO: Querying computer: mail01.hiboxy.com
INFO: Querying computer: ca01.hiboxy.com
INFO: Querying computer: web02.hiboxy.com
INFO: Querying computer: dc01.hiboxy.com
INFO: Done in 00M 35S
bloodhound-python
が完了すると、カレントディレクトリに一連のJSONファイルが作成されます。これらのファイルには、ユーザー、グループ、コンピューター、ユーザーのログオンセッションなど、BloodHoundが取り込むデータが含まれています。
コマンド
ls -l *.json
Expected Results
sec560@slingshot:~$ ls -l *.json
-rw-rw-r-- 1 sec560 sec560 32144 Aug 9 09:49 20240809094825_computers.json
-rw-rw-r-- 1 sec560 sec560 28630 Aug 9 09:48 20240809094825_containers.json
-rw-rw-r-- 1 sec560 sec560 3895 Aug 9 09:48 20240809094825_domains.json
-rw-rw-r-- 1 sec560 sec560 3950 Aug 9 09:48 20240809094825_gpos.json
-rw-rw-r-- 1 sec560 sec560 187627 Aug 9 09:48 20240809094825_groups.json
-rw-rw-r-- 1 sec560 sec560 63467 Aug 9 09:48 20240809094825_ous.json
-rw-rw-r-- 1 sec560 sec560 1444067 Aug 9 09:48 20240809094825_users.json
bloodhound-python
は、Linux環境からBloodHoundデータを収集するための優れたツールです。インストールが簡単(python3 -m pip install bloodhound-python
)で、必要に応じてproxychains
経由でプロキシできます。
ただし、いくつかの欠点があります:
- Windows版(
SharpHound.exe
)ほど機能が完全ではありません。SpecterOpsチームによって新しい機能(新しいオブジェクトタイプやリレーションシップなど)がまずWindows版に追加されるためです - 組み込み環境で動作させることが困難です。Python自体のインストールが難しい場合があります(ベンダーのアプライアンス、リソースの少ないマシンなど)
- パフォーマンスの最適化がWindows版ほどではないため、少し遅くなります
これらの問題に対処するために、RustHoundを使用できます。これはBloodHoundデータコレクターのRustベースの実装です。これは、組み込みシステムを含むほぼすべてのプラットフォームとオペレーティングシステムで実行できる単一のバイナリであり、通常、Windows版のSharpHound実行可能ファイルよりも高速です。
2: RustHoundを使用してBloodHoundデータを収集する
次に、rusthound
を使用して同じBloodHoundデータを収集します。BloodHoundへのアップロードを容易にするために、出力ファイルをzip化する-z
オプションも含めます。bloodhound-python
も同じ機能を持ち、同じく-z
オプションを使用します。
コマンド
rusthound -d hiboxy.com -u bgreen@hiboxy.com -p Password1 -f DC01.hiboxy.com -z
Expected Results
sec560@slingshot:~$ rusthound -d hiboxy.com -u bgreen@hiboxy.com -p Password1 -f DC01.hiboxy.com -z
---------------------------------------------------
Initializing RustHound at 10:40:16 on 08/10/24
Powered by g0h4n from OpenCyber
---------------------------------------------------
[2024-08-10T10:40:16Z INFO rusthound] Verbosity level: Info
[2024-08-10T10:40:16Z INFO rusthound::ldap] Connected to HIBOXY.COM Active Directory!
[2024-08-10T10:40:16Z INFO rusthound::ldap] Starting data collection...
[2024-08-10T10:40:20Z INFO rusthound::ldap] All data collected for NamingContext DC=hiboxy,DC=com
[2024-08-10T10:40:20Z INFO rusthound::json::parser] Starting the LDAP objects parsing...
[2024-08-10T10:40:20Z INFO rusthound::json::parser::bh_41] MachineAccountQuota: 10
⠁ Parsing LDAP objects: 24% [2024-08-10T10:40:20Z INFO rusthound::json::parser::bh_41] ADCS found DC=com,DC=hiboxy,CN=hiboxy-CA01-CA, use --adcs args to collect the certificate templates and certificate authority.
[2024-08-10T10:40:20Z INFO rusthound::json::parser] Parsing LDAP objects finished!
[2024-08-10T10:40:20Z INFO rusthound::json::checker] Starting checker to replace some values...
[2024-08-10T10:40:20Z INFO rusthound::json::checker] Checking and replacing some values finished!
[2024-08-10T10:40:20Z INFO rusthound::json::maker] 573 users parsed!
[2024-08-10T10:40:20Z INFO rusthound::json::maker] 88 groups parsed!
[2024-08-10T10:40:20Z INFO rusthound::json::maker] 11 computers parsed!
[2024-08-10T10:40:20Z INFO rusthound::json::maker] 10 ous parsed!
[2024-08-10T10:40:20Z INFO rusthound::json::maker] 1 domains parsed!
[2024-08-10T10:40:20Z INFO rusthound::json::maker] 2 gpos parsed!
[2024-08-10T10:40:20Z INFO rusthound::json::maker] 23 containers parsed!
[2024-08-10T10:40:20Z INFO rusthound::json::maker] .//20240810104020_hiboxy-com_rusthound.zip created!
RustHound Enumeration Completed at 10:40:20 on 08/10/24! Happy Graphing!
このコマンドは、指定された資格情報を使用して、ドメインコントローラーDC01.hiboxy.com
から利用可能なすべての情報を収集します。他のBloodHoundインジェスターよりも大幅に高速で、必要に応じてproxychains
経由でプロキシすることもできます。
3: BloodHoundを起動する
ターゲット環境からデータを収集したら、それをローカルのBloodHoundデータベースに読み込む必要があります。まず、BloodHoundを起動します:
コマンド
/opt/BloodHound/BloodHound --no-sandbox
Expected Results
このコマンドはBloodHoundユーザーインターフェースを起動しますが、関連する出力はありません。
4: BloodHoundにログインする
BloodHoundログインプロンプトで、次の資格情報を入力してLogin
をクリックします:
- Username:
neo4j
-
Password:
sec560
BloodHound Password Change
BloodHound UIが「No database found」と表示した場合は、
sudo systemctl start neo4j
でneo4jサービスを起動してください。起動に数分かかる場合があります。
5: BloodHoundデータをアップロードする
次に、収集したBloodHoundデータをBloodHoundユーザーインターフェースにアップロードして、そこで分析できるようにします。BloodHoundインターフェースの右側にあるアップロードアイコンをクリックして、アップロードウィンドウを開きます:
次に、bloodhound-python
とrusthound
によって生成された.jsonファイルと.zipファイルをそれぞれ選択します。Open
をクリックしてファイルをアップロードします。
アップロードが処理され、ステータスウィンドウが表示されます。処理が完了したら、*Upload Progress*ウィンドウを閉じます。
6: BloodHoundでのパスファインディング
BloodHoundにデータが読み込まれたので、興味深いパスを見つけるためにデータの分析を開始できます。この場合、最も強力なパスを最初に探します:Domain UsersからDomain Adminsへのパスです。このパスが存在する場合、侵害されたユーザーは誰でもDomain Adminに権限を昇格できることを意味します。控えめに言っても、これは重大な発見です。
BloodHound UIの左上部分にあるパスファインディングアイコンをクリックします:
「Start Node」フィールドにDomain Users
と入力します。BloodHoundが自動的にDOMAIN USERS@HIBOXY.COM
に名前を補完することに注意してください。*Tab*キーを押すか、自動補完された名前をクリックして選択します。
次に、「Target Node」フィールドにDomain Admins
と入力し、DOMAIN ADMINS@HIBOXY.COM
に自動補完します。BloodHoundは、開始ノードからターゲットノードへのパスを即座に検索します。
この場合、以下に示すように、BloodHoundは**NO DATA RETURNED FROM QUERY**メッセージを介して、そのようなパスが見つからなかったことを警告します。
これは珍しいことではありません。ただし、パスが*見つかった*場合は重大な発見であるため、最初のチェックとして適しています。
7: ビルトインクエリ:すべてのDomain Adminsを見つける
次に、BloodHound内のビルトインクエリのいくつかを見てみましょう。BloodHound UIの左上隅にあるハンバーガーアイコン(3本の水平線)をクリックします:
次に、Analysis
タブをクリックし、Find all Domain Admins
クエリをクリックします。BloodHoundは、Domain Admins
グループのすべてのメンバーと、Domain Adminsグループオブジェクト自体を即座に表示します。マウスホイールでズームイン/アウトし、クリックしてドラッグしてグラフを移動し、ノードをクリックして詳細情報を表示できます。また、Ctrlキーを押すと、すべてのノードラベル、一部のラベル(サイズに基づく「デフォルトノード閾値」)、またはラベルなしの表示を切り替えることができます。
SVC_SQLSERVICE2@HIBOXY.COM
ユーザーアイコンをクリックします。これにより、BloodHound UIの左側のNode Info
タブにこのユーザーアカウントの詳細情報が表示されます。
ノード情報ウィンドウを下にスクロールします。SVC_SQLSERVICE2には複数のサービスプリンシパル名が登録されていることに注意してください。これは、このユーザーアカウントがKerberoast可能であり、どのドメインアカウントでもこのアカウントの解読可能なパスワードハッシュを効果的に取得できることを意味します。パスワードが解読できれば、SVC_SQLSERVICEはすでにDomain Adminsグループのメンバーであるため、攻撃者はこのアカウントとしてログオンし、Domain Adminに権限を昇格させることができます。
8: ビルトインクエリ:Kerberoast可能なユーザーからDomain Adminsへのパス
Domain Admin権限を持つKerberoast可能なアカウントを見つける別の方法を示しましょう。BloodHound UIのAnalysisタブに戻り、**Shortest Paths**セクションまでスクロールしてから、**Shortest Paths to Domain Admins from Kerberoastable Users**クエリを選択します。
BloodHoundは次に、どのDomain Adminsグループへのパスを見つけたいかを尋ねます。この場合、ドメインのデータは1つしかありませんが、複数のドメインがロードされている場合、それらはすべてここに表示されます。プロンプトでDOMAINS ADMINS@HIBOXY.COM
アイコンをクリックします:
これで、BloodHoundはKerberoast可能なユーザー(SVC_SQLSERVICE2)からDomain Adminsグループへのパスを表示します。この場合、SVC_SQLSERVICE2はすでにDomain Adminsグループのメンバーであるため、直接パスです。
言い換えれば、SVC_SQLSERVICE2のKerberoast可能なパスワードハッシュを解読できれば、そのアカウントとしてログインし、Domain Adminに権限を昇格させることができます。
まとめ
この演習では、bloodhound-python
とrusthound
を使用してBloodHoundデータを収集し、データをBloodHoundに読み込み、BloodHoundデータを分析する(ビルトインクエリとパスファインディングを含む)方法を実演しました。これらの技術は、Active Directory環境内の潜在的な攻撃パスを理解し、効果的な防御戦略を策定する上で重要です。