Skip to content

Lab 3.2: BloodHound

オンライン演習

接続性:この演習を実行するには、クラス内ネットワーク(560A VPN経由)に接続している必要があります。VPNプロファイルが利用できない場合、bloodhound-pythonrusthoundからの既存のデータが /home/sec560/labs/bloodhound-data にあり、ステップ1と2でライブデータを収集する代わりに使用できます。

目的

  • bloodhound-pythonrusthoundを使用して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.exebloodhound-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内でアップロードウィンドウを開く

次に、bloodhound-pythonrusthoundによって生成された.jsonファイルと.zipファイルをそれぞれ選択します。Openをクリックしてファイルをアップロードします。

アップロードするJSONファイルとZIPファイルを選択

アップロードが処理され、ステータスウィンドウが表示されます。処理が完了したら、*Upload Progress*ウィンドウを閉じます。

6: BloodHoundでのパスファインディング

BloodHoundにデータが読み込まれたので、興味深いパスを見つけるためにデータの分析を開始できます。この場合、最も強力なパスを最初に探します:Domain UsersからDomain Adminsへのパスです。このパスが存在する場合、侵害されたユーザーは誰でもDomain Adminに権限を昇格できることを意味します。控えめに言っても、これは重大な発見です。

BloodHound UIの左上部分にあるパスファインディングアイコンをクリックします:

BloodHound内でパスファインディングを開く

「Start Node」フィールドにDomain Usersと入力します。BloodHoundが自動的にDOMAIN USERS@HIBOXY.COMに名前を補完することに注意してください。*Tab*キーを押すか、自動補完された名前をクリックして選択します。

BloodHoundの自動補完

次に、「Target Node」フィールドにDomain Adminsと入力し、DOMAIN ADMINS@HIBOXY.COMに自動補完します。BloodHoundは、開始ノードからターゲットノードへのパスを即座に検索します。

この場合、以下に示すように、BloodHoundは**NO DATA RETURNED FROM QUERY**メッセージを介して、そのようなパスが見つからなかったことを警告します。

Domain UsersからDomain Adminsへのパスが見つからない

これは珍しいことではありません。ただし、パスが*見つかった*場合は重大な発見であるため、最初のチェックとして適しています。

7: ビルトインクエリ:すべてのDomain Adminsを見つける

次に、BloodHound内のビルトインクエリのいくつかを見てみましょう。BloodHound UIの左上隅にあるハンバーガーアイコン(3本の水平線)をクリックします:

BloodHound内でハンバーガーメニューを開く

次に、Analysisタブをクリックし、Find all Domain Adminsクエリをクリックします。BloodHoundは、Domain Adminsグループのすべてのメンバーと、Domain Adminsグループオブジェクト自体を即座に表示します。マウスホイールでズームイン/アウトし、クリックしてドラッグしてグラフを移動し、ノードをクリックして詳細情報を表示できます。また、Ctrlキーを押すと、すべてのノードラベル、一部のラベル(サイズに基づく「デフォルトノード閾値」)、またはラベルなしの表示を切り替えることができます。

SVC_SQLSERVICE2@HIBOXY.COMユーザーアイコンをクリックします。これにより、BloodHound UIの左側のNode Infoタブにこのユーザーアカウントの詳細情報が表示されます。

SVC_SQLSERVICE2のノード情報

ノード情報ウィンドウを下にスクロールします。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アイコンをクリックします:

Domain Adminsグループを選択

これで、BloodHoundはKerberoast可能なユーザー(SVC_SQLSERVICE2)からDomain Adminsグループへのパスを表示します。この場合、SVC_SQLSERVICE2はすでにDomain Adminsグループのメンバーであるため、直接パスです。

言い換えれば、SVC_SQLSERVICE2のKerberoast可能なパスワードハッシュを解読できれば、そのアカウントとしてログインし、Domain Adminに権限を昇格させることができます。

Kerberoast可能なユーザーからDomain Adminsへのパス

まとめ

この演習では、bloodhound-pythonrusthoundを使用してBloodHoundデータを収集し、データをBloodHoundに読み込み、BloodHoundデータを分析する(ビルトインクエリとパスファインディングを含む)方法を実演しました。これらの技術は、Active Directory環境内の潜在的な攻撃パスを理解し、効果的な防御戦略を策定する上で重要です。