
ProfileHound - Raccoglitore OpenGraph di BloodHound per profili utente memorizzati su macchine di dominio. Prendi decisioni informate sul saccheggio di segreti identificando profili utente attivi sulle macchine di dominio.
____ _____ __ __ __ __
/ __ \_________ / __(_) /__ / / / /___ __ ______ ____/ /
/ /_/ / ___/ __ \/ /_/ / / _ \/ /_/ / __ \/ / / / __ \/ __ /
/ ____/ / / /_/ / __/ / / __/ __ / /_/ / /_/ / / / / /_/ /
/_/ /_/ \____/_/ /_/_/\___/_/ /_/\____/\__,_/_/ /_/\__,_/
ProfileHound è uno strumento post-elevazione progettato per aiutare a individuare e raggiungere obiettivi di red-teaming, localizzando i profili utente di dominio sulle macchine. Utilizza il formato OpenGraph di BloodHound per creare un nuovo arco chiamato HasUserProfile, che determina se un profilo utente esiste su un computer. Questo arco consente agli operatori di prendere decisioni informate su quali computer colpire per estrarre segreti.
Questo strumento richiede accesso amministrativo alla condivisione C$ sulle macchine target per enumerare i profili utente.
Un enorme ringraziamento a Remi Gascou (@podalirius) per i suoi strumenti ShareHound e bhopengraph. Volevo da tempo costruire uno strumento per raccogliere questi dati e l'uso di queste librerie mi ha permesso di concentrarmi sulla costruzione invece che sulla "plumbing".
[!WARNING] ProfileHound è in fase iniziale di sviluppo e non tutte le modalità di raccolta sono ancora implementate. Usare con cautela in ambienti di produzione; ci si assume il rischio dell'uso di questo strumento.
Gli obiettivi post-sfruttamento in Active Directory si sono spostati dai dati memorizzati on-premise verso applicazioni SaaS e il cloud. Per dimostrare il valore nella sicurezza offensiva, dobbiamo mostrare come l'accesso a questi servizi possa essere compromesso. In molti casi, questi servizi sono utilizzati solo da determinati gruppi o utenti, come HR, Finanza, ecc. In alcuni scenari, certe applicazioni SaaS possono essere accessibili solo da macchine specifiche.
L'arco HasSession di BloodHound è ottimo, ma è utile solo quando un utente ha effettuato l'accesso a una macchina. Se un utente non è loggato al momento della raccolta dati, può essere difficile trovare quale computer possa contenere segreti per facilitare un ulteriore sfruttamento. I profili utente possono contenere una quantità significativa di informazioni preziose all'interno di DPAPI, credenziali memorizzate nella cache, chiavi SSH, chiavi cloud e altro ancora – questi non richiedono una sessione utente attiva per essere accessibili.

ProfileHound utilizza il formato OpenGraph di BloodHound per costruire un nuovo arco nel grafo chiamato HasUserProfile, che determina se un profilo utente esiste su una macchina del dominio. Questo può aiutare gli operatori a concentrarsi sulle macchine dove un utente o un gruppo di alto valore ha un profilo.
L'arco HasUserProfile contiene proprietà per la data di creazione del profilo e la data dell'ultima modifica. Queste informazioni aiutano a determinare:

