أتمتة الكشف عن مسارات اعتراض DLL المحتملة (DLL Hijacks)

مرحبا خابروفيتس. التجنيد للتيار الجديد من الدورة "Pentest. ممارسة اختبار الاختراق " . تحسبا لبدء الدورة ، نشارككم ترجمة المواد الشيقة.







المقدمة



في هذه المقالة ، سنلقي نظرة على مفهوم اختطاف 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 هو:



  1. الدليل الذي تم تحميل التطبيق منه.
  2. دليل النظام. استخدم الدالة GetSystemDirectory للحصول على المسار إلى هذا الدليل.
  3. دليل نظام 16 بت. لا توجد وظيفة توفر مسارًا لهذا الدليل ، ولكن يتم البحث عنها.
  4. دليل Windows. استخدم الدالة GetWindowsDirectory للحصول على المسار إلى هذا الدليل.
  5. الدليل الحالي.
  6. , 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 كمثال



نقوم بتنفيذ العملية الموضحة أعلاه مرة أخرى:



  1. استخدم ProcMon لتحديد مسارات اعتراض DLL المحتملة ، وتصدير هذه البيانات كملف CSV.
  2. حدد المسار لبدء العملية.
  3. حدد أي حجج تريد تمريرها إلى العملية.
  4. اركض 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وفي ResolveDelayLoadedAPIGhidra



Excellent! هذا يتوافق مع ما رأيناه في تتبع مكدس ProcMon الخاص بنا عندما حاول Slack التحميل WINSTA.dll.





__delayLoadHelper2 وفي ResolveDelayLoadedAPIProcMon.



وكان هذا السلوك بشكل موحد ل 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.dllSearch -> For Strings -> Filter: cscapi.dllLoadLibrary





srvcli.dllcscapi.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






اقرأ أكثر:






All Articles