
ProfileHound — коллектор OpenGraph для BloodHound, собирающий пользовательские профили, хранящиеся на машинах домена. Принимайте обоснованные решения о добыче секретов, выявляя активные пользовательские профили на машинах домена.
____ _____ __ __ __ __
/ __ \_________ / __(_) /__ / / / /___ __ ______ ____/ /
/ /_/ / ___/ __ \/ /_/ / / _ \/ /_/ / __ \/ / / / __ \/ __ /
/ ____/ / / /_/ / __/ / / __/ __ / /_/ / /_/ / / / / /_/ /
/_/ /_/ \____/_/ /_/_/\___/_/ /_/\____/\__,_/_/ /_/\__,_/
ProfileHound — это инструмент пост-эскалации, помогающий находить и достигать целей red teaming путём обнаружения доменных пользовательских профилей на машинах. Он использует формат OpenGraph от BloodHound для создания нового ребра HasUserProfile, которое определяет, существует ли профиль пользователя на компьютере. Это ребро позволяет операторам принимать обоснованные решения о том, какие компьютеры выбирать целью для извлечения секретов.
Для перечисления пользовательских профилей инструменту требуется административный доступ к ресурсу C$ на целевых машинах.
Огромное спасибо Remi Gascou (@podalirius) за инструменты ShareHound и bhopengraph. Я давно хотел создать инструмент для сбора этих данных, и использование этих библиотек позволило мне сосредоточиться на разработке, а не на подключении.
[!WARNING] ProfileHound находится на ранней стадии разработки, и ещё не все режимы сбора реализованы. Используйте с осторожностью в production-средах; вы принимаете на себя риски, связанные с использованием этого инструмента.
Цели пост-эксплуатации в Active Directory сместились с данных, хранящихся локально, в SaaS-приложения и облако. Чтобы доказать ценность в offsec, нужно показать, как может быть скомпрометирован доступ к этим сервисам. Во многих случаях эти сервисы используются только определёнными группами или пользователями, например HR, Finance и т. д. В некоторых сценариях доступ к отдельным SaaS-приложениям возможен только с конкретных машин.
Ребро HasSession в BloodHound отлично подходит, но оно полезно только когда пользователь выполнил вход на машину. Если пользователь не был залогинен на машине на момент сбора данных, может быть сложно определить, какой компьютер содержит секреты для дальнейшей эксплуатации. Пользовательские профили могут содержать значительный объём ценных данных: DPAPI, кэшированные учётные данные, SSH-ключи, облачные ключи и многое другое — для доступа к ним не требуется активная пользовательская сессия.

ProfileHound использует формат OpenGraph BloodHound для построения нового ребра графа 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 в текущем каталоге. Этот файл можно импортировать прямо в BHCE, перетащив его в интерфейс BloodHound. Он будет автоматически разобран, а узлы будут сопоставлены по 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$ для перечисления пользовательских профилей на доменной машине по пути \\<target>\C$\Users\. Он читает файл NTUSER.DAT пользователя, чтобы определить, является ли учётная запись доменной или локальной, извлекая SID из метаданных файла. Например, инструмент собирает все пользовательские каталоги в \\<target>\C$\Users\, а затем проходит по каждому каталогу в поисках файла NTUSER.DAT по пути \\<target>\C$\Users\<username>\NTUSER.DAT. Если файл NTUSER.DAT принадлежит известному SID, ProfileHound пытается найти SID пользователя, читая его каталог DPAPI (например, \\<target>\C$\Users\<username>\AppData\Roaming\Microsoft\Protect\<SID>).
Поскольку мы обращаемся к ресурсу C$, для аутентификации на целевой машине нужна учётная запись администратора. ProfileHound использует предоставленные учётные данные для аутентификации на целевой машине. Если вы используете доменную учётную запись, можно указать домен с помощью опции --auth-domain. Если вы используете локальную учётную запись, используйте опцию --smb-local-auth.
По умолчанию ProfileHound останавливается после сбоя доменной аутентификации SMB, чтобы снизить риск блокировки учётных записей. Если ожидается, что некоторые конечные точки отклонят доменную аутентификацию, и вы хотите продолжить сканирование остальных целей, используйте --smb-ignore-failed-domain-auth.
Если ProfileHound остановится во время сбора данных по SMB после того, как профили уже найдены, он попытается перед выходом экспортировать частичные результаты OpenGraph.
Время создания и последнего изменения файла NTUSER.DAT собирается и может использоваться для определения активности профиля. Эта корреляция выполняется в Cypher-запросах по свойствам ребра; примеры приведены ниже.
Интересно отметить, что если файл NTUSER.DAT изменён раньше, чем создан, скорее всего, профиль был создан, но не использовался по-настоящему. Это происходит потому, что при создании нового профиля пользователя файл NTUSER.DAT копируется из профиля C:\Users\Default, сохраняя ту же дату изменения, хотя дата создания более поздняя. Поэтому можно с достаточной уверенностью предположить, что такой профиль не содержит секретов.
ProfileHound использует ShareHound от @podalirius_ в качестве библиотеки для перечисления целей. Если параметры --target или --target-file не указаны, ProfileHound перечисляет цели автоматически, подключаясь к LDAP для сбора всех FQDN машин в домене.
Из этих данных можно сделать множество важных выводов, указывающих, на чём стоит сосредоточить внимание. Все эти запросы можно импортировать в BloodHound, перетащив файл ProfileHound_Cypher_Queries.zip в интерфейс BloodHound с помощью кнопки Import на странице Saved Queries. Вот несколько примеров:
Это простой запрос, который находит все пользовательские профили в графе.
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, чтобы связать доменных пользователей как владельцев основных устройств для конкретных машин.AZDeviceOwner в .data.owners[owner.DeviceOwner.onPremisesSecurityIdentifier]NTUSER.DAT данные о недавних программах, документах и активности браузера.