Questo arco ha anche proprietà per i timestamp di creazione e modifica del profilo, permettendo query Cypher specifiche per trovare profili utente attivi o di lunga durata su macchine specifiche.
Installa ProfileHound usando pipx (a meno che tu non ami l'inferno delle dipendenze):
pipx install profilehound
Per utilizzare la versione bleeding edge, puoi installare dal sorgente:
pipx install git+https://github.com/m4lwhere/profilehound.git
Per un approccio containerizzato, costruisci l'immagine ed esegui lo strumento con:
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
Ad esempio, per eseguire con un account di amministratore del dominio sccm.lab\alice con password 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
Questo ha creato un file chiamato profilehound_20251230-115805.json nella directory corrente. Questo file può essere importato direttamente in BHCE trascinandolo nell'interfaccia utente di BloodHound. Verrà automaticamente analizzato e correlato ai nodi tramite SID. Il nuovo arco HasUserProfile verrà creato per mostrare la relazione tra l'utente e il profilo.
ProfileHound stamperà inoltre un breve riepilogo statistico sulla console una volta completato:
╭───────────────────────── 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 │ Ha 3 profili, potenziale hub di movimento laterale │
│ MSSQL.sccm.lab │ 4.5 │ Ha 3 profili, potenziale hub di movimento laterale │
│ CLIENT.sccm.lab │ 3.5 │ Ha 2 profili, potenziale hub di movimento laterale │
│ DC.sccm.lab │ 1.0 │ Ha 1 profilo, potenziale hub di movimento laterale │
└─────────────────┴───────┴────────────────────────────────────────────────┘
ProfileHound utilizza la condivisione C$ per enumerare i profili utente su una macchina del dominio in \\<target>\C$\Users\. Legge il file NTUSER.DAT dell'utente per determinare se l'utente è un account di dominio o locale, recuperando il SID dai metadati del file. Ad esempio, raccoglie tutte le directory utente in \\<target>\C$\Users\ e poi itera su ciascuna directory per trovare il file NTUSER.DAT in \\<target>\C$\Users\<username>\NTUSER.DAT. Se il file NTUSER.DAT è di proprietà di un SID noto, cerca di trovare il SID dell'utente leggendo la sua directory DPAPI (es. \\<target>\C$\Users\<username>\AppData\Roaming\Microsoft\Protect\<SID>).
Poiché accediamo alla condivisione C$, abbiamo bisogno di un account amministrativo per autenticarci sulla macchina target. ProfileHound utilizzerà le credenziali fornite per autenticarsi. Se stai usando un account di dominio, puoi usare l'opzione --auth-domain per specificare il dominio. Se stai usando un account locale, puoi usare l'opzione --smb-local-auth.
Per impostazione predefinita, ProfileHound si ferma dopo un fallimento di autenticazione SMB di dominio per ridurre il rischio di blocco dell'account. Se alcuni endpoint dovessero rifiutare l'autenticazione di dominio e desideri continuare la scansione degli altri target, usa --smb-ignore-failed-domain-auth.
Se ProfileHound si ferma durante la raccolta dati SMB dopo aver già trovato dei profili, tenterà di esportare i risultati parziali di OpenGraph prima di uscire.
I timestamp di creazione e ultima modifica del file NTUSER.DAT vengono raccolti e possono essere utilizzati per determinare se il profilo è attivo. Questa correlazione viene gestita tramite query Cypher sulle proprietà dell'arco; esempi sotto.
È interessante notare che se il file NTUSER.DAT è stato modificato prima della data di creazione, è probabile che il profilo sia stato creato ma non utilizzato in modo tangibile. Questa condizione esiste perché il file NTUSER.DAT viene copiato dal profilo C:\Users\Default quando viene creato un nuovo profilo utente, mantenendo la stessa data di modifica anche se la data di creazione è successiva. Per questo motivo, possiamo essere ragionevolmente certi che quel profilo specifico non conterrà segreti.
ProfileHound utilizza la libreria ShareHound di @podalirius_ per enumerare i target. Se non vengono fornite opzioni --target o --target-file, ProfileHound enumera i target connettendosi a LDAP per raccogliere automaticamente tutti i nomi FQDN delle macchine nel dominio.
Ci sono molte conclusioni potenti che possiamo trarre da questi dati, che ci dicono dove concentrare la nostra attenzione. Tutte queste query possono essere importate in BloodHound trascinando il file ProfileHound_Cypher_Queries.zip nell'interfaccia utente di BloodHound usando il pulsante Importa nella pagina Query Salvate. Ecco alcuni esempi:
Questa è una query semplice che troverà tutti i profili utente nel grafo.
MATCH p=(u:User)-[:HasUserProfile]->(c:Computer)
RETURN p
Questa trova tutti i profili utente che sono membri del gruppo "Administrators" del dominio.
MATCH p=(g:Group)<-[:MemberOf*1..]-(u:User)-[:HasUserProfile]->(c:Computer)
WHERE toLower(g.samaccountname) = "administrators"
RETURN p
Questa trova tutti i profili utente che sono stati modificati negli ultimi 3 giorni. Aiuta a determinare dove un profilo utente potrebbe essere la macchina principale di un utente e contenere buon bottino.
WITH 3 as active_days
MATCH p = (u:User)-[e:HasUserProfile]-(c:Computer)
WHERE e.profileModified > (datetime().epochseconds - (active_days * 86400))
RETURN p
Questa è una query estremamente potente per localizzare profili utente specifici utilizzati negli ultimi 3 giorni per membri di un gruppo specifico.
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
Questa rimuove tutti i profili utente in cui il file NTUSER.DAT è stato modificato prima della data di creazione. Indica che il profilo è stato creato ma non utilizzato in modo tangibile. Questa condizione esiste perché il file NTUSER.DAT viene copiato dal profilo C:\Users\Default quando viene creato un nuovo profilo utente, mantenendo la stessa data di modifica anche se la data di creazione è successiva.
match p = (u:User)-[e:HasUserProfile]-(c:Computer)
where e.profileCreated < e.profileModified
return p
Semplicemente non sarebbe stato possibile senza le librerie ShareHound e bhopengraph di Remi Gascou (@podalirius).
L'obiettivo principale di questo strumento è determinare quali macchine hanno maggiori probabilità di contenere segreti per utenti specifici. I miglioramenti futuri includeranno:
get_lastlogon per creare archi HasUserProfile sulle macchine.get_puser per associare gli utenti di dominio come proprietari primari del dispositivo per macchine specifiche.AZDeviceOwner in .data.owners[owner.DeviceOwner.onPremisesSecurityIdentifier]NTUSER.DAT per programmi recenti, documenti e attività del browser.