
ProfileHound - Coletor OpenGraph do BloodHound para perfis de usuário armazenados em máquinas do domínio. Tome decisões informadas sobre roubo de segredos identificando perfis de usuário ativos em máquinas do domínio.
____ _____ __ __ __ __
/ __ \_________ / __(_) /__ / / / /___ __ ______ ____/ /
/ /_/ / ___/ __ \/ /_/ / / _ \/ /_/ / __ \/ / / / __ \/ __ /
/ ____/ / / /_/ / __/ / / __/ __ / /_/ / /_/ / / / / /_/ /
/_/ /_/ \____/_/ /_/_/\___/_/ /_/\____/\__,_/_/ /_/\__,_/
ProfileHound é uma ferramenta pós-escalada para ajudar a encontrar e atingir objetivos de red teaming, localizando perfis de usuários de domínio em máquinas. Ela usa o formato BloodHound OpenGraph para construir uma nova aresta chamada HasUserProfile, que determina se um perfil de usuário existe em um computador. Essa aresta permite que operadores tomem decisões informadas sobre quais computadores mirar para saquear segredos.
Esta ferramenta requer acesso administrativo ao compartilhamento C$ nas máquinas alvo para enumerar perfis de usuário.
Um enorme agradecimento a Remi Gascou (@podalirius) pelas ferramentas ShareHound e bhopengraph. Eu queria construir uma ferramenta para coletar esses dados há um tempo e usar essas bibliotecas me permitiu focar em construir em vez de conectar canos.
[!WARNING] ProfileHound está em estágios iniciais de desenvolvimento e nem todos os modos de coleta foram implementados ainda. Use com cautela em ambientes de produção, você assume o risco de usar esta ferramenta.
Os objetivos pós-exploração no Active Directory mudaram de dados armazenados localmente para aplicações SaaS e nuvem. Para provar valor em segurança ofensiva, precisamos demonstrar como o acesso a esses serviços pode ser comprometido. Em muitos casos, esses serviços são usados apenas por certos grupos ou usuários, como RH, Finanças, etc. Em alguns cenários, certas aplicações SaaS só podem ser acessadas de máquinas específicas.
A aresta HasSession do BloodHound é ótima, mas só é útil quando um usuário está logado em uma máquina. Se um usuário não estiver logado no momento da coleta de dados, pode ser difícil encontrar qual computador pode conter segredos para facilitar explorações adicionais. Perfis de usuário podem conter uma quantidade significativa de inteligência valiosa dentro de DPAPI, credenciais em cache, chaves SSH, chaves de nuvem e muito mais — esses não exigem uma sessão de usuário ativa para acessar.

ProfileHound usa o formato OpenGraph do BloodHound para construir uma nova aresta de grafo chamada HasUserProfile, que determina se existe um perfil de usuário em uma máquina do domínio. Isso pode ajudar operadores a focar em máquinas onde um usuário ou grupo de alto valor possui um perfil.
A aresta HasUserProfile contém propriedades para a data de criação e última modificação do perfil. Essas informações ajudam a determinar:

