BloodHoundを使用したWindows Active Directory環境の分析


# はじめに
本稿では、「**BloodHound**」を使用した、Windows Active Directory環境の分析について検証します。

BloodHound ([https://github.com/BloodHoundAD/BloodHound](https://github.com/BloodHoundAD/BloodHound)) とは、グラフ理論にもとづき、Active Directory環境の意図せぬ関係性を明らかにするためのツールです。
これにより、低特権ユーザーを`Domain Admins`へ権限昇格するなど、他のユーザーやグループへ移行するためのパスを発見することができます。

# BloodHoundのインストール
ここでは、`Kali Linux 2020.1`に対して`BloodHound Version: 3.0.2`のインストールを行います。

パッケージ管理コマンド`apt`を使ってBloodHoundのインストールを行うことが可能です。コマンド構文は、`apt-get install bloodhound`です。
事前に、`apt-get update`と`apt-get dist-upgrade`コマンドを実行し、システムを最新の状態にしておく必要があります。

```
ali@kali:~$ sudo apt-get install bloodhound
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following additional packages will be installed:
  neo4j
The following NEW packages will be installed:
  bloodhound neo4j
0 upgraded, 2 newly installed, 0 to remove and 501 not upgraded.
Need to get 154 MB of archives.
After this operation, 350 MB of additional disk space will be used.
Do you want to continue? [Y/n] Y
Get:1 http://ftp.jaist.ac.jp/pub/Linux/kali kali-rolling/main amd64 neo4j all 3.5.3-0kali1 [98.1 MB]
Get:2 http://linux3.yz.yamagata-u.ac.jp/pub/linux/kali kali-rolling/main amd64 bloodhound amd64 3.0.2-0kali1 [55.5 MB]
Fetched 154 MB in 18s (8,640 kB/s)                                                            
Selecting previously unselected package neo4j.
(Reading database ... 255564 files and directories currently installed.)
Preparing to unpack .../neo4j_3.5.3-0kali1_all.deb ...
Unpacking neo4j (3.5.3-0kali1) ...
Selecting previously unselected package bloodhound.
Preparing to unpack .../bloodhound_3.0.2-0kali1_amd64.deb ...
Unpacking bloodhound (3.0.2-0kali1) ...
Setting up neo4j (3.5.3-0kali1) ...
Setting up bloodhound (3.0.2-0kali1) ...
Processing triggers for kali-menu (2020.1.7) ...
```

# BloodHoundの設定
BloodHoundはNeo4j（[https://neo4j.com/](https://neo4j.com/)）に依存しています。Neo4jとは、グラフデータベース管理システムです。
`apt-get install bloodhound`コマンド構文にて、`BloodHound Version: 3.0.2`とともに、`neo4j 3.5.3`がインストールされています。
`apt`コマンドによるインストールが完了したら、Neo4jの設定を行います。はじめに、`sudo neo4j console`コマンド構文にて、Neo4jを起動します。

```
kali@kali:~$ sudo neo4j console
Active database: graph.db
Directories in use:
  home:         /usr/share/neo4j
  config:       /usr/share/neo4j/conf
  logs:         /usr/share/neo4j/logs
  plugins:      /usr/share/neo4j/plugins
  import:       /usr/share/neo4j/import
  data:         /usr/share/neo4j/data
  certificates: /usr/share/neo4j/certificates
  run:          /usr/share/neo4j/run
Starting Neo4j.
WARNING: Max 1024 open files allowed, minimum of 40000 recommended. See the Neo4j manual.
2020-02-29 12:39:25.465+0000 INFO  ======== Neo4j 3.5.3 ========
2020-02-29 12:39:25.538+0000 INFO  Starting...
2020-02-29 12:39:34.831+0000 INFO  Bolt enabled on 127.0.0.1:7687.
2020-02-29 12:39:40.123+0000 INFO  Started.
2020-02-29 12:39:44.086+0000 INFO  Remote interface available at http://localhost:7474/
```

次に、ブラウザにて http://localhost:7474/ へアクセスします。初期設定のパスワード（**neo4j / neo4j**）を入力すると、パスワードの変更を求めるプロンプトが表示されます。指示に従って、新しいパスワードの入力を行います。
ここで入力したアカウントはBloodHoundにログインするためにも使用します。

<img width="858" alt="スクリーンショット 2020-02-29 21.46.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/678cb2bf-9fbd-a524-3ad2-04e2cf28cf4c.png">

ここでは、次の設定値を使用します。

- Database URL： **bolt：//localhost：7687**
- DB Username： **neo4j**
- DB Password： **blood**

# Bloodhoundの起動
ターミナルから、`bloodhound`コマンドを実行し、起動します（バックグラウンドで開いたままにする必要があります）。

```
kali@kali:~$ bloodhound
```

<img width="858" alt="スクリーンショット 2020-02-29 21.48.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/35801150-fd9f-c40b-3b54-e31eef85ddb8.png">

好みのユーザーインターフェイスに切り替えるため、メニュー右側にある`Settings`（歯車のアイコン）をクリックします。
ここでは、`Dark Mode`のチェックボックスをONにしています。

<img width="799" alt="スクリーンショット 2020-03-01 6.20.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/b8b61489-2a9c-da9f-03b5-8fe4ad6ec030.png">

# BloodHoundの動作確認
BloodHoundの動作確認をするために、ランダムなテストデータを作成する`DBCreator.py`スクリプトが提供されています（[https://github.com/BloodHoundAD/BloodHound-Tools/tree/master/DBCreator](https://github.com/BloodHoundAD/BloodHound-Tools/tree/master/DBCreator)）。

次のコマンド構文にて、リポジトリの複製を行います。

```
kali@kali:~$ git clone https://github.com/BloodHoundAD/BloodHound-Tools
Cloning into 'BloodHound-Tools'...
remote: Enumerating objects: 1, done.
remote: Counting objects: 100% (1/1), done.
remote: Total 111 (delta 0), reused 0 (delta 0), pack-reused 110
Receiving objects: 100% (111/111), 1.59 MiB | 552.00 KiB/s, done.
Resolving deltas: 100% (46/46), done.
```

`pip`コマンドにて、`neo4j-driver`をインストールします。

```
$ sudo apt install python-pip
$ pip -V
pip 18.1 from /usr/lib/python2.7/dist-packages/pip (python 2.7)

$ pip install neo4j-driver
Collecting neo4j-driver
  Downloading https://files.pythonhosted.org/packages/0e/96/bc81664d87975948713f7e4d3d4c3a21a3a6a813d03a161637573a587817/neo4j-driver-1.7.6.tar.gz
Collecting neobolt~=1.7.15 (from neo4j-driver)
  Downloading https://files.pythonhosted.org/packages/0d/b2/eb7c33e1f02cd7bbaf4c237619dd8dc43fa6081f331c2d35b28deb78e259/neobolt-1.7.16.tar.gz (183kB)
    100% |████████████████████████████████| 184kB 1.2MB/s 
Collecting neotime~=1.7.1 (from neo4j-driver)
.
.
.
Successfully built neo4j-driver neobolt neotime
Installing collected packages: neobolt, pytz, neotime, neo4j-driver
Successfully installed neo4j-driver-1.7.6 neobolt-1.7.16 neotime-1.7.4 pytz-2019.3
```

`DBCreator.py`スクリプトは`python2`で記述されています。このため、明示的に`python2`を指定して、実行します。

```
kali@kali:~$ cd BloodHound-Tools/
kali@kali:~/BloodHound-Tools$ ls
bloodhoundanalytics.pbix  bloodhoundanalytics.py  DBCreator  LICENSE  README.md
kali@kali:~/BloodHound-Tools$ cd DBCreator/
kali@kali:~/BloodHound-Tools/DBCreator$ python2 DBCreator.py
================================================================
BloodHound Sample Database Creator
================================================================

Documented commands (type help <topic>):
========================================
clear_and_generate  connect   exit      help       setnodes
cleardb             dbconfig  generate  setdomain

(Cmd)
```

`DBCreator.py`スクリプトのユーザーインターフェイスに従って、`dbconfig`コマンドを実行します。`neo4j`の資格情報を入力します。

```
(Cmd) dbconfig
Current Settings:
DB Url: bolt://localhost:7687
DB Username: neo4j
DB Password: neo4jj

Enter DB URL [bolt://localhost:7687] 
Enter DB Username [neo4j] 
Enter DB Password [neo4jj] blood

New Settings:
DB Url: bolt://localhost:7687
DB Username: neo4j
DB Password: blood

Testing DB Connection
Database Connection Successful!
```

`DBCreator.py`スクリプトのユーザーインターフェイスに従って、`generate`コマンドを実行します。テストデータの生成を行います。

```
(Cmd) generate
Starting data generation with nodes=500
Populating Standard Nodes
Adding Standard Edges
Generating Computer Nodes
Creating Domain Controllers
Generating User Nodes
Generating Group Nodes
Adding Domain Admins to Local Admins of Computers
Creating 25 Domain Admins (5% of users capped at 30)
Applying random group nesting
Adding users to groups
Calculated 7 groups per user with a variance of - 6
Adding local admin rights
Adding RDP/ExecuteDCOM/AllowedToDelegateTo
Adding sessions
Adding Domain Admin ACEs
Creating OUs
Creating GPOs
Adding outbound ACLs to 3 objects
Marking some users as Kerberoastable
Adding unconstrained delegation to a few computers
Database Generation Finished!
```

テストデータ作成後、`Bloodhound`にログオンすると、BloodHoundは「Domain Admins」という名前のグループを描画し、そのグループに属する有効なユーザーを表示します。

左隅の`[Database Info]`タブでは、登録されたデータの統計情報を確認することができます。
<img width="434" alt="スクリーンショット 2020-03-05 0.58.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/5ca1de2e-d7f3-9cb3-6299-6508fd6a29cf.png">
`[Database Info]`タブにて確認できる情報は次のとおりです。

- **Users** – Active Directoryから抽出されたネットワーク上のユーザー
- **Computers** – ネットワーク、サーバー、ワークステーション、その他のデバイス上のさまざまなエンドポイント
- **Groups** - Active Directoryから抽出されたさまざまなADグループ
- **Sessions** - Ingestorsが抽出したネットワーク上のコンピューター上のユーザーセッションの量
- **ACL** – アクセス制御リスト、ユーザーとグループが相互に持つさまざまな権限とアクセス
- **Relationships** - グループメンバーシップ、ユーザー、ユーザーセッション、その他の関連情報など

左隅の`[Queries]`タブでは、事前に用意されたいくつかの分析クエリによる表示を確認することができます。
<img width="434" alt="スクリーンショット 2020-03-05 1.05.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/201ed4d6-7b24-b67c-b98a-8f9e7e478bb1.png">

`[Queries] > [Pre-Built Analytics Queries] > [Shortest Paths to High Value Targets]`クエリを選択した場合の画面。
<img width="1440" alt="スクリーンショット 2020-03-02 23.31.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/e336d080-4b56-e2ea-7f69-ca791becc96c.png">

# Ingestors によるデータ収集
ここまで、BloodHoundとneo4jのインストールと設定が完了しました。ここからは、実際にBloodHoundを使ってターゲットネットワークのデータを分析します。

ターゲットシステムまたはドメインで「**Ingestors**」を使用します。Ingestorsは、ドメインコントローラーとActive Directoryを照会し、すべての信頼関係、グループポリシー設定、およびアクティブディレクトリオブジェクトの取得を行います。

BloodHound gitリポジトリ （[https://github.com/BloodHoundAD/BloodHound/tree/master/Ingestors](https://github.com/BloodHoundAD/BloodHound/tree/master/Ingestors)）には、2つの異なるIngestorsが公開されています。

- `SharpHound.exe`：C#で記述されたプログラム
- `Invoke-BloodHound`：リフレクションによってC#バイナリをロードするPowerShellスクリプト

Ingestorsを実行する際、収集範囲（`CollectionMethod`）オプションを詳細に設定しなければ意図する情報を収集できない可能性もあります。オプションスイッチは次のとおりです。

- **Group**: グループメンバシップ情報を収集
- **LocalGroup**: コンピュータのローカル管理者情報を収集
- **Session**: コンピュータのセッション情報を収集
- **SessionLoop**: 終了されるまでセッション情報を継続的に収集
- **Trusts**: ドメインの信頼関係のデータを収集
- **ACL**: ACL（Access Control List）データを収集
- **ComputerOnly**: ローカル管理者とセッションデータを収集
- **GPOLocalGroup**: GPO（Group Policy Object）を使ってローカル管理者情報を収集
- **LoggedOn**: 管理者特権を使用し、セッション情報を収集
- **ObjectProps**: ユーザとコンピュータのノードプロパティ情報を収集
- **Default**: グループメンバシップ、ローカル管理者、セッション、ドメインの信頼関係のデータを収集

## SharpHound
BloodHoundのIngestorsである、`SharpHound.exe`プログラムを使いデータ収集を行います。
ここでは、[https://github.com/BloodHoundAD/BloodHound/tree/master/Ingestors](https://github.com/BloodHoundAD/BloodHound/tree/master/Ingestors)から`c:\Tools`へ`SharpHound.exe`がダウンロードしてあります。

`SharpHound.exe`を使い、Active Directoryよりデータ収集を行います。まず、`powershell`を立ち上げます。その上で、`SharpHound.exe`を実行します。
収集したデータはZIP形式にて圧縮され（`20200306061240_BloodHound.zip`）、`SharpHound.exe`を実行したフォルダに生成されています。

```
PS C:\Tools> .\SharpHound.exe -c all -d active.htb --domaincontroller 10.10.10.100
----------------------------------------------
Initializing SharpHound at 6:12 AM on 3/6/2020
----------------------------------------------

Resolved Collection Methods: Group, Sessions, LoggedOn, Trusts, ACL, ObjectProps, LocalGroups, SPNTargets, Container

[+] Creating Schema map for domain ACTIVE.HTB using path CN=Schema,CN=Configuration,DC=ACTIVE,DC=HTB
[+] Cache File not Found: 0 Objects in cache

[+] Pre-populating Domain Controller SIDS
Status: 0 objects finished (+0) -- Using 19 MB RAM
Enumeration finished in 00:02:52.3983535
Compressing data to .\20200306061240_BloodHound.zip
You can upload this file directly to the UI

SharpHound Enumeration Completed at 6:16 AM on 3/6/2020! Happy Graphing!
```

## SharpHound.ps1
BloodHoundのIngestorsである、`SharpHound.ps1`モジュールを使いデータ収集を行います。
ここでは、[https://github.com/BloodHoundAD/BloodHound/tree/master/Ingestors](https://github.com/BloodHoundAD/BloodHound/tree/master/Ingestors)から`c:\Tools`へ`SharpHound.ps1`がダウンロードしてあります。
まず、`powershell`を立ち上げます。`SharpHound.ps1`モジュールをインポートします。 インポートとは、`powershell`セッションでそのモジュール(`SharpHound.ps1`)にアクセスできるように、モジュールをアクティブメモリに読み込むプロセスです。

```
PS C:\Tools> Import-module ./SharpHound.ps1
```

次のコマンド構文にて、データ収集を行います。

```
PS C:\Tools> Invoke-BloodHound -CollectionMethod ACL,ObjectProps,Default -CompressData -RemoveCSV -NoSaveCache
```

# BloodHoundにおけるデータの読み込み
収集したデータ（`YYYYMMDDHHMMSS_BloodHound.zip`）をBloodHoundで読み込みます。
BloodHoundのGUI画面より、右側メニューの`[Upload Data]`を選択し、生成されたZIPファイルを読み込みます。なお、BloodHoundのGUI画面にZIPファイルをドラッグ＆ドロップすることでも、データの読み込みは可能です。
<img width="170" alt="スクリーンショット 2020-03-06 22.15.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/77b5e0cd-c991-8f8d-5ae6-78fcb50cba06.png">

# BloodHoundデータを使用するユーティリティ
- CypherDog, https://github.com/SadProcessor/CypherDog
- GoFetch, https://github.com/GoFetchAD/GoFetch
- ANGRYPUPPY, https://github.com/vysecurity/ANGRYPUPPY
- gt-generator, https://github.com/audrummer15/gt-generator

# BloodHoundを学べるTryHackMeのRoom
[TryHackMe](https://tryhackme.com/)において、BloodHoundの使用方法を学ぶことのできるルームです。

- [Post-Exploitation Basics](https://tryhackme.com/room/postexploit)

# BloodHoundを使った攻略が有効なHack The Box Machines
[Hack The Box](https://www.hackthebox.eu/)において、BloodHoundを使った攻略が有効とされているMachineのリストは次のとおりです。

|Name|IP Address|Difficulty|日本語解説（Walkthrough）|
|:---|:---|:---|:---|
|[Active](https://www.hackthebox.eu/home/machines/profile/148)|10.10.10.100|Easy|[あり](https://qiita.com/v_avenger/items/48db7d54791c4d10663b)|
|[Forest](https://www.hackthebox.eu/home/machines/profile/212)|10.10.10.161|Easy|[あり](https://qiita.com/v_avenger/items/43014e5e34fe491764c8)|
|[Reel](https://www.hackthebox.eu/home/machines/profile/143)|10.10.10.77|Hard| - |
|[Sizzle](https://www.hackthebox.eu/home/machines/profile/169)|10.10.10.103|Insane| - |
|[Blackfield](https://www.hackthebox.eu/home/machines/profile/255)|10.10.10.192|Hard| - |

# 参考情報
- BSides Las Vegas「[Six Degrees of Domain Admin - Using Bloodhound to Automate Active Directory Domain Privilege Escalation Analysis --Andy Robbins, Will Schroeder, Rohan Vazarkar](https://www.youtube.com/watch?v=lxd2rerVsLo)」（YouTube動画）
- chryzsh 「[awesome-bloodhound](https://github.com/chryzsh/awesome-bloodhound)」
- riccardoancarani.it 「[BloodHound Tips and Tricks](https://www.riccardoancarani.it/bloodhound-tips-and-tricks/)」, 2019/08/11
- CprJesus 「[BloodHound: Intro to Cypher](https://blog.cptjesus.com/posts/introtocypher)」, 2017/02/19
- Hackndo 「[BloodHound](https://en.hackndo.com/bloodhound/)」, 2019/07/30
- Red Teaming Experiments 「[BloodHound with Kali Linux: 101](https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/abusing-active-directory-with-bloodhound-on-kali-linux)」
- TripleSec 「[BloodHound 101](https://www.triplesec.info/slides/f1f6d1f41b9e32f8673702c87d95ff87.pdf), PDF文書」
- SYSTEMADMINSPRO 「[DOMAIN INFORMATION COLLECTION TOOLS](https://systemadminspro.com/domain-information-collection-tools/)」, 2019/04/10