
ProfileHound - ドメインマシンに保存されているユーザープロファイルのためのBloodHound OpenGraphコレクター。ドメインマシン上のアクティブなユーザープロファイルを特定することで、秘密情報の収奪について情報に基づいた判断を下せます。
____ _____ __ __ __ __
/ __ \_________ / __(_) /__ / / / /___ __ ______ ____/ /
/ /_/ / ___/ __ \/ /_/ / / _ \/ /_/ / __ \/ / / / __ \/ __ /
/ ____/ / / /_/ / __/ / / __/ __ / /_/ / /_/ / / / / /_/ /
/_/ /_/ \____/_/ /_/_/\___/_/ /_/\____/\__,_/_/ /_/\__,_/
ProfileHound は、権限昇格後のツールであり、ドメインユーザープロファイルをマシン上で特定することで、レッドチーミングの目標達成を支援します。BloodHound の OpenGraph 形式を利用して、HasUserProfile という新しいエッジを構築します。このエッジは、あるコンピューター上にユーザープロファイルが存在するかどうかを判定します。これにより、オペレーターはシークレットの収集のためにどのコンピューターを標的にするか、情報に基づいた判断ができるようになります。
このツールは、ターゲットマシンの C$ 共有に対して管理者権限でのアクセスが必要です。
Remi Gascou 氏 (@podalirius) の ShareHound および bhopengraph ツールに多大な感謝を捧げます。このデータを収集するツールを以前から作りたいと考えており、これらのライブラリを使用することで、配管作業ではなく構築に集中することができました。
[!WARNING] ProfileHound は開発初期段階にあり、すべての収集モードがまだ実装されていません。本番環境での使用は注意して行い、このツールの使用に伴うリスクはすべて利用者が負うものとします。
Active Directory におけるポストエクスプロイテーションの目標は、オンプレミスに保存されたデータから SaaS アプリケーションやクラウドへと移行しています。オフェンシブセキュリティで価値を示すためには、これらのサービスへのアクセスがいかに侵害されうるかを実証する必要があります。多くの場合、これらのサービスは HR や財務など特定のグループやユーザーのみが使用しています。また、特定の SaaS アプリケーションは特定のマシンからしかアクセスできないシナリオもあります。
BloodHound の HasSession エッジは優れていますが、ユーザーがマシンにログオンしている場合にのみ有用です。データ収集時にユーザーがマシンにログオンしていない場合、さらなる悪用を促進するシークレットが含まれているコンピューターを見つけるのは困難になる可能性があります。ユーザープロファイルには、DPAPI、キャッシュされた資格情報、SSH 鍵、クラウド鍵など、かなりの量の価値ある情報が含まれている可能性があり、これらにアクセスするのにアクティブなユーザーセッションは必要ありません。

ProfileHound は BloodHound の OpenGraph 形式 を使用して、HasUserProfile という新しいグラフエッジを構築します。これは、ドメインユーザープロファイルがドメインマシン上に存在するかどうかを判定します。これにより、オペレーターは価値の高いユーザーやグループのプロファイルが存在するマシンに焦点を絞ることができます。
HasUserProfile エッジには、プロファイルの作成日と最終更新日のプロパティが含まれています。この情報は以下の判断に役立ちます。

