المقدمة
في هذه المقالة ، سنلقي نظرة على مفهوم اختطاف DLL وكيف يمكن استخدامه لتحقيق استمرارية Userland على أنظمة Windows. تم وصف هذه الطريقة في MITER ATT & CK ضمن: "اعتراض ترتيب بحث DLL (T1038) ".
يمكن للمهاجمين استخدام انتحال DLL لأغراض عديدة مختلفة ، ولكن هذه المقالة ستركز على تحقيق المرونة مع تطبيقات بدء التشغيل التلقائي. على سبيل المثال ، منذ بدء تشغيل Slack و Microsoft Teams عند التمهيد (افتراضيًا) ، فإن انتحال DLL في أحد هذه التطبيقات سيسمح للمهاجمين بالحصول على وصول قوي إلى هدفهم - كلما قام المستخدم بتسجيل الدخول.
بعد تقديم مفهوم مكتبات DLL ، وترتيب بحث DLL ، وانتحال DLL ، سأوجهك خلال عملية أتمتة اكتشاف اعتراض DLL . ستتحدث هذه المقالة عن اكتشاف مسارات اعتراض DLL في Slack و Microsoft Teams و Visual Studio Code.
أخيرًا ، اكتشفت العديد من مسارات اعتراض DLL التي تستخدمها تطبيقات مختلفة ، وحققت في السبب الجذري ، ووجدت أن التطبيقات التي تستخدم بعض استدعاءات واجهة برمجة تطبيقات Windows تكون عرضة لاعتراض DLL عند عدم التشغيل من
C:\Windows\System32\
.
أود أن أشكر زميلي Josiah Massari (
@Airzero24
) لكونه أول من اكتشف بعض أدوات DLL هذه ، وشرح منهجيتها ، وألهمني لأتمتة عملية الاكتشاف.
ما هو ملف DLL؟
مكتبة الارتباط الديناميكي هي مكتبة تحتوي على تعليمات برمجية وبيانات يمكن استخدامها في نفس الوقت بواسطة أكثر من برنامج واحد. ( المصدر )
يمكن استخدام وظيفة DLL بواسطة تطبيق Windows باستخدام إحدى الوظائف
LoadLibrary*
. يمكن للتطبيقات الرجوع إلى مكتبات DLL المصممة خصيصًا لتلك التطبيقات ، أو Windows DLLs الموجودة بالفعل على القرص في System32. يمكن للمطورين تحميل ملفات DLL من System32 لاستخدام الوظائف التي تم تنفيذها بالفعل في Windows في تطبيقاتهم دون الحاجة إلى كتابة هذه الوظيفة من البداية.
على سبيل المثال ، يمكن للمطور الذي يحتاج إلى إجراء طلبات HTTP استخدام مكتبة WinHTTP (
winhttp.dll
) بدلاً من تنفيذ طلبات HTTP باستخدام مآخذ توصيل أولية.
ترتيب بحث DLL والاعتراض
نظرًا لوجود مكتبات DLL كملفات على القرص ، فقد تتساءل عن كيفية معرفة التطبيق من مكان تحميل DLL؟ قامت Microsoft بتوثيق ترتيب بحث DLL بالتفصيل هنا .
بدءًا من Windows XP SP2 ، يتم تمكين وضع البحث الآمن لـ DLL افتراضيًا (
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode
). مع تمكين الوضع الآمن ، يكون ترتيب بحث DLL هو:
- الدليل الذي تم تحميل التطبيق منه.
- دليل النظام. استخدم الدالة GetSystemDirectory للحصول على المسار إلى هذا الدليل.
- دليل نظام 16 بت. لا توجد وظيفة توفر مسارًا لهذا الدليل ، ولكن يتم البحث عنها.
- دليل Windows. استخدم الدالة GetWindowsDirectory للحصول على المسار إلى هذا الدليل.
- الدليل الحالي.
- , PATH. , , App Paths. App Paths DLL.
يمكن أن يحتوي النظام على إصدارات متعددة من نفس DLL. يمكن للتطبيقات التحكم في اختيار الموقع الذي يجب أن يتم تحميل DLL منه عن طريق تحديد المسار الكامل أو باستخدام آلية أخرى مثل البيان. ( المصدر )
إذا لم يحدد التطبيق مكان تحميل DLL منه ، يستخدم Windows ترتيب بحث DLL الافتراضي الموضح أعلاه. الموضع الأول في ترتيب بحث DLL (الدليل الذي تم تحميل التطبيق منه) يهم المهاجمين.
إذا كان مطور التطبيق يعتزم تحميل DLL من
C:\Windows\System32
، ولكن لم يكتبها بشكل صريح في التطبيق ، سيتم تحميل DLL الخبيثة الموضوعة في دليل التطبيق قبل DLL الشرعية من System32. يسمى تحميل ملف DLL ضار انتحال DLL (أو اعتراضه) ويستخدمه المهاجمون لتحميل تعليمات برمجية ضارة إلى تطبيقات موثوقة / موقعة.
استخدام DLL Spoofing لتحقيق المرونة
يمكن استخدام انتحال DLL لتحقيق المرونة عند بدء تشغيل تطبيق / خدمة ضعيفة ووضع DLL ضار في موقع ضعيف.
@Airzero24
اكتشف زميل لي انتحال DLL في Microsoft OneDrive و Microsoft Teams و Slack userenv.dll
.
كانت هذه البرامج هي التي أصبحت هدفًا للاعتراض ، لأنه يتم تكوينها افتراضيًا لبدء تشغيل Windows. يمكن رؤية ذلك أدناه في "إدارة المهام":
تطبيقات Windows التي تم تكوينها على التشغيل التلقائي
لاختبار انتحال DLL ، قمت بإنشاء محمل كود قشرة DLL الذي بدأ تشغيل Cobalt Strike Beacon. أعدت تسمية DLL الضار إلى
userenv.dll
دليل التطبيق المتأثر ونسخه. أطلقت التطبيق ورأيت رد الاتصال الجديد من بيكون.
منارة الكوبالت سترايك من خلال اعتراض DLL
باستخداممستكشف العمليات ، يمكنني التحقق مما إذا كان قد تم بالفعل تحميل DLL الضار بواسطة تطبيق ضعيف.
يعرض مستكشف العمليات DLL الضارة المحملة
الكشف التلقائي عن إمكانية اعتراض DLL
بعد التأكد من اختطاف DLL المعروف سابقًا ، كنت أرغب في معرفة ما إذا كان بإمكاني العثور على إمكانات انتحال DLL أخرى يمكن استغلالها.
يمكن العثور على الكود المستخدم في عملية الدفع الخاصة بي هنا .
باستخدام Slack كمثال
لبدء هذه العملية ، قمت بتشغيل Process Monitor (ProcMon) باستخدام عوامل التصفية التالية:
- اسم العملية -
slack.exe
- النتيجة تحتوي على
NOT FOUND
- ينتهي المسار بـ
.dll
.
البحث عن مكتبات DLL المفقودة في ProcMon.
ثم بدأت Slack وفحصت ProcMon بحثًا عن أي مكتبات DLL كان Slack يبحث عنها ولكن لم يتمكن من العثور عليها.
مسارات اعتراض DLL المحتملة التي اكتشفها ProcMon
لقد قمت بتصدير هذه البيانات من ProcMon كملف CSV لتسهيل التحليل في PowerShell.
باستخدام DLL مُحمل كود القشرة الحالي الخاص بي ، لم أستطع بسهولة معرفة أسماء DLL التي تم تحميلها بنجاح بواسطة Slack. لقد قمت بإنشاء DLL جديد ، والذي يتم استخدامه
GetModuleHandleEx
، GetModuleFileName
ولتحديد اسم DLL الذي تم تحميله وكتابته في ملف نصي .
كان هدفي التالي هو تحليل ملف CSV لمسارات DLL في القائمة ، وعرض تلك القائمة ، ونسخ اختبار DLL الخاص بي إلى المسار المحدد ، وبدء العملية المستهدفة ، وإيقاف العملية المستهدفة ، وحذف اختبار DLL. إذا تم تحميل اختبار DLL بنجاح ، فسوف يكتب اسمه إلى الملف الناتج.
عند انتهاء هذه العملية ، سيكون لدي قائمة بعمليات الاختطاف المحتملة لـ DLL (آمل) مكتوبة في ملف نصي.
كل السحر في مشروع DLLHijackTest الخاص بي يتم بواسطة برنامج نصي PowerShell . فهو يقبل المسار إلى ملف CSV الذي تم إنشاؤه بواسطة ProcMon ، والمسار إلى DLL الضار ، والمسار إلى العملية التي تريد تشغيلها ، وأي وسيطات تريد تمريرها إلى العملية.
Get-PotentialDLLHijack معلمات
Get-PotentialDLLHijack.ps1
بعد بضع دقائق ، أتحقق من الملف النصي المدرج في مكتبة الارتباط الديناميكي "الضارة" الخاصة بي بحثًا عن عمليات اختطاف DLL المحتملة. لقد وجدت مسارات الاعتراض المحتملة التالية لـ Slack:
PS C:Users\John\Desktop> Get-PotentialDLLHijack -CSVPath .\Logfile.CSV -MaliciousDLLPath .\DLLHijackTest.dll -ProcessPath "C:\Users\John\AppData\Local\slack\slack.exe"
C:\Users\John\AppData\Local\slack\app-4.6.0\WINSTA.dll
C:\Users\John\AppData\Local\slack\app-4.6.0\LINKINFO.dll
C:\Users\John\AppData\Local\slack\app-4.6.0\ntshrui.dll
C:\Users\John\AppData\Local\slack\app-4.6.0\srvcli.dll
C:\Users\John\AppData\Local\slack\app-4.6.0\cscapi.dll
C:\Users\John\AppData\Local\slack\app-4.6.0\KBDUS.DLL
استخدام Microsoft Teams كمثال
نقوم بتنفيذ العملية الموضحة أعلاه مرة أخرى:
- استخدم ProcMon لتحديد مسارات اعتراض DLL المحتملة ، وتصدير هذه البيانات كملف CSV.
- حدد المسار لبدء العملية.
- حدد أي حجج تريد تمريرها إلى العملية.
- اركض
Get-PotentialDLLHijack.ps1
مع الحجج المناسبة.
لقد وجدت مسارات الاعتراض المحتملة التالية لـ Microsoft Teams:
PS C:Users\John\Desktop> Get-PotentialDLLHijack -CSVPath .\Logfile.CSV -MaliciousDLLPath .\DLLHijackTest.dll -ProcessPath "C:\Users\John\AppData\Local\Microsoft\Teams\Update.exe" -ProcessArguments '--processStart "Teams.exe"'
C:\Users\John\AppData\Local\Microsoft\Teams\current\WINSTA.dll
C:\Users\John\AppData\Local\Microsoft\Teams\current\LINKINFO.dll
C:\Users\John\AppData\Local\Microsoft\Teams\current\ntshrui.dll
C:\Users\John\AppData\Local\Microsoft\Teams\current\srvcli.dll
C:\Users\John\AppData\Local\Microsoft\Teams\current\cscapi.dll
C:\Users\John\AppData\Local\Microsoft\Teams\current\WindowsCodecs.dll
C:\Users\John\AppData\Local\Microsoft\Teams\current\TextInputFramework.dll
ملاحظة : اضطررت إلى إجراء تغييرات صغيرة على برنامج PowerShell النصي لإكمالهTeams.exe
، حيث يحاول البرنامج النصي إنهاء العملية التي كان يحاول بدءها ، في هذه الحالة هو كذلكUpdate.exe
.
استخدام Visual Studio Code كمثال
بتكرار العملية المذكورة أعلاه ، وجدت مسارات الاعتراض المحتملة التالية لـ Visual Studio Code:
PS C:Users\John\Desktop> Get-PotentialDLLHijack -CSVPath .\Logfile.CSV -MaliciousDLLPath .\DLLHijackTest.dll -ProcessPath "C:\Users\John\AppData\Local\Programs\Microsoft VS Code\Code.exe"
C:\Users\John\AppData\Local\Programs\Microsoft VS Code\WINSTA.dll
C:\Users\John\AppData\Local\Programs\Microsoft VS Code\LINKINFO.dll
C:\Users\John\AppData\Local\Programs\Microsoft VS Code\ntshrui.dll
C:\Users\John\AppData\Local\Programs\Microsoft VS Code\srvcli.dll
C:\Users\John\AppData\Local\Programs\Microsoft VS Code\cscapi.dll
مشاركة ملفات DLL
لقد لاحظت أن Slack و Microsoft Teams و Visual Studio Code يشتركان في مكتبات DLL التالية:
WINSTA.dll
LINKINFO.dll
ntshrui.dll
srvcli.dll
cscapi.dll
لقد وجدت هذا مثيرًا للاهتمام وأردت أن أفهم أسباب هذا السلوك.
المنهجية: فهم طرق اعتراض مكتبات DLL المشتركة
شاهدت تريسي كومة عندما التهاون حاولت تحميل
WINSTA.dll
، LINKINFO.dll
، ntshrui.dll
، srvcli.dll
و cscapi.dll
.
DLL مع تحميل كسول
لاحظت التشابه في تريسي كومة عند تحميل
WINSTA.dll
، LINKINFO.dll
، ntshrui.dll
و srvcli.dll
.
تتبع المكدس عندما يحاول Code.exe تحميل
WINSTA.dll
تتبع المكدس عند
Teams.exe
محاولة التحميل LINKINFO.dll
،
تتبع المكدس عندما يحاول Slack تحميل
ntshrui.dll
تتبع المكدس يحتوي باستمرار على مكالمة
_tailMerge_<
dllname>_dll
، delayLoadHelper2
متبوعة LdrResolveDelayLoadedAPI
. كان هذا السلوك هو نفسه لجميع التطبيقات الثلاثة.
لقد قررت أن هذا السلوك مرتبط بتحميل DLL البطيء . من كومة التتبع في التمهيد
WINSTA.dll
استطعت أن أرى أن الوحدة المسؤولة عن هذا التحميل البطيء كانت wtsapi32.dll
.
فتحت
wtsapi32.dll
في Ghidra واستخدمت Search -> For Strings -> Filter: WINSTA.dll
. انقر نقرًا مزدوجًا على السطر الموجود سينقلك إلى موقعه في الذاكرة.
السطر "
WINSTA.dll
" فيwtsapi32.dll
بالنقر بزر الماوس الأيمن على موقع في الذاكرة ، يمكننا العثور على أي مراجع لهذا العنوان.
روابط
WINSTA.dll
لاتباع الروابط ، يمكننا أن نرى أن السلسلة
WINSTA.dll
يتم تمريرها إلى بنية باسم ImgDelayDescr
. بالنظر إلى وثائق هذه البنية ، يمكننا التأكد من أنها مرتبطة بتحميل DLL البطيء.
typedef struct ImgDelayDescr {
DWORD grAttrs; //
RVA rvaDLLName; // RVA dll
RVA rvaHmod; // RVA
RVA rvaIAT; // RVA IAT
RVA rvaINT; // RVA INT
RVA rvaBoundIAT; // RVA IAT
RVA rvaUnloadIAT; // RVA IAT
DWORD dwTimeStamp; // 0, ,
// O.W. / DLL, (Old BIND)
} ImgDelayDescr, * PImgDelayDescr;
يمكن تمرير هذه البنية إلى
__delayLoadHelper2
، والتي ستستخدم LoadLibrary
/ GetProcAddress
لتحميل DLL المحدد وإصلاح عنوان الوظيفة المستوردة في جدول عناوين استيراد التحميل البطيء (IAT).
FARPROC WINAPI __delayLoadHelper2(
PCImgDelayDescr pidd, // ImgDelayDescr
FARPROC * ppfnIATEntry // IAT
);
من خلال إيجاد مراجع أخرى لهيكلنا
ImgDelayDescr
، يمكننا العثور على مكالمة تستدعي __delayLoadHelper2
بعد ذلك ResolveDelayLoadedAPI
. لقد أعدت تسمية اسم الوظيفة وأنواعها ومتغيراتها لتسهيل فهمها.
__delayLoadHelper2
وفي ResolveDelayLoadedAPI
Ghidra
Excellent! هذا يتوافق مع ما رأيناه في تتبع مكدس ProcMon الخاص بنا عندما حاول Slack التحميل
WINSTA.dll
.
__delayLoadHelper2
وفي ResolveDelayLoadedAPI
ProcMon.
وكان هذا السلوك بشكل موحد ل
WINSTA.dll
، LINKINFO.dll
، ntshrui.dll
و srvcli.dll
. كان الاختلاف الرئيسي بين كل DLL ذات التحميل البطيء هو DLL "الأصل". في جميع التطبيقات الثلاثة:
wtsapi32.dll
تحميل مؤجلWINSTA.dll
shell32.dll
تحميل كسولLINKINFO.dll
LINKINFO.dll
تحميل مؤجلntshrui.dll
ntshrui.dll
تحميل مؤجلsrvcli.dll
هل لاحظت أي شيء مثير للاهتمام؟ يبدو أنه
shell32.dll
التنزيلات LINKINFO.dll
، التي التنزيلات ntshrui.dll
، مما أخيرا التنزيلات srvcli.dll
. يقودنا هذا إلى آخر خيار شائع محتمل لانتحال DLL - cscapi.dll
.
استبدال DLL في NetShareGetInfo و NetShareEnum
لقد اتبعت تتبع المكدس عندما حاول Slack التحميل
cscapi.dll
ورأيت مكالمة LoadLibraryExW
جاءت على ما يبدو srvcli.dll
.
فتحت
تتبع المكدس عند التمهيد
cscapi.dll
في Ghidra واستخدمته . يؤدي النقر المزدوج على السطر الموجود واتباع الروابط إلى المكالمة المتوقعة . يستدعي LoadLibrary لإعادة
تسمية الوظيفة التي تحتوي على المكالمة واتباع الروابط ، حصلت على مكانين حيث يتم استخدام الوظيفة:
srvcli.dll
Search -> For Strings -> Filter: cscapi.dll
LoadLibrary
srvcli.dll
cscapi.dll
LoadLibrary
NetShareEnum التنزيلات cscapi.dll
NetShareGetInfo التنزيلات
cscapi.dll
راجعت هذا مع برامج اضغط لتتحدث الذي دعا
NetShareEnum
و NetShareGetInfo
:
NetShareEnum.exe
تنزيل cscapi.dll
NetShareGetInfo.exe
تنزيلcscapi.dll
النتائج
تتوفر مسارات انتحال DLL التالية في Slack:
C:\Users\John\AppData\Local\slack\app-4.6.0\WINSTA.dll
C:\Users\John\AppData\Local\slack\app-4.6.0\LINKINFO.dll
C:\Users\John\AppData\Local\slack\app-4.6.0\ntshrui.dll
C:\Users\John\AppData\Local\slack\app-4.6.0\srvcli.dll
C:\Users\John\AppData\Local\slack\app-4.6.0\cscapi.dll
C:\Users\John\AppData\Local\slack\app-4.6.0\KBDUS.DLL
تتوفر مسارات انتحال DLL التالية في Microsoft Teams:
C:\Users\John\AppData\Local\Microsoft\Teams\current\WINSTA.dll
C:\Users\John\AppData\Local\Microsoft\Teams\current\LINKINFO.dll
C:\Users\John\AppData\Local\Microsoft\Teams\current\ntshrui.dll
C:\Users\John\AppData\Local\Microsoft\Teams\current\srvcli.dll
C:\Users\John\AppData\Local\Microsoft\Teams\current\cscapi.dll
C:\Users\John\AppData\Local\Microsoft\Teams\current\WindowsCodecs.dll
C:\Users\John\AppData\Local\Microsoft\Teams\current\TextInputFramework.dll
تتوفر مسارات انتحال DLL التالية في Visual Studio Code:
C:\Users\John\AppData\Local\Programs\Microsoft VS Code\WINSTA.dll
C:\Users\John\AppData\Local\Programs\Microsoft VS Code\LINKINFO.dll
C:\Users\John\AppData\Local\Programs\Microsoft VS Code\ntshrui.dll
C:\Users\John\AppData\Local\Programs\Microsoft VS Code\srvcli.dll
C:\Users\John\AppData\Local\Programs\Microsoft VS Code\cscapi.dll
وبالإضافة إلى ذلك، وجدت أن البرامج التي تستخدم
NetShareEnum
و NetShareGetInfo
توفر القدرة على استبدال دلس في شكل cscapi.dll
بسبب الدعوة الثابت تلوينها LoadLibrary
. لقد تحققت من هذا السلوك مع Ghidra و PoC.
خاتمة
للتذكير ، اعتراض DLL هو طريقة يمكن للمهاجمين من خلالها التدخل في تنفيذ التعليمات البرمجية في التطبيقات الموقعة / الموثوقة. لقد قمت بإنشاء أدوات للمساعدة في أتمتة اكتشاف مسار اعتراض DLL. باستخدام هذه الأداة ، اكتشفت مسارات اعتراض DLL في Slack و Microsoft Teams و Visual Studio Code.
لقد لاحظت أن مسارات اعتراض DLL لهذه التطبيقات الثلاثة تتداخل وتحقق في السبب. سلطت الضوء على طريقة فهمي لهذه المصادفة. لقد تعلمت عن التحميل البطيء لملفات DLL واكتشفت استدعائين لواجهة برمجة التطبيقات التي تجعل من الممكن اعتراض مكتبات DLL في أي برنامج يستدعيها:
NetShareEnum
الأحمالcscapi.dll
NetShareGetInfo
الأحمالcscapi.dll
نشكرك على الوقت الذي أمضيته في قراءة هذه المقالة ، وآمل أن تكون قد تعلمت شيئًا أو شيئين حول واجهات برمجة تطبيقات Windows و Ghidra و ProcMon و DLLs و DLL اعتراض!
الروابط
مرحبًا كبيرًا بزملائي Daniel Heinsen (
@hotnops
) و Lee Christensen ( @tifkin_
) و Matt Hand ( @matterpreter
) للمساعدة في Ghidra / ProcMon!
التحقق من PoCs العامة لاستخدامها في pentesting