Esta aresta também possui propriedades para os timestamps de criação e modificação do perfil, permitindo consultas Cypher específicas para encontrar perfis de usuário ativos ou de longo prazo em máquinas específicas.
Instale ProfileHound usando pipx (a menos que você goste do inferno das dependências):
pipx install profilehound
Para usar a versão mais recente (bleeding edge), você pode instalar a partir do código fonte:
pipx install git+https://github.com/m4lwhere/profilehound.git
Para usar uma abordagem containerizada, construa a imagem e execute a ferramenta com o seguinte:
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
Por exemplo, para executar usando uma conta de Administrador de Domínio sccm.lab\alice com senha whiteRabbit:
$ profilehound --auth-user alice --auth-password whiteRabbit --auth-domain sccm.lab --target 192.168.57.0/27
____ _____ __ __ __ __
/ __ \_________ / __(_) /__ / / / /___ __ ______ ____/ /
/ /_/ / ___/ __ \/ /_/ / / _ \/ /_/ / __ \/ / / / __ \/ __ /
/ ____/ / / /_/ / __/ / / __/ __ / /_/ / /_/ / / / / /_/ /
/_/ /_/ \____/_/ /_/_/\___/_/ /_/\____/\__,_/_/ /_/\__,_/ v0.1.1
@m4lwhere
Coletor OpenGraph do BloodHound CE para perfis de usuário armazenados em máquinas do domínio.
[12/30/25 11:58:05] INFO Carregados 32 alvos
[12/30/25 11:58:08] INFO Autenticação bem-sucedida em 192.168.57.10 (192.168.57.10) como sccm.lab\alice
INFO Conectado com sucesso ao compartilhamento \\192.168.57.10\C$ como sccm.lab\alice
INFO Enumerando perfis em \\192.168.57.10\C$\Users\...
INFO vagrant: S-1-5-21-3016982856-3796307652-1246469985-1000 criado:2025-11-07 modificado:2025-11-07
INFO Encontrado(s) 1 perfil(is) de domínio para 192.168.57.10
INFO Autenticação bem-sucedida em 192.168.57.11 (192.168.57.11) como sccm.lab\alice
[12/30/25 11:58:09] INFO Conectado com sucesso ao compartilhamento \\192.168.57.11\C$ como sccm.lab\alice
INFO Enumerando perfis em \\192.168.57.11\C$\Users\...
INFO administrator: S-1-5-21-3016982856-3796307652-1246469985-500 criado:2025-11-07 modificado:2025-11-07
INFO alice: S-1-5-21-3016982856-3796307652-1246469985-1112 criado:2025-12-28 modificado:2025-11-07
INFO eve: S-1-5-21-3016982856-3796307652-1246469985-1116 criado:2025-12-27 modificado:2025-11-07
INFO Encontrado(s) 3 perfil(is) de domínio para 192.168.57.11
INFO Autenticação bem-sucedida em 192.168.57.12 (192.168.57.12) como sccm.lab\alice
INFO Conectado com sucesso ao compartilhamento \\192.168.57.12\C$ como sccm.lab\alice
INFO Enumerando perfis em \\192.168.57.12\C$\Users\...
INFO alice: S-1-5-21-3016982856-3796307652-1246469985-1112 criado:2025-12-28 modificado:2025-12-28
INFO franck: S-1-5-21-3016982856-3796307652-1246469985-1117 criado:2025-12-27 modificado:2025-11-07
INFO sccm-sql: S-1-5-21-3016982856-3796307652-1246469985-1121 criado:2025-11-07 modificado:2025-11-07
INFO Encontrado(s) 3 perfil(is) de domínio para 192.168.57.12
INFO Autenticação bem-sucedida em 192.168.57.13 (192.168.57.13) como sccm.lab\alice
INFO Conectado com sucesso ao compartilhamento \\192.168.57.13\C$ como sccm.lab\alice
INFO Enumerando perfis em \\192.168.57.13\C$\Users\...
INFO alice: S-1-5-21-3016982856-3796307652-1246469985-1112 criado:2025-12-26 modificado:2025-12-28
INFO sccm-account-da: S-1-5-21-3016982856-3796307652-1246469985-1119 criado:2025-12-26 modificado:2025-11-07
INFO Encontrado(s) 2 perfil(is) de domínio para 192.168.57.13
[12/30/25 11:59:27] INFO Encontradas 4 máquinas com perfis
INFO Exportado intel OpenGraph para profilehound_20251230-115805.json
Isso criou um arquivo chamado profilehound_20251230-115805.json no diretório atual. Este arquivo pode ser importado diretamente no BHCE arrastando e soltando o arquivo na interface do BloodHound. Ele será automaticamente analisado e correlacionará nós via SID. A nova aresta HasUserProfile será criada para mostrar o relacionamento entre o usuário e o perfil.
O ProfileHound também imprimirá um pequeno resumo de estatísticas no console quando concluído:
╭───────────────────────── Resumo Geral ──────────────────────────────╮
│ Estatísticas do ProfileHound │
│ Total de Alvos com Perfis 4 │
│ Total de Perfis Únicos (Usuários) 7 │
│ Média de Perfis por Alvo 2.25 │
╰────────────────────────────────────────────────────────────────────────╯
Usuários Mais Conectados
┏━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Usuário ┃ Contagem de Máq ┃
┡━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ alice │ 3 │
│ vagrant │ 1 │
│ administrator │ 1 │
│ eve │ 1 │
│ franck │ 1 │
└───────────────┴───────────────┘
Máquinas Mais Populadas
┏━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Máquina ┃ Contagem de Perfis ┃
┡━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ 192.168.57.11 │ 3 │
│ 192.168.57.12 │ 3 │
│ 192.168.57.13 │ 2 │
│ 192.168.57.10 │ 1 │
└───────────────┴───────────────┘
Perfis de Usuário Mais Antigos
┏━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Usuário ┃ Máquina ┃ Criado ┃ Última Modif. ┃
┡━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ 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 │
└─────────────────┴─────────────────┴────────────┴───────────────┘
Perfis de Vida Mais Longa (Criado -> Modificado)
┏━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Usuário ┃ Máquina ┃ Idade (Dias)┃ Criado ┃ Última Modif. ┃
┡━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ 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 Máquinas para Focar (Hubs)
┏━━━━━━━━━━━━━━━━━┳━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Máquina ┃ Pontuação ┃ Razão ┃
┡━━━━━━━━━━━━━━━━━╇━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│ MECM.sccm.lab │ 4.5 │ Tem 3 perfis, potencial hub de movimento lateral│
│ MSSQL.sccm.lab │ 4.5 │ Tem 3 perfis, potencial hub de movimento lateral│
│ CLIENT.sccm.lab │ 3.5 │ Tem 2 perfis, potencial hub de movimento lateral│
│ DC.sccm.lab │ 1.0 │ Tem 1 perfil, potencial hub de movimento lateral │
└─────────────────┴───────┴────────────────────────────────────────────────┘
O ProfileHound usa o compartilhamento C$ para enumerar perfis de usuário em uma máquina do domínio em \\<target>\C$\Users\. Ele lerá o arquivo NTUSER.DAT do usuário para determinar se o usuário é uma conta de domínio ou local, recuperando o SID dos metadados do arquivo. Por exemplo, ele reunirá todos os diretórios de usuário em \\<target>\C$\Users\ e então percorrerá cada diretório para encontrar o arquivo NTUSER.DAT em \\<target>\C$\Users\<username>\NTUSER.DAT. Se o arquivo NTUSER.DAT pertencer a um SID conhecido, ele tentará encontrar o SID do usuário lendo o diretório DPAPI (ex: \\<target>\C$\Users\<username>\AppData\Roaming\Microsoft\Protect\<SID>).
Como estamos acessando o compartilhamento C$, precisamos de uma conta administrativa para autenticar na máquina alvo. O ProfileHound usará as credenciais fornecidas para autenticar na máquina alvo. Se você estiver usando uma conta de domínio, pode usar a opção --auth-domain para especificar o domínio. Se estiver usando uma conta local, pode usar a opção --smb-local-auth.
Por padrão, o ProfileHound para após uma falha de autenticação de domínio SMB para reduzir o risco de bloqueio de conta. Se alguns endpoints devem rejeitar a autenticação de domínio e você deseja continuar escaneando os alvos restantes, use --smb-ignore-failed-domain-auth.
Se o ProfileHound parar durante a coleta de dados SMB depois que os perfis já foram encontrados, ele tentará exportar os resultados parciais do OpenGraph antes de sair.
Os horários de criação e última modificação do arquivo NTUSER.DAT são coletados e podem ser usados para determinar se o perfil está ativo. Essa correlação é tratada dentro de consultas Cypher nas propriedades da aresta; exemplos estão abaixo.
É interessante notar que, se o arquivo NTUSER.DAT foi modificado antes da data de criação, é provável que o perfil tenha sido criado, mas não usado de forma tangível. Essa condição existe porque o arquivo NTUSER.DAT é copiado do perfil C:\Users\Default quando um novo perfil de usuário é criado, mantendo a mesma data de modificação mesmo que a data de criação seja posterior. Por causa disso, podemos ter confiança razoável de que esse perfil específico não conterá nenhum segredo.
O ProfileHound usa a biblioteca ShareHound do @podalirius_ para enumerar alvos. Se nenhuma opção --target ou --target-file for fornecida, o ProfileHound enumerará alvos conectando-se ao LDAP para reunir todos os FQDNs de máquinas no domínio automaticamente.
Há muitas conclusões poderosas que podemos obter desses dados, indicando onde devemos focar nossa atenção. Todas essas consultas podem ser importadas no BloodHound arrastando e soltando o arquivo ProfileHound_Cypher_Queries.zip na interface do BloodHound usando o botão Importar na página Consultas Salvas. Aqui estão alguns exemplos:
Esta é uma consulta simples que encontrará todos os perfis de usuário no grafo.
MATCH p=(u:User)-[:HasUserProfile]->(c:Computer)
RETURN p
Isso encontrará todos os perfis de usuário que são membros do grupo "Administradores" do domínio.
MATCH p=(g:Group)<-[:MemberOf*1..]-(u:User)-[:HasUserProfile]->(c:Computer)
WHERE toLower(g.samaccountname) = "administrators"
RETURN p
Isso encontrará todos os perfis de usuário que foram modificados nos últimos 3 dias. Isso ajuda a determinar onde um perfil de usuário pode ser a máquina principal do usuário e ter um bom saque.
WITH 3 as active_days
MATCH p = (u:User)-[e:HasUserProfile]-(c:Computer)
WHERE e.profileModified > (datetime().epochseconds - (active_days * 86400))
RETURN p
Esta é uma consulta extremamente poderosa para localizar perfis de usuário específicos usados nos últimos 3 dias para membros de um grupo específico.
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
Isso removerá quaisquer perfis de usuário onde o arquivo NTUSER.DAT foi modificado antes da data de criação. Isso indica que o perfil foi criado, mas não usado de forma tangível. Essa condição existe porque o arquivo NTUSER.DAT é copiado do perfil C:\Users\Default quando um novo perfil de usuário é criado, mantendo a mesma data de modificação mesmo que a data de criação seja posterior.
match p = (u:User)-[e:HasUserProfile]-(c:Computer)
where e.profileCreated < e.profileModified
return p
Isso simplesmente não seria possível sem as bibliotecas ShareHound e bhopengraph de Remi Gascou (@podalirius).
O foco desta ferramenta é determinar quais máquinas têm maior probabilidade de conter segredos para usuários específicos. Melhorias futuras incluirão:
get_lastlogon para criar arestas HasUserProfile em máquinas.get_puser para associar usuários de domínio como proprietários primários de dispositivos para máquinas específicas.AZDeviceOwner em .data.owners[owner.DeviceOwner.onPremisesSecurityIdentifier]NTUSER.DAT em busca de programas recentes, documentos e atividade de navegador.