
ProfileHound - BloodHound OpenGraph संग्राहक डोमेन मशीनों पर संग्रहीत उपयोगकर्ता प्रोफ़ाइल के लिए। डोमेन मशीनों पर सक्रिय उपयोगकर्ता प्रोफ़ाइल की पहचान करके गुप्त जानकारी चुराने के बारे में सूचित निर्णय लें।
____ _____ __ __ __ __
/ __ \_________ / __(_) /__ / / / /___ __ ______ ____/ /
/ /_/ / ___/ __ \/ /_/ / / _ \/ /_/ / __ \/ / / / __ \/ __ /
/ ____/ / / /_/ / __/ / / __/ __ / /_/ / /_/ / / / / /_/ /
/_/ /_/ \____/_/ /_/_/\___/_/ /_/\____/\__,_/_/ /_/\__,_/
ProfileHound एक पोस्ट-एस्केलेशन टूल है जो मशीनों पर डोमेन उपयोगकर्ता प्रोफ़ाइल ढूंढकर रेड-टीमिंग उद्देश्यों को प्राप्त करने में मदद करता है। यह BloodHound OpenGraph प्रारूप का उपयोग करके HasUserProfile नामक एक नया किनारा (edge) बनाता है जो यह निर्धारित करता है कि किसी कंप्यूटर पर उपयोगकर्ता प्रोफ़ाइल मौजूद है या नहीं। यह किनारा ऑपरेटरों को इस बारे में सूचित निर्णय लेने की अनुमति देता है कि रहस्यों की खोज के लिए किन कंप्यूटरों को लक्षित किया जाए।
इस टूल को लक्ष्य मशीनों पर उपयोगकर्ता प्रोफ़ाइलों की गणना करने के लिए 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
उदाहरण के लिए, पासवर्ड whiteRabbit के साथ डोमेन व्यवस्थापक खाते sccm.lab\alice का उपयोग करके चलाने के लिए:
$ 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$ शेयर का उपयोग करके \\<target>\C$\Users\ पर डोमेन मशीन पर उपयोगकर्ता प्रोफ़ाइलों की गणना करता है। यह फ़ाइल मेटाडेटा से SID प्राप्त करके यह निर्धारित करने के लिए उपयोगकर्ता के NTUSER.DAT फ़ाइल को पढ़ता है कि उपयोगकर्ता डोमेन खाता है या स्थानीय खाता। उदाहरण के लिए, यह \\<target>\C$\Users\ पर सभी उपयोगकर्ता निर्देशिकाएँ एकत्र करेगा और फिर \\<target>\C$\Users\<username>\NTUSER.DAT पर NTUSER.DAT फ़ाइल खोजने के लिए प्रत्येक निर्देशिका पर लूप करेगा। यदि NTUSER.DAT फ़ाइल किसी ज्ञात SID के स्वामित्व में है, तो यह उपयोगकर्ता के DPAPI निर्देशिका (जैसे \\<target>\C$\Users\<username>\AppData\Roaming\Microsoft\Protect\<SID>) को पढ़कर उपयोगकर्ता का 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 लक्ष्यों की गणना करने के लिए @podalirius_ के ShareHound को लाइब्रेरी के रूप में उपयोग करता है। यदि --target या --target-file विकल्प प्रदान नहीं किए गए हैं, तो ProfileHound डोमेन में सभी मशीन FQDN स्वचालित रूप से एकत्र करने के लिए LDAP से कनेक्ट करके लक्ष्यों की गणना करेगा।
इस डेटा से हम कई शक्तिशाली निष्कर्ष निकाल सकते हैं, जो हमें बताते हैं कि हमें अपना ध्यान कहाँ केंद्रित करना चाहिए। इन सभी प्रश्नों को BloodHound UI पर Saved Queries पृष्ठ पर Import बटन का उपयोग करके ProfileHound_Cypher_Queries.zip फ़ाइल खींचकर और छोड़ कर BloodHound में आयात किया जा सकता है। यहाँ कुछ उदाहरण दिए गए हैं:
यह एक सरल क्वेरी है जो ग्राफ़ में सभी उपयोगकर्ता प्रोफ़ाइल ढूंढेगी।
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 लाइब्रेरी के बिना संभव नहीं होता।
इस टूल का ध्यान यह निर्धारित करने पर है कि किन मशीनों में विशिष्ट उपयोगकर्ताओं के लिए रहस्य होने की सबसे अधिक संभावना है। भविष्य के सुधारों में शामिल होंगे:
HasUserProfile किनारे बनाने के लिए get_lastlogon फ़ंक्शन का उपयोग करना।get_puser फ़ंक्शन का उपयोग करना।.data.owners[owner.DeviceOwner.onPremisesSecurityIdentifier] पर AZDeviceOwner ऑब्जेक्ट के रूप में एकत्र किया हुआ प्रतीत होता है।NTUSER.DAT