デジタルペンテスト部でペネトレーションテストを担当している小松奈央です。
突然ですが皆さんはBloodHoundを使っていますか? BloodHoundとは、Active Directory(以下、ADとする)環境やMicrosoft Entra ID(旧称:Azure Active Directory)環境を対象としたペネトレーションテストにおいて、高い権限を効率的に侵害するために使用するペネトレーションテスターにはおなじみのツールです。
そんなBloodHoundが2023年8月にBloodHound Community Edition(以下、BloodHound CEとする)として新しく生まれ変わりました。
本記事では、従来のBloodHound(以下、BloodHound Legacyとする)とBloodHound CEの相違点や、BloodHound CEの使い方について現役ペネトレーションテスターの観点から解説します。
BloodHoundとは
BloodHoundは、SpectreOps社のAndy Robbins(@_wald0)氏、Rohan Vazarkar(@CptJesus)氏、Will Schroeder(@harmj0y)氏によって開発され、2016年のDEFCONにて発表、公開されたセキュリティツールです。
ADにおけるオブジェクト(ユーザアカウントやコンピュータアカウント、セキュリティグループなど)や、そのACL(Access Control List、オブジェクトに対するアクセスの許可および拒否設定)に関する情報を収集し、グラフ理論に基づいて可視化することが可能です。
これにより、AD環境における複雑なオブジェクト関係を可視化・整理することができ、効率的な侵入経路を判断することができます。 実際のペネトレーションテストにおいては、以下のようなシチュエーションでよく使用しています。
- 侵害済みのアカウントからさらに高い権限を持ったアカウントへ権限昇格可能な経路が存在しているか調査する
- ACLの設定不備によって悪用可能な脆弱性が存在しているか調査する
- テストシナリオのゴール(攻撃者視点での目標)を達成するための足がかり(マイルストーン)となるユーザやコンピュータを調査する
2021年には、機能の拡充や有償サポートが追加されたBloodHound Enterpriseがリリースされています。
BloodHound CE誕生の背景
BloodHound Enterpriseが開発される際、BloodHound Legacyのシンプルなアーキテクチャでは機能が不十分であるという問題がありました。 そのためBloodHound Enterpriseは既存のアーキテクチャを一新し、コードも一から書き直されています。
その結果、BloodHoundに新しい機能を追加するために、BloodHound LegacyとBloodHound Enterpriseの両方をメンテナンスするという状況が長い間続いていました。
そこでBloodHound Enterpriseをフォークする形で、BloodHound Enterpriseのコードをベースとした新しい無償版BloodHoundが開発されることになり、それがBloodHound CEとして2023年のBlack Hat USAにて発表されました。
BloodHound LegacyとBloodHound CEの相違点
2つの大きな違いとして、BloodHound Legacyはデスクトップアプリケーションとして提供されているのに対して、BloodHound CEはWebアプリケーションとして提供されています。
そのためインストール方法が大きく変わっており、BloodHound LegacyはJavaがインストールされている環境でNeo4jとBloodHound実行バイナリを起動するというスタンドアロンな方法で起動できましたが、BloodHound CEはサーバとして構築する必要があります。Dockerが用いられているためJavaやNeo4jのバージョンを意識する必要がなく、インストールそのものは簡単になったものの、ポータビリティは低下したかなという印象です。
一方でBloodHound CEはBloodHound Enterpriseをベースにしていることもあり、API経由によるデータの取り込みや、マルチユーザのサポートなどといったBloodHound Legacyでは使用できなかった機能を使用することができます。
細かな機能の違いについては、BloodHound公式ドキュメントの各製品における機能比較ページに記載があります。
アーキテクチャについては、BloodHound LegacyはデータベースにNeo4j、グラフの分析・可視化にLinkurious、コンパイルにElectronが使用されているのに対して、BloodHound CEはアプリケーションデータベースにPostgreSQL、グラフデータベースにNeo4j、グラフの分析にSigma.js、フロントエンドにReact、バックエンドにGoベースのREST APIを使用しています。 データを収集するためのコレクタは、BloodHound LegacyはC#とPowerShell Script、BloodHound CEはC#で書かれています。
これらアーキテクチャの変更により、グラフのレンダリング速度も大幅に改善しているようです。
また、BloodHound LegacyはGPL-3.0 licenseで公開されていましたが、BloodHound CEはApache-2.0 licenseに変更されています。
BloodHound CEの使い方
インストール方法
今回はUbuntu Server 22.04へインストールします。
$ uname -a Linux ubuntu 5.15.0-84-generic #93-Ubuntu SMP Tue Sep 5 17:16:10 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux $ cat /etc/issue Ubuntu 22.04.3 LTS \n \l
まずはDockerをインストールします。 以下のコマンドを実行後、グループの設定を反映するため一度ログアウトし、ログインし直します。
$ curl https://get.docker.com | sh $ sudo usermod -aG docker $USER $ sudo systemctl start docker $ sudo systemctl enable docker $ exit
DockerおよびDocker Composeが使用できることを確認します。
$ docker --version Docker version 24.0.6, build ed223bc $ docker compose version Docker Compose version v2.21.0
次にBloodHound CEのDocker Compose設定ファイルをダウンロードし、BloodHound CEをインストール、起動します。
このとき出力されるログの中に、BloodHound CEの初期パスワードが記載されています。 後ほど使用するためここでメモしておきます。
$ wget https://raw.githubusercontent.com/SpecterOps/bloodhound/main/examples/docker-compose/docker-compose.yml $ docker compose up bloodhoundce-bloodhound-1 | {"level":"info","time":"2023-10-03T09:08:19.575422058Z","message":"###################################################################"} bloodhoundce-bloodhound-1 | {"level":"info","time":"2023-10-03T09:08:19.575445382Z","message":"# #"} bloodhoundce-bloodhound-1 | {"level":"info","time":"2023-10-03T09:08:19.575446854Z","message":"# Initial Password Set To: dvyuABJCpcBpg6iVHgbCvO3rKKxPj5bg #"} bloodhoundce-bloodhound-1 | {"level":"info","time":"2023-10-03T09:08:19.575447636Z","message":"# #"} bloodhoundce-bloodhound-1 | {"level":"info","time":"2023-10-03T09:08:19.575448447Z","message":"###################################################################"}
BloodHound CEが起動したらブラウザでhttp://<UbuntuのIPアドレス>:8080
へアクセスします。
正しくインストールできていれば、BloodHound CEのログイン画面が表示されるため、Email Addressにadmin
、Passwordに先ほどメモした初期パスワード
を入力し、ログインします。
パスワードの再設定画面が表示されるので、任意のパスワードを設定します。
ログイン後の画面が表示されればインストール作業は終了です。
なお、BloodHound CEの2回目以降の起動や、Dockerコンテナの停止、削除は以下のコマンドで行います。
// BloodHound CEの起動(バックグラウンド) $ docker compose up -d // Dockerコンテナの停止 $ docker compose down // Dockerコンテナの削除 $ docker compose down --rmi all --volumes --remove-orphans
使い方
本記事ではMicrosoft Entra IDではなく、従来のAD環境における使い方を説明します。
まずはAD環境の情報を収集するためのコレクタをダウンロードします。
右上の歯車アイコンからDownload Collectors
を選択します。
DOWNLOAD SHARPHOUND V2.0.0 (.ZIP)
から、AD環境の情報を収集するためのコレクタであるSharpHoundをダウンロードします。
次にSharpHoundを用いてAD環境の情報を収集します。
検証用のAD環境に参加しているクライアント端末にSharpHoundをコピーし、実行します。
C:\> SharpHound.exe
検証用のAD環境についてここでは詳しく説明しませんが、以前ペネトレーションテストにおける検証・勉強用AD環境について紹介する記事を公開しています。 以降のデータも紹介した環境で取得したデータを使用していますので、必要に応じてそちらも参考にしてみてください。
SharpHoundの実行が終わると、20231004143230_BloodHound.zip
といった名前のzipファイルが作成されます(数字はSharpHoundの実行日時)。
次に収集した情報をBloodHound CEにアップロードします。
右上の歯車アイコンからAdministration
を選択します。
左ペインのData Collection > File Ingest
からUPLOAD FILE(S)
を選択します。
ファイルの選択もしくはドラッグ&ドロップによってファイルをアップロードします。 このときの注意点として、BloodHound Legacyではzipファイルのままアップロードすることが可能でしたが、BloodHound CEはjsonファイルのみを受け付けるため、一度zipファイルを解凍してからjsonファイルの状態でアップロードする必要があります。
情報のアップロードが完了したら、いよいよデータ分析が可能となります。
BloodHound CEのGUIにおいては主にSEARCH、PATHFINDING、CYPHERの3つの機能を使うことが多いです。
SEARCH
ノードを検索する機能です。BloodHoundにおけるノードとは、ADのオブジェクトを示します。 例えば、ユーザアカウントやコンピュータアカウント、セキュリティグループ、OU(Organizational Unit)などです。
左上のSEARCHタブが選択されている状態で検索欄に文字を入力すると、ノード(オブジェクト)を検索することができます。 部分一致するノードが検索欄の下に一覧表示されるので、該当するノードを選択します。 グラフとして表示されたノードをクリックすると、右側に詳細なプロパティが表示されます。
以下は例として、セキュリティグループであるDomain Admins
を検索し、プロパティのMembers
をクリックすることで、Domain Adminsに所属するユーザアカウントを調査した際の画像です。
ちなみに、ノードとノードを結ぶ線をエッジと呼びます。 エッジはノードとノードの関係性を表すものであり、オブジェクトの所属関係やACLの関連性を示します。
PATHFINDING
ノードからノードまでの経路を検索する機能です。 ペネトレーションテストにおいては、起点となるユーザアカウントから目標となるユーザアカウントまで直接悪用可能な経路が存在しているか調査したり、テストの過程で侵害したユーザアカウントからさらに高い権限を持つユーザアカウントへ権限昇格可能な経路が存在しているか調査したりする際に使用します。
左上のPATHFINDINGタブが選択されている状態で、Start Node
に起点となるノードを入力し、Destination Node
に目標となるノードを入力します。
2つのノードを直接結ぶ経路が存在していれば、グラフとして表示されます。経路が存在しない場合はPath not found.
となり、何も表示されません。
以下は例として、起点となるユーザアカウントjohn.smith@ad.example.local
から目標となるユーザアカウントadministrator@ad.example.local
までの経路を調査した際の画像です。
ACLの悪用方法に関する具体的な説明は省きますが、ACLを悪用することによって目標となるユーザアカウントを侵害できる可能性が示されています。
CYPHER
独自のCypherクエリを実行できる機能です。 CypherとはNeo4jによって開発されたクエリ言語であり、Neo4jにおけるノードとエッジを言語として表現することで、SQLのようにデータの取得や集計を行うことが可能です。 BloodHound CEにおいても独自のCypherクエリを定義し、柔軟にデータを抽出することができます。
左上のCYPHERタブが選択されている状態でCypherクエリを入力し、▶ SEARCH
ボタンをクリックすることでクエリが実行されます。
もちろん実際に独自のCypherクエリを実行するためには、参考文献に記載の公式ドキュメントを参考にクエリを組み立てる必要がありますが、BloodHoundには予めよく使用するクエリが登録されており、それを利用することができます。
左上のフォルダマークをクリックすることで、登録済みのCyperクエリ一覧が表示され、任意のクエリを選択するだけで実行が可能です。
以下は例として、登録済みのCyperクエリShortest paths to Domain Admins
を実行した際の画像です。
高い権限を持つDomain Admins
グループへの経路が示されています。
BloodHound CEの主な使い方は以上です。
おわりに
普段の業務でも多々お世話になっているBloodHoundが生まれ変わったということで早速使ってみました。 ポータビリティが低下した点は少し残念ではあるものの、それ以上に受ける恩恵が大きいと感じています。
BloodHoundはレッドチーム(攻撃側)としての業務でよく使用しますが、ブルーチーム(防御側)においても運用しているAD環境に存在する攻撃経路や脆弱性の特定に活用することができます。 また、AD環境やMicrosoft Entra ID環境における権限関係を深く理解するといった学習目的にも活用できるため、興味のある方はぜひ利用してみてください。
参考文献
SpectreOpsによるBloodHound CEに関するブログ
BloodHound CEの公式リポジトリ
BloodHoundの公式ドキュメント