ラック・セキュリティごった煮ブログ

セキュリティエンジニアがエンジニアの方に向けて、 セキュリティやIT技術に関する情報を発信していくアカウントです。

【お知らせ】2021年5月10日~リニューアルオープン!今後はこちらで新しい記事を公開します。

株式会社ラックのセキュリティエンジニアが、 エンジニアの方向けにセキュリティやIT技術に関する情報を発信するブログです。(編集:株式会社ラック・デジタルペンテスト部)
当ウェブサイトをご利用の際には、こちらの「サイトのご利用条件」をご確認ください。

デジタルペンテスト部提供サービス:ペネトレーションテスト

新しく生まれ変わったBloodHound Community Editionを使ってみた

デジタルペンテスト部でペネトレーションテストを担当している小松奈央です。

突然ですが皆さんは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におけるオブジェクト(ユーザアカウントやコンピュータアカウント、セキュリティグループなど)や、そのACLAccess Control List、オブジェクトに対するアクセスの許可および拒否設定)に関する情報を収集し、グラフ理論に基づいて可視化することが可能です。

BloodHound CEによるデータ分析の様子

これにより、AD環境における複雑なオブジェクト関係を可視化・整理することができ、効率的な侵入経路を判断することができます。 実際のペネトレーションテストにおいては、以下のようなシチュエーションでよく使用しています。

  • 侵害済みのアカウントからさらに高い権限を持ったアカウントへ権限昇格可能な経路が存在しているか調査する
  • ACLの設定不備によって悪用可能な脆弱性が存在しているか調査する
  • テストシナリオのゴール(攻撃者視点での目標)を達成するための足がかり(マイルストーン)となるユーザやコンピュータを調査する

2021年には、機能の拡充や有償サポートが追加されたBloodHound Enterpriseがリリースされています。

BloodHound CE誕生の背景

BloodHoundの名称と歴史(SpectreOps社のブログより引用)

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環境について紹介する記事を公開しています。 以降のデータも紹介した環境で取得したデータを使用していますので、必要に応じてそちらも参考にしてみてください。

devblog.lac.co.jp

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においては主にSEARCHPATHFINDINGCYPHERの3つの機能を使うことが多いです。

ノードを検索する機能です。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環境における権限関係を深く理解するといった学習目的にも活用できるため、興味のある方はぜひ利用してみてください。

参考文献