
BloodHound内の攻撃経路を特定し、AD階層化を突破する
ImproHoundは、GUIを備えたdotnetスタンドアロンWindows x64実行ファイルです。 ImproHoundを使用するには、まずSharpHoundを実行してADから必要なデータを収集し、そのデータをBloodHoundにアップロードする必要があります。ImproHoundはBloodHoundの基盤となるNeo4jデータベースに接続します。ImproHoundでは、OU構造を介してADオブジェクトを階層に分類し、ADオブジェクトがより上位(ゼロに近い)階層のオブジェクトを侵害できるAD関係を特定し、階層違反をCSVファイルに保存します。
ImproHound DEF CON Adversary Village発表
1. BloodHoundデータベースをセットアップ
ADでSharpHoundを使用してBloodHoundデータを収集
注意:これによりAV、SIEM等にノイズが発生します。
例:SharpHound.exeをcmdから実行し、すべてを収集する(はい、GPOLocalGroupはAllに含まれていません):
SharpHound.exe --CollectionMethods All,GPOLocalGroup
ヒント1:
Domainパラメータを使用して、フォレスト内の他のドメインからデータを収集します。
ヒント2:さらに多くのデータを得るには、セッションループ収集方法を使用します
BloodHound GUIにBloodHoundデータをアップロード
BloodHoundには、BloodHoundデータzipをアップロードする際にドメインjsonファイルがスキップされるバグがあります。データアップロード後にBloodHoundのDB統計を確認し、ドメインオブジェクトが存在することを確認してください。
2. APOC Neo4jプラグインをインストール (必要な素晴らしいグラフ操作を有効にします)
Neo4jのバージョンに一致するAPOCをダウンロードします(apoc-x.x.x.x-all.jar)。
バージョン互換性マトリックスでNeo4jバージョンに適したAPOCバージョンを見つけてください。
Neo4jをインストールした場所を思い出し、APOC jarファイルを$NEO4J_HOME/plugins/の下に配置します
/var/lib/neo4j/お気に入りのテキストエディタでneo4j.confを編集し、APOCへの無制限アクセスを許可するために次の行を置き換えます:
#dbms.security.procedures.unrestricted=my.extensions.example,my.procedures.*
を次の行に置き換えます:
dbms.security.procedures.unrestricted=apoc.*
/etc/neo4j/neo4j.conf$NEO4J_HOME/conf/neo4j.confImproHoundを1つのホストで実行し、BloodHoundを別のホストで実行する場合は、BloodHoundホスト上のNeo4jデータベースへのリモート接続を許可する必要があります。そのためには、
neo4j.confの#dbms.default_listen_address=0.0.0.0という行から#を削除してください。
3. 最新リリースのImproHound.exeをWindows(x64)でダウンロードして実行
BloodHound GUIで使用するのと同じ資格情報でBloodHound DBにログインできることを確認してください。

データベースの資格情報を入力し、接続を確立します。BloodHound GUIで使用するのと同じ資格情報です。

ImproHoundは、BloodHoundデータベース内のノードに「TierX」ラベルを作成します。以前にこのBloodHoundデータベースでImproHoundを使用したことがある場合は、既に作成した階層設定を続行するか、最初からやり直すかを尋ねられます。

ImproHoundでは、「デフォルト階層化」を選択するとDomain AdminsをTier 0、Domain UsersをTier 2などに設定するか、またはすべてのオブジェクトをTier 2に設定できます。

このページでADオブジェクトを階層に分類します。ウィンドウにはOU構造が表示されます。各ADオブジェクトには階層値があり、矢印で増減できます。
子オブジェクトを階層に設定
ドメインまたはADコンテナを選択した場合、「子オブジェクトを階層に設定」をクリックすると、すべての子オブジェクト(再帰的)が指定されたドメイン/コンテナの階層レベルに設定されます。
メンバーを階層に設定
グループを選択した場合、「子オブジェクトを階層に設定」(原文ママ)をクリックすると、すべてのメンバー(再帰的)が指定されたグループの階層レベルに設定されます。
GPOの階層を設定
「GPOの階層を設定」をクリックすると、各GPOの階層レベルが、そのGPOがリンクされているOUの中で最も高い階層(ゼロに最も近い)に設定されます。どのOUにもリンクされていないGPOの階層レベルは変更されません。
階層違反を取得
BloodHoundデータベース内で、ADオブジェクトがより上位(ゼロに近い)階層のADオブジェクトを制御しているすべての関係を見つけます。
出力として2つのCSVファイルが生成されます。
違反CSVのレコード例:
最初のレコードは、Tier 1のサービスアカウントがTier 0のユーザーアカウントのパスワードを変更する権限を持っていることを示しています。関係は継承されています。残念ながら、BloodHoundデータ内で関係がどこから継承されているかを常に確認できるわけではありませんが、Users and Computersで対象ADオブジェクトのアクセス許可を調べることで手動で確認できます。2番目のレコードは、GPOを編集する権限を持つグループを示しており、そのGPOはおそらくTier 0サーバーを含むOUにリンクされています(Tier 0 GPOであるため)。
すべての関係タイプとその悪用方法はこちらで確認できます。
オブジェクトが高すぎる(ゼロに近すぎる)階層にあることが判明した場合は、ImproHoundで修正し、そのオブジェクトをSOURCEとして違反を確認する必要があります。オブジェクトが低すぎる(無限大に近すぎる)階層にある場合は、ImproHoundで修正し、そのオブジェクトをTARGETとして違反を確認する必要があります。
階層の削除
すべての階層ラベルとImproHoundが作成したノードがBloodHoundデータベースから削除されます。
ADオブジェクトを正しく階層化することが重要です。DCと通常の低権限ユーザーを両方Tier 0オブジェクトに設定すると、ImproHoundはそのユーザーのDCへの管理者アクセスが階層違反であることを検出しません。同様に、両方をTier 2に追加した場合も同じです。
コンピュータは、侵害された場合の重要度に基づいて階層化されます。
ユーザーは、ログオンできるコンピュータと制御権限を持つADオブジェクトに基づいて階層化されます。制御権限の例としては、Tier 1サーバーにリンクされたGPOを編集する権限を持つユーザーが挙げられ、そのユーザーはTier 1オブジェクトとなります。
グループは、そのメンバーの最も低い階層(無限大に最も近い)に属します。ただし、グループに悪質なメンバーがいる場合(例:通常のユーザーがDomain Adminsのメンバーである場合)は除きます。
例:Domain Usersは、Tier 0のユーザーがメンバーであってもTier 2グループです。なぜなら、ユーザーに権限を与えているのはDomain Usersのメンバーシップではないからです。一方、Domain AdminsグループはTier 0グループです。このグループのメンバーシップによりユーザーは非常に特権的になるからです。_Cloneable Domain Controllers_はADにおいて特権を持っていませんが(少なくとも筆者の知る限り)、Tier 0オブジェクト(すなわちDC)のみを含むべきであるため、Tier 0グループです。
コンテナは、その子オブジェクトの最も高い階層(ゼロに最も近い)に属するか、それよりも高い階層に属します。
例:UsersコンテナにすべてのTier 0、Tier 1、Tier 2ユーザーが含まれているとします。Usersコンテナに対するフルコントロール権限を持つユーザーは、すべてのユーザー(Tier 0ユーザーを含む)を侵害できます(一部保護されているものを除きますが、この例では重要ではありません)。したがって、UsersコンテナはTier 0オブジェクトでなければなりません。
GPOの階層レベルは、GPOがリンクされているOUの階層レベルによって決まります。GPOは、リンクされているOUの中で最も高い階層(ゼロに最も近い)に属します。 [Set tier for GPOs]ボタンを使用して、すべてのGPOがこの原則に従っていることを確認してください。
例:Tier 1 OUにリンクされたGPOを編集する権限を持つユーザーは、GPOを変更することでTier 1 OU配下のすべてのサーバーのAdministratorsメンバーシップを制御できます。
Neo4jを再起動
systemctl restart neo4jnet stop neo4j && net start neo4j(PowerShell:net stop neo4j; net start neo4j)| SourceTier | SourceType | SourceName | SourceDistinguishedname | Relation | IsInherited | TargetTier | TargetType | TargetName | TargetDistinguishedname |
|---|
| Tier1 | User | [email protected] | CN=svc-monitor,CN=Users,DC=hot,DC=local | ForceChangePassword | True | Tier0 | User | [email protected] | CN=T0_JBK,CN=Users,DC=hot,DC=local |
| Tier2 | Group | [email protected] | CN=Wrk-Admins,CN=Groups,DC=hot,DC=local | GenericWrite | Tier0 | GPO | [email protected] | CN={6AC1786C-016F-11D2-945F-00C04fB984F9},CN=Policies,CN=System,DC=hot,DC=local |