
ProfileHound - جامع BloodHound OpenGraph لملفات تعريف المستخدمين المخزنة على أجهزة المجال. اتخذ قرارات مستنيرة بشأن نهب الأسرار من خلال تحديد ملفات تعريف المستخدمين النشطة على أجهزة المجال.
____ _____ __ __ __ __
/ __ \_________ / __(_) /__ / / / /___ __ ______ ____/ /
/ /_/ / ___/ __ \/ /_/ / / _ \/ /_/ / __ \/ / / / __ \/ __ /
/ ____/ / / /_/ / __/ / / __/ __ / /_/ / /_/ / / / / /_/ /
/_/ /_/ \____/_/ /_/_/\___/_/ /_/\____/\__,_/_/ /_/\__,_/
ProfileHound هي أداة ما بعد تصعيد الصلاحيات تساعد في العثور على أهداف عمليات الفريق الأحمر وتحقيقها من خلال تحديد ملفات تعريف المستخدمين في المجال على الأجهزة. تستخدم تنسيق BloodHound OpenGraph لإنشاء حافة جديدة تُسمى HasUserProfile تحدد ما إذا كان ملف تعريف مستخدم موجودًا على حاسوب معين. تتيح هذه الحافة للمشغّلين اتخاذ قرارات مستنيرة بشأن الأجهزة التي يجب استهدافها لسرقة الأسرار.
تتطلب هذه الأداة وصولًا إداريًا إلى مشاركة C$ على الأجهزة المستهدفة لتعداد ملفات تعريف المستخدمين.
شكرٌ كبير لـ Remi Gascou (@podalirius) على أداتي ShareHound و bhopengraph. لقد رغبت منذ فترة في بناء أداة لجمع هذه البيانات، واستخدام هذه المكتبات سمح لي بالتركيز على البناء بدلاً من الانشغال بالتفاصيل الداخلية.
[!WARNING] ProfileHound في مراحل تطوير مبكرة ولا تتوفر فيها جميع أوضاع الجمع بعد. استخدمها بحذر في بيئات الإنتاج، وتتحمل أنت مسؤولية المخاطر الناتجة عن استخدام هذه الأداة.
تحولت أهداف ما بعد الاستغلال في Active Directory من البيانات المخزنة محليًا إلى تطبيقات SaaS والسحابة. ولإثبات القيمة في مجال الأمن الهجومي (offsec)، نحتاج إلى إظهار كيفية اختراق الوصول إلى هذه الخدمات. في كثير من الحالات، لا تُستخدم هذه الخدمات إلا من قبل مجموعات أو مستخدمين معينين، مثل الموارد البشرية والمالية وغيرها. في بعض السيناريوهات، لا يمكن الوصول إلى تطبيقات 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 معروف، فستحاول العثور على 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 للبرامج والمستندات ونشاط المتصفح الحديث.