また、このエッジにはプロファイルの作成および変更のタイムスタンプのプロパティもあり、特定の Cypher クエリを使用して、特定のマシン上のアクティブなユーザープロファイルや長期間使用されているユーザープロファイルを見つけることができます。
ProfileHound は pipx を使用してインストールします(依存関係地獄を避けるため):
pipx install profilehound
最新版(最先端)を使用する場合は、ソースからインストールできます:
pipx install git+https://github.com/m4lwhere/profilehound.git
コンテナ化されたアプローチを使用するには、以下のようにイメージをビルドしてツールを実行します:
docker build -t profilehound .
docker run --rm profilehound --help
docker run --rm -v ${PWD}:/profilehound profilehound --auth-user alice --auth-password whiteRabbit --auth-domain sccm.lab --dns 192.168.57.10 --auth-dc-ip 192.168.57.10
例えば、ドメイン管理者アカウント sccm.lab\alice とパスワード whiteRabbit を使用して実行する場合:
$ profilehound --auth-user alice --auth-password whiteRabbit --auth-domain sccm.lab --target 192.168.57.0/27
____ _____ __ __ __ __
/ __ \_________ / __(_) /__ / / / /___ __ ______ ____/ /
/ /_/ / ___/ __ \/ /_/ / / _ \/ /_/ / __ \/ / / / __ \/ __ /
/ ____/ / / /_/ / __/ / / __/ __ / /_/ / /_/ / / / / /_/ /
/_/ /_/ \____/_/ /_/_/\___/_/ /_/\____/\__,_/_/ /_/\__,_/ v0.1.1
@m4lwhere
BloodHound CE OpenGraph collector for user profiles stored on domain machines.
[12/30/25 11:58:05] INFO Loaded 32 targets
[12/30/25 11:58:08] INFO Successful authentication on 192.168.57.10 (192.168.57.10) as sccm.lab\alice
INFO Successfully connected to share \\192.168.57.10\C$ as sccm.lab\alice
INFO Enumerating profiles in \\192.168.57.10\C$\Users\...
INFO vagrant: S-1-5-21-3016982856-3796307652-1246469985-1000 created:2025-11-07 modified:2025-11-07
INFO Found 1 domain profile(s) for 192.168.57.10
INFO Successful authentication on 192.168.57.11 (192.168.57.11) as sccm.lab\alice
[12/30/25 11:58:09] INFO Successfully connected to share \\192.168.57.11\C$ as sccm.lab\alice
INFO Enumerating profiles in \\192.168.57.11\C$\Users\...
INFO administrator: S-1-5-21-3016982856-3796307652-1246469985-500 created:2025-11-07 modified:2025-11-07
INFO alice: S-1-5-21-3016982856-3796307652-1246469985-1112 created:2025-12-28 modified:2025-11-07
INFO eve: S-1-5-21-3016982856-3796307652-1246469985-1116 created:2025-12-27 modified:2025-11-07
INFO Found 3 domain profile(s) for 192.168.57.11
INFO Successful authentication on 192.168.57.12 (192.168.57.12) as sccm.lab\alice
INFO Successfully connected to share \\192.168.57.12\C$ as sccm.lab\alice
INFO Enumerating profiles in \\192.168.57.12\C$\Users\...
INFO alice: S-1-5-21-3016982856-3796307652-1246469985-1112 created:2025-12-28 modified:2025-12-28
INFO franck: S-1-5-21-3016982856-3796307652-1246469985-1117 created:2025-12-27 modified:2025-11-07
INFO sccm-sql: S-1-5-21-3016982856-3796307652-1246469985-1121 created:2025-11-07 modified:2025-11-07
INFO Found 3 domain profile(s) for 192.168.57.12
INFO Successful authentication on 192.168.57.13 (192.168.57.13) as sccm.lab\alice
INFO Successfully connected to share \\192.168.57.13\C$ as sccm.lab\alice
INFO Enumerating profiles in \\192.168.57.13\C$\Users\...
INFO alice: S-1-5-21-3016982856-3796307652-1246469985-1112 created:2025-12-26 modified:2025-12-28
INFO sccm-account-da: S-1-5-21-3016982856-3796307652-1246469985-1119 created:2025-12-26 modified:2025-11-07
INFO Found 2 domain profile(s) for 192.168.57.13
[12/30/25 11:59:27] INFO Found 4 machines with profiles
INFO Exported OpenGraph intel to profilehound_20251230-115805.json
これにより、カレントディレクトリに profilehound_20251230-115805.json というファイルが作成されます。このファイルは、BloodHound UI にドラッグ&ドロップすることで BHCE に直接インポートできます。自動的に解析され、SID を介してノードが関連付けられます。新しいエッジ HasUserProfile が作成され、ユーザーとプロファイルの関係を示します。
ProfileHound は完了時にコンソールに小さな統計サマリーを出力します:
╭───────────────────────── General Summary ──────────────────────────────╮
│ ProfileHound Statistics │
│ Total Targets with Profiles 4 │
│ Total Unique Profiles (Users) 7 │
│ Average Profiles per Target 2.25 │
╰────────────────────────────────────────────────────────────────────────╯
Top Connected Users
┏━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ User ┃ Machine Count ┃
┡━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ alice │ 3 │
│ vagrant │ 1 │
│ administrator │ 1 │
│ eve │ 1 │
│ franck │ 1 │
└───────────────┴───────────────┘
Top Populated Machines
┏━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Machine ┃ Profile Count ┃
┡━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ 192.168.57.11 │ 3 │
│ 192.168.57.12 │ 3 │
│ 192.168.57.13 │ 2 │
│ 192.168.57.10 │ 1 │
└───────────────┴───────────────┘
Oldest User Profiles
┏━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ User ┃ Machine ┃ Created ┃ Last Modified ┃
┡━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ vagrant │ DC.sccm.lab │ 2025-11-07 │ 2025-11-07 │
│ sccm-sql │ MSSQL.sccm.lab │ 2025-11-07 │ 2025-11-07 │
│ administrator │ MECM.sccm.lab │ 2025-11-07 │ 2025-11-07 │
│ sccm-account-da │ CLIENT.sccm.lab │ 2025-12-26 │ 2025-11-07 │
│ alice │ CLIENT.sccm.lab │ 2025-12-26 │ 2025-12-28 │
└─────────────────┴─────────────────┴────────────┴───────────────┘
Longest Lived Profiles (Created -> Modified)
┏━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ User ┃ Machine ┃ Age (Days) ┃ Created ┃ Last Modified ┃
┡━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ alice │ CLIENT.sccm.lab │ 1.8 │ 2025-12-26 │ 2025-12-28 │
│ alice │ MSSQL.sccm.lab │ 0.0 │ 2025-12-28 │ 2025-12-28 │
│ sccm-sql │ MSSQL.sccm.lab │ 0.0 │ 2025-11-07 │ 2025-11-07 │
│ administrator │ MECM.sccm.lab │ 0.0 │ 2025-11-07 │ 2025-11-07 │
│ vagrant │ DC.sccm.lab │ 0.0 │ 2025-11-07 │ 2025-11-07 │
└───────────────┴─────────────────┴────────────┴────────────┴───────────────┘
Top 5 Machines to Focus On (Hubs)
┏━━━━━━━━━━━━━━━━━┳━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Machine ┃ Score ┃ Reason ┃
┡━━━━━━━━━━━━━━━━━╇━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│ MECM.sccm.lab │ 4.5 │ Has 3 profiles, potential lateral movement hub │
│ MSSQL.sccm.lab │ 4.5 │ Has 3 profiles, potential lateral movement hub │
│ CLIENT.sccm.lab │ 3.5 │ Has 2 profiles, potential lateral movement hub │
│ DC.sccm.lab │ 1.0 │ Has 1 profiles, potential lateral movement hub │
└─────────────────┴───────┴────────────────────────────────────────────────┘
ProfileHound は C$ 共有を使用して、\\<ターゲット>\C$\Users\ にあるドメインマシン上のユーザープロファイルを列挙します。ユーザーの NTUSER.DAT ファイルを読み取り、ファイルメタデータから SID を取得することで、そのユーザーがドメインアカウントかローカルアカウントかを判断します。例えば、\\<ターゲット>\C$\Users\ にあるすべてのユーザーディレクトリを収集し、各ディレクトリをループして \\<ターゲット>\C$\Users\<ユーザー名>\NTUSER.DAT にある NTUSER.DAT ファイルを見つけます。NTUSER.DAT ファイルが既知の SID によって所有されている場合、そのユーザーの DPAPI ディレクトリ(例:\\<ターゲット>\C$\Users\<ユーザー名>\AppData\Roaming\Microsoft\Protect\<SID>)を読み取ることでユーザーの SID を見つけようとします。
C$ 共有にアクセスするため、ターゲットマシンに認証するための管理者アカウントが必要です。ProfileHound は提供された資格情報を使用してターゲットマシンに認証します。ドメインアカウントを使用する場合は --auth-domain オプションでドメインを指定できます。ローカルアカウントを使用する場合は --smb-local-auth オプションを使用します。
デフォルトでは、ProfileHound は SMB ドメイン認証の失敗後に処理を停止し、アカウントロックアウトのリスクを低減します。一部のエンドポイントでドメイン認証が拒否されることが予想され、残りのターゲットのスキャンを続行する場合は、--smb-ignore-failed-domain-auth を使用します。
プロファイルがすでに見つかった後に SMB データ収集中に ProfileHound が停止した場合、部分的な OpenGraph 結果をエクスポートしてから終了します。
NTUSER.DAT ファイルの作成日と最終更新日が収集され、プロファイルがアクティブかどうかの判断に使用できます。この関連付けはエッジプロパティに対する Cypher クエリ内で処理されます。以下に例を示します。
興味深い点として、NTUSER.DAT ファイルの最終更新日が作成日より前の場合、そのプロファイルは作成されたものの実質的に使用されていない可能性が高いです。この状態は、新しいユーザープロファイルが作成される際に NTUSER.DAT ファイルが C:\Users\Default プロファイルからコピーされ、作成日が後であるにもかかわらず同じ更新日が維持されるために発生します。そのため、特定のプロファイルにはシークレットが含まれていないと合理的に判断できます。
ProfileHound は @podalirius_ の ShareHound をライブラリとして使用してターゲットを列挙します。--target または --target-file オプションが指定されていない場合、ProfileHound は LDAP に接続してドメイン内のすべてのマシンの FQDN を自動的に収集します。
このデータからは多くの強力な結論を導き出すことができ、どこに注力すべきかを示してくれます。以下のクエリはすべて、ProfileHound_Cypher_Queries.zip ファイル を BloodHound UI の 保存済みクエリ ページにある インポート ボタンを使用してドラッグ&ドロップすることでインポートできます。 以下にいくつかの例を示します。
これは、グラフ内のすべてのユーザープロファイルを検索するシンプルなクエリです。
MATCH p=(u:User)-[:HasUserProfile]->(c:Computer)
RETURN p
これは、ドメイン "Administrators" グループのメンバーであるすべてのユーザープロファイルを検索します。
MATCH p=(g:Group)<-[:MemberOf*1..]-(u:User)-[:HasUserProfile]->(c:Computer)
WHERE toLower(g.samaccountname) = "administrators"
RETURN p
これは、過去3日以内に変更されたすべてのユーザープロファイルを検索します。これにより、ユーザープロファイルがそのユーザーの主要なマシンであり、良い「戦利品」がある可能性が高い場所を特定できます。
WITH 3 as active_days
MATCH p = (u:User)-[e:HasUserProfile]-(c:Computer)
WHERE e.profileModified > (datetime().epochseconds - (active_days * 86400))
RETURN p
これは、特定のグループのメンバーについて、過去3日以内に使用されたユーザープロファイルを特定する非常に強力なクエリです。
WITH 3 as active_days, "administrators" as group_name
MATCH p = (g:Group)<-[:MemberOf*1..]-(u:User)-[e:HasUserProfile]-(c:Computer)
WHERE e.profileModified > (datetime().epochseconds - (active_days * 86400)) AND toLower(g.samaccountname) = group_name
RETURN p
これは、NTUSER.DAT ファイルの更新日が作成日より前であるユーザープロファイルをすべて削除します。これは、プロファイルが作成されたものの実質的に使用されていないことを示します。この状態は、新しいユーザープロファイルが作成される際に NTUSER.DAT ファイルが C:\Users\Default プロファイルからコピーされ、作成日が後であるにもかかわらず同じ更新日が維持されるために発生します。
match p = (u:User)-[e:HasUserProfile]-(c:Computer)
where e.profileCreated < e.profileModified
return p
これは、Remi Gascou 氏(@podalirius)の ShareHound と bhopengraph ライブラリなしには実現できませんでした。
このツールの焦点は、特定のユーザーにとってシークレットが含まれている可能性が最も高いマシンを特定することです。今後の改善点は以下の通りです。
get_lastlogon 関数を使用して、マシン上に HasUserProfile エッジを作成する。get_puser 関数を使用して、ドメインユーザーを特定のマシンのプライマリデバイス所有者として関連付ける。.data.owners[owner.DeviceOwner.onPremisesSecurityIdentifier] で AZDeviceOwner オブジェクトとして既に収集されているようです。NTUSER.DAT ファイルをマイニングして、最近使用されたプログラム、ドキュメント、ブラウザのアクティビティを取得する。