
استعلام LDAP بدون المتاعب
تم كتابة هذه الأداة لمعالجة العديد من المشكلات التي واجهتها مع ldapsearch والتفاعل مع Active Directory بشكل عام. على وجه الخصوص، تعالج هذه الأداة المشكلات التالية التي واجهتها:
عدم القدرة على إرجاع أكثر من ألف نتيجة من AD. تدعم هذه الأداة ترقيم سجلات LDAP وتعمل حول أخطاء AD الأخرى للسماح باسترجاع عدد عشوائي من السجلات.
عدم القدرة على استخدام بيانات اعتماد NTLM بطريقة بديهية للمصادقة. يمكنك تقديم اسم مجال NETBIOS واسم المستخدم وكلمة المرور للمصادقة على وحدة تحكم مجال Windows.
عدم القدرة على التحكم بدقة في عدد السجلات التي يتم إرجاعها، والسرعة التي يتم إرجاعها بها، وعدد السجلات المسحوبة في المرة الواحدة. تسمح لك هذه الأداة بالتحكم في كل هذه العناصر، بما في ذلك إضافة تأخيرات بين كل استدعاء مرقم. بالإضافة إلى ذلك، يمكن تحديد وحدات تحكم مجال متعددة للاستعلام بالتناوب.
عدم القدرة على إرجاع النتائج بأشكال سهلة الهضم. تدعم هذه الأداة حالياً ثلاثة تنسيقات:
عدم القدرة على إرجاع السمات التي تهمك فقط. تتيح لك هذه الأداة إما إرجاع جميع السمات، أو إرجاع السمات التي تريدها فقط.
عدم القدرة على حفظ قائمة من الاستعلامات شائعة الاستخدام والمجهزة مسبقاً.
git clone ...
pip install -r requirements.txt
# python3 ldapper.py
usage: ldapper.py [-h] --domain DOMAIN --user USER --password PASSWORD
--server SERVER [--basedn BASEDN] --search SEARCH
[--maxrecords MAXRECORDS] [--pagesize PAGESIZE]
[--delay DELAY] [--format {plain,json,json_tiny}]
[--encryption {1,2,3}]
[--advanced [ADVANCED [ADVANCED ...]]] [--outfile OUTFILE]
[--engine {ldap3,impacket}]
[attribute [attribute ...]]
بحث سطر أوامر AD LDAP الذي لا يعاني من المشاكل.
الوسائط الموضعية:
attribute السمات المراد إرجاعها (الافتراضي هو الكل للاستعلام المخصص. للاستعلامات الجاهزة، مرر "*" للحصول على جميع السمات بدلاً من الافتراضية)
الوسائط الاختيارية:
-h, --help إظهار رسالة المساعدة هذه والخروج
--domain DOMAIN, -D DOMAIN
المجال
--user USER, -U USER اسم المستخدم
--password PASSWORD, -P PASSWORD
كلمة المرور أو تجزئة بصيغة LM:NTLM
--server SERVER, -S SERVER
عنوان IP أو اسم قابل للحل لوحدة تحكم المجال
--basedn BASEDN, -b BASEDN
يجب أن يكون DN الأساسي عادةً "dc="، متبوعاً باسم المجال الطويل مع استبدال النقاط بـ ",dc=". سيحاول اشتقاقه إذا لم يتم توفيره من خادم LDAP.
--search SEARCH, -s SEARCH
سلسلة بحث LDAP أو رقم يشير إلى بحث مخصص من قائمة "عمليات البحث المخصصة". استخدم "-" للقراءة من الإدخال القياسي.
--maxrecords MAXRECORDS, -m MAXRECORDS
الحد الأقصى للسجلات المراد إرجاعها (الافتراضي هو 100)، 0 يعني الكل.
--pagesize PAGESIZE, -p PAGESIZE
عدد السجلات المراد إرجاعها في كل سحب (الافتراضي هو 10). يجب أن يكون <= الحد الأقصى للسجلات.
--delay DELAY, -d DELAY
تأخير بالمللي ثانية بين طلبات الترقيم (الافتراضي هو 0).
--format {plain,json,json_tiny}, -f {plain,json,json_tiny}
تنسيق الإخراج (الافتراضي هو "plain")، يمكن أن يكون: plain, json, json_tiny
--encryption {1,2,3}, -n {1,2,3}
3) الاتصال بـ 636 TLS (الافتراضي)؛ 2) الاتصال بـ 389 بدون TLS، ولكن محاولة STARTTLS والتراجع حسب الحاجة (غير متاح مع impacket)؛ 1) الاتصال بـ 389، فرض النص العادي
--advanced [ADVANCED [ADVANCED ...]], -a [ADVANCED [ADVANCED ...]]
طريقة متقدمة لتمرير الخيارات لعمليات البحث الجاهزة التي تطلب إدخالاً إضافياً (للطلبات المتعددة، مرر الوسيطة بترتيب الطلب)
--outfile OUTFILE, -o OUTFILE
ملف الإخراج (إذا تم تحديده، سيتم توجيه الإخراج إلى هنا بدلاً من الإخراج القياسي [يمكن أن يمنع أخطاء الترميز في Windows])
--engine {ldap3,impacket}, -e {ldap3,impacket}
اختر المحرك لاستخدامه (الافتراضي هو "ldap3"). راجع ملاحظات OPSEC!
عمليات البحث المخصصة:
1) الحصول على جميع المستخدمين
1.1) الحصول على مستخدم محدد (سيُطلب منك اسم المستخدم)
2) الحصول على جميع المجموعات (وأعضائها)
2.1) الحصول على مجموعة محددة (سيُطلب منك اسم المجموعة)
3) الحصول على جميع الطابعات
4) الحصول على جميع أجهزة الكمبيوتر
4.1) الحصول على جهاز كمبيوتر محدد (سيُطلب منك اسم الكمبيوتر)
5) الحصول على مسؤولي المجال/المؤسسة
6) الحصول على علاقات الثقة بالمجال
7) البحث عن تفويضات SPN غير المقيدة (احتمال تصعيد الامتيازات)
8) البحث عن الحسابات التي لا تتطلب المصادقة المسبقة. (ASREPROAST)
9) البحث عن SPNs للمستخدم (KERBEROAST)
9.1) البحث عن SPN محدد للمستخدم (سيُطلب منك اسم المستخدم الرئيسي)
10) إظهار جميع كلمات مرور LAPS LA (التي يمكنك رؤيتها)
10.1) البحث عن كلمة مرور LAPS لمحطة عمل محددة (سيُطلب منك اسم محطة العمل)
*11) البحث عن سمات كلمة المرور النصية الشائعة (UserPassword, UnixUserPassword, unicodePwd, و msSFU30Password)
12) إظهار جميع بذور العامل الثاني لـ Quest (إذا كان لديك وصول)
13) تجزئة كلمة مرور SSO لـ Oracle "orclCommonAttribute"
*14) تجزئة كلمة مرور SSO لـ Oracle "userPassword"
15) الحصول على خوادم SCCM
16) البحث عن الحسابات التي لا تتطلب كلمة مرور. (PasswordNotRequired)
العناصر المميزة بنجمة لم يتم اختبارها مطلقاً في بيئة يمكن التحقق منها، لذا يُرجى إبلاغي إذا كانت تعمل.
لأغراض هذه الأمثلة، افترض ما يلي:
اسم NETBIOS: EMP
اسم المجال الكامل: EXAMPLE.LOCAL
عناوين IP لوحدة التحكم بالمجال: 10.0.0.2, 10.0.0.3
اسم المستخدم: bob
كلمة المرور: password
استرداد جميع السجلات وإرجاع سمة cn فقط:
python ldapper.py -D 'EMP' -U 'bob' -P 'password' -S '10.0.0.2,10.0.0.3' -m 0 -s '(cn=*)' cn
استرداد تفاصيل عن مستخدم معين (سيُطلب منك اسم المستخدم):
python ldapper.py -D 'EMP' -U 'bob' -P 'password' -S '10.0.0.2,10.0.0.3' -m 0 -s '1.1'
استرداد تفاصيل عن مستخدم معين (مرر اسم المستخدم لتجنب الطلب):
python ldapper.py -D 'EMP' -U 'bob' -P 'password' -S '10.0.0.2,10.0.0.3' -m 0 -s '1.1' -a 'alice'
استرداد أول 100 SPN Kerberos للمستخدم، بما لا يزيد عن خمسة في المرة الواحدة، مع ثانيتين بين كل طلب صفحة بتنسيق JSON مضغوط:
python ldapper.py -D 'EMP' -U 'bob' -P 'password' -S '10.0.0.2,10.0.0.3' -m 100 -p 5 -d 2000 -f json_tiny -s '(&(objectcategory=user)(serviceprincipalname=*))' serviceprincipalname userprincipalname
استرداد جميع السجلات يدوياً للطابعات وإظهار جميع السمات ذات الصلة:
python ldapper.py -D 'EMP' -U 'bob' -P 'password' -S '10.0.0.2,10.0.0.3' -m 0 -s '(objectClass=printQueue)'
البحث عن تفويضات SPN غير المقيدة بدون أي جهد:
python ldapper.py -D 'EMP' -U 'bob' -P 'password' -S '10.0.0.2,10.0.0.3' -m 0 -s 4
عند استخدام محرك Impacket وعدم توفير baseDN، ستقوم الأداة بمحاولة مصادقة SMB والاتصال بوحدة تحكم المجال للحصول على اسم NETBIOS للمجال، لاشتقاق baseDN. قد يؤدي هذا السلوك إلى اكتشاف في بيئة حساسة للغاية. إما لا تستخدم Impacket في مثل هذه البيئة، أو حدد دائماً baseDN.
سيقوم Impacket إما بإجراء اتصال LDAPS كامل أو اتصال غير مشفر بالكامل. لا يمكنه استخدام STARTTLS في الوقت الحالي، لذا إذا كان سيتم اكتشاف اتصال LDAP نصي، فإما أن تحاول فقط اتصال TLS كامل أو لا تستخدم محرك Impacket.
لا يوفر Impacket القدر الأكبر من التحكم في سرعة سحب السجلات. لذلك، فإن خيار "--delay" منفذ جزئياً فقط. إذا كان تأخير سحب السجلات أمراً بالغ الأهمية، فلا تستخدم محرك Impacket.
Kerberoast: https://adsecurity.org/?p=2293
ASREPRoast: http://www.harmj0y.net/blog/activedirectory/roasting-as-reps/
إساءة استخدام التفويض غير المقيد: http://www.harmj0y.net/blog/activedirectory/the-most-dangerous-user-right-you-probably-have-never-heard-of/
هراء Oracle: https://blogs.oracle.com/mwilcox/entry/clarifying_ovd-ad_eus_password و http://onlineappsdba.com/index.php/2014/03/03/what-hashing-algorithm-oid-uses-to-store-user-password-ssha-or-md5/
بيانات رمز العامل الثاني لـ Qwest/Defender/Oneidentity: http://support-public.cfm.quest.com/43565_Defender_5.9_AdminGuide.pdf
كلمات المرور النصية الشائعة: https://www.blackhillsinfosec.com/domain-goodness-learned-love-ad-explorer/
إضافة Impacket كبديل لـ LDAP3 لأن LDAP3 لا يعمل دائماً (وكذلك Impacket لا يعمل دائماً).
إزالة تحديد خادم LDAP متعدد لأن هذه الميزة ليست ضرورية حقاً، ولا توجد فعلياً في Impacket.
إعادة هيكلة كل شيء.
إضافة ميزة البحث في SCCM.
إضافة خيار ملف الإخراج.
إصلاح بعض الأمور في تنسيق الإخراج.
إضافة القدرة على أخذ استعلام LDAP من الإدخال القياسي.
لف الاستعلام تلقائياً بين قوسين إذا لم يقم المستخدم بذلك بالفعل.
إصلاح خطأ دعم Python 2.
إذا كان لديك بعض عمليات البحث الشائعة التي تستخدمها، فأخبرني بها حتى أتمكن من إضافتها إلى القائمة.
...
كتابة: Shelby Spencer (shellster). اتصل بي للأخطاء أو طلبات الميزات.