السلام عليكم ورحمة الله تعالى أعزائي متابعين مجتمع GGHTeam قررنا نسوي فكرة جديدة اننا نترجم كتاب OSEP على شكل مقالات ونرتبها لكم
بحيث تكون مرجع لكم بأي وقت أتمنى ان ينال هذا العمل أعجباكم هي بنا فلنبدأ
:)
1 - Evasion Techniques and Breaching Defenses: General Course
information | معلومات عامة عن الكورس
مرحبًا بكم في دورة تقنيات التهرب والدفاعات ضد القرصنة (PEN-300)!
تم إنشاء PEN-300 لمحترفي الأمن الذين لديهم بالفعل بعض الخبرة في تقنيات
الهجوم واختبار القرصنة.
ستساعدك هذه الدورة على تطوير المهارات والمعرفة لتجاوز العديد من أنواع
الدفاعات المختلفة أثناء تنفيذ أنواع متقدمة من الهجمات , نظرًا لأن هدف هذه
الدورة هو تعليم تقنيات الهجوم التي تعمل ضد المنظمات العميلة ذات الأنظمة
المحصنة، نتوقع من الطلاب أن يكونوا قد أخذوا دورة PWK1 ونجحوا في امتحان
OSCP أو أن يكون لديهم معرفة ومهارات معادلة.
1.1 About The PEN-300 Course
| حول كورس PEN-300
قبل الخوض في المواد المتعلقة بالدورة، من المهم قضاء بضع لحظات في المصطلحات
الأساسية. يستخدم متخصصو تكنولوجيا المعلومات وأمن المعلومات مصطلحات مختلفة
للعمليات الهجومية والهجمات. لتجنب الارتباك، سنقوم بتعريف بعض المصطلحات
الرئيسية كما نفهمها وكما تنطبق على هذه الدورة.
اختبار القرصنة هو تفاعل بين منظمة العميل ومختبر القرصنة , أثناء هذه العملية، سيقوم مختبر القرصنة بتنفيذ هجمات مختلفة معتمدة ضد منظمة
العميل. يمكن أن تختلف هذه الهجمات في الحجم والمدة والتعقيد , يمكن أن يكون لاختبار القرصنة نقاط دخول مختلفة إلى المنظمة المستهدفة. في
اختبار القرصنة المفترض، يتم منح مختبر القرصنة حق الوصول القياسي أو
المنخفض للمستخدم إلى نظام داخلي ويمكنه تنفيذ الهجمات من هناك. في هذا النوع
من الاختبار، يتركز التركيز على الشبكة الداخلية. قد يقدم العميل معلومات
إضافية للمساعدة في الاختبار.
اختبار أكثر تعقيدًا قليلاً هو اختبار خرق خارجي، والذي يمكنه الاستفادة من
الهندسة الاجتماعية والهجمات ضد البنية التحتية التي تواجه الإنترنت , سيحاول
كلا النوعين من اختبارات القرصنة الخرق أكبر قدر ممكن من الأنظمة الداخلية
للمؤسسة العميلة. وغالبًا ما يتضمن ذلك مهاجمة Active Directory وأنظمة
الإنتاج. وبغض النظر عن كيفية إجراء اختبار القرصنة، فإن الهدف العام هو
اختبار أمان البنية الأساسية لتكنولوجيا المعلومات في المؤسسة العميلة.
وبدلاً من اختبار أمان البنية الأساسية لتكنولوجيا المعلومات، من الممكن
اختبار الاستجابة الأمنية للمؤسسة. ويُطلق على هذا عادةً اختبار الفريق الأحمر
(Red Team) أو محاكاة الخصمويعمل عن طريق محاكاة تقنيات وإجراءات المهاجمين المتقدمين , الغرض الرئيسي من اختبار الفريق الأحمر هو تدريب أو اختبار أفراد الأمن في
منظمة العميل، والذين يشار إليهم باسم الفريق الأزرق. وفي حين تتداخل العديد من
التقنيات بين اختبارات التسلل واختبارات الفريق الأحمر، فإن الأهداف
مختلفة.
ستوفر دورة PEN-300 المعرفة والتقنيات اللازمة لإجراء عمليات التسلل متقدمة
ضد المنظمات الناضجة ذات مستوى الأمان المتطور. إنها ليست دورة فريق
أحمر. تتضمن الموضوعات التي يتم تناولها في هذه الدورة تقنيات مثل :
client side code execution attacks , antivirus evasion, application
whitelisting bypasses, and network detection bypasses. The second , يركز
النصف الثاني من الدورة على المفاهيم الرئيسية مثل lateral movement,
pivoting, والهجمات المتقدمة ضد Active Directory.
نظرًا لأن دورة PEN-300 هي دورة مختصين حماية متقدمة، فلن نتعامل عمومًا مع
فعل التهرب من الفريق الأزرق. بدلاً من ذلك، سنركز على تجاوز آليات الأمان
الآلية التي تمنع الهجوم.
بعرف انكم زهقتوا رح نتخطى الأن بعض الأشياء ونبدا بالمفيد
2 - Operating System and Programming Theory | نظام التشغيل ونظرية
البرمجة
هل البرمجة مطلوبة لاختبار التسلل؟
هذا سؤال شائع يطرحه الوافدون الجدد إلى مجتمع الأمن. ونرى أن التعليم الرسمي
في البرمجة ليس مطلوبًا، ولكن المعرفة الواسعة بلغات البرمجة مفيدة للغاية.
وبفضل هذه المعرفة الواسعة، يمكننا فهم نقاط الضعف في البرامج ومفاهيم أنظمة
التشغيل العامة بشكل أفضل.
ستوفر هذه الوحدة نهجًا نظريًا للبرمجة ومفاهيم أنظمة تشغيل Windows. ولا
تحتوي على أي تمارين ولكنها توفر المعرفة الأساسية التي سنعتمد عليها خلال هذه
الدورة.
1.2 Programming Theory | نظرية البرمجة
في الأقسام القليلة القادمة، سنقدم نظرة عامة عالية المستوى حول البرمجة ونقدم
المصطلحات المهمة.
1.1.2 Programming Language Level | مستوى لغة البرمجة
تتضمن البرمجة العديد من المفاهيم والتصنيفات والتسلسلات الهرمية. في هذا القسم،
سنقدم نظرة عامة مناسبة لاختبار التسلل .
جميع لغات البرمجة أما أن تكون compiled او interpreted
, عند استخدام لغة Compiled، يجب تحويل الكود إلى صيغة ثنائية "Binary"
قبل أن يتم تنفيذه ومن ناحية أخرى، عند استخدام لغة مُفسَّرة
"Interpreterd"، يتم تحليل ملفات الكود (البرامج النصية) وتحويلها إلى الصيغة
الثنائية المطلوبة سطرًا واحدًا في كل مرة عند تنفيذها.
من أجل وصف التسلسل الهرمي للغات البرمجة، سنركز على اللغات Compiled
ونبدأ بمناقشة اللغات ذات المستوى الأدنى "low-level" , ان لغات البرمجة االـ
Low-Level يصعب على البشر فهمها، وهي مرتبطة بشكل خاص بالأجهزة وتحتوي
على كمية محدودة من الميزات. من ناحية أخرى، فإن اللغات عالية المستوى
أسهل للمبرمجين في القراءة والكتابة، وأكثر قابلية للنقل وتوفر الوصول إلى
تعقيد أكبر من خلال نموذج البرمجة الموجهة للكائنات "object-oriented
programming"
في الأساس، تقوم وحدة المعالجة المركزية "CPU" بتنفيذ إجراءات بناءً على
التعليمات البرمجية الناتجة عن التعليمات البرمجية المترجمة
"Complied", التعليمات البرمجية هي قيمة ثنائية "Binary" تقوم وحدة
المعالجة المركزية بتعيينها لإجراء معين , يمكن ترجمة مجموعة التعليمات
البرمجية إلى لغة البرمجة التجميعية منخفضة المستوى "Assembly" لتحسين قابلية
القراءة البشرية
عندما نتعامل مع أجهزة كمبيوتر تعمل بنظام Windows أو Linux، فإننا نهتم
عادةً بهندسة x86 " x86
architecture", تحدد الـ architecture أي التعليمات البرمجية صالحة وما
هي الوظائف التي يتم تعيينها لها في التجميع وينطبق الشيء نفسه على
هياكل وحدة المعالجة المركزية "CPU architectures " الأخرى مثل ARM14 التي
تُستخدم مع معظم الهواتف الذكية والأجهزة اللوحية.
عادةً ما تحتوي التطبيقات التي تتطلب تكاليف تشغيل منخفضة وكفاءة عالية مثل
المكونات الأساسية لنظام التشغيل أو المتصفح على عناصر مكتوبة بلغة التجميع
"assembly". ورغم أننا لن نكتب غالبًا أكواد التجميع كمختبرين خرق، فقد
يكون من المفيد فهمها من أجل تنفيذ عمليات تجاوز "Bypass" مختلفة لمنتجات
الأمان أو تنفيذ هجمات أكثر تقدمًا.
عندما نفكر في لغة مثل C فإننا نستخدم قواعد نحوية أكثر قابلية للقراءة من
قبل البشر "human-readable syntax" ، على الرغم من أن C لا تزال تعتبر
لغة منخفضة المستوى نسبيًا. وعلى النقيض من ذلك، يمكن اعتبار C++ عالية
ومنخفضة المستوى. لا تزال توفر إمكانية الوصول إلى جميع ميزات C وتقبل
التعليمات البرمجية المضمنة مباشرةً من خلال تعليمات التجميع
المضمنة. توفر C++ أيضًا إمكانية الوصول إلى ميزات عالية المستوى مثل
الفئات "classes " والكائنات "Objects" مما يجعلها لغة برمجة موجهة لـ
Objects
معظم لغات البرمجة النصية مثل Python أو JavaScript أو PowerShell هي لغات
عالية المستوى وتستخدم نموذج البرمجة الموجهة للكائنات أيضًا.
https://en.wikipedia.org/wiki/Object-oriented_programming
https://en.wikipedia.org/wiki/Opcode
https://en.wikipedia.org/wiki/Assembly_language
https://en.wikipedia.org/wiki/X86
https://en.wikipedia.org/wiki/ARM_architecture
يتم تجميع الكود من Java وC# إلى كود ثنائي "bytecode" يتم معالجته بعد ذلك بواسطة آلة افتراضية مثبتة "Virtual Machine" ,
تستخدم Java آلة Java الافتراضية (JVM) التي تعد جزءًا من بيئة تشغيل Java (JRE).
ستخدم C# وقت تشغيل اللغة المشتركة (CLR)، وهو جزء من إطار عمل .NET
عادةً ما تقوم متصفحات الويب بتنفيذ التعليمات البرمجية من لغات البرمجة
النصية مثل JavaScript من خلال آلة افتراضية أيضًا. ولكن عند مواجهة مهام
متكررة، يتم استخدام تقنية تسمى التجميع في الوقت المناسب (JIT) حيث يتم تجميع
النص البرمجي مباشرةً في التعليمات البرمجية الأصلية
تنبع شعبية Java إلى حد كبير من استقلالها عن نظام التشغيل، في حين كانت لغة
C# مقتصرة في الأساس على منصة Windows. مع الإصدار الأخير نسبيًا من .NET
Core , تتوفر لغة C# أيضًا على Linux أو macOS
عندما يتم تنفيذ الكود الثنائي، تقوم الآلة الافتراضية بتجميعه إلى أكواد
تشغيلية يقوم وحدة المعالجة المركزية بمعالجتها.
في هذا السيناريو، غالبًا ما توفر الآلة الافتراضية "VM" دعمًا لإدارة
الذاكرة يمكن أن يساعد في منع الثغرات الأمنية مثل تجاوزات المخزن المؤقت
"BufferOverFlows" على الرغم من أنه ليس من الضروري أن تكون
قادرًا على البرمجة بكل من هذه اللغات، إلا أنه باعتبارنا مختصين الحماية ،
يتعين علينا على الأقل أن نفهم الاختلافات والقيود بينهما.
2.1.2 Programming Concepts | مفاهيم البرمجة
في هذا القسم سنناقش بعض المفاهيم الأساسية والمصطلحات المستخدمة في برمجة
اللغات عالية المستوى.
أحد المكونات الرئيسية للبرمجة الموجهة للكائنات "object-oriented
programming" هو الفئة التي تعمل كقالب لإنشاء الـ Objects. تحتوي معظم
الفئات على عدد من المتغيرات لتخزين البيانات المرتبطة بها والطرق التي
يمكنها تنفيذ إجراءات على المتغيرات "variables" .
في نموذج البرمجة الشيئية "Object-oriented paradigm" ، يتم إنشاء كائن من
فئته من خلال طريقة خاصة تسمى المنشئ. عادةً ما يتم تسمية المنشئ باسم فئته
ويُستخدم في الغالب لإعداد متغيرات المثيل الخاصة بالفئة وتهيئتها.
https://en.wikipedia.org/wiki/Bytecode
https://docs.microsoft.com/en-us/dotnet/standard/clr
https://en.wikipedia.org/wiki/.NET_Framework
https://en.wikipedia.org/wiki/Just-in-time_compilation
)https://en.wikipedia.org/wiki/Class_(computer_programming
https://en.wikipedia.org/wiki/Method_(computer_programming
https://en.wikipedia.org/wiki/Instance_(computer_science
على سبيل المثال، في القائمة أدناه، عند إنشاء كائن MyClass، سيقوم منشئ
MyClass
public class MyClass
{
private int myNumber;
// constructor
public MyClass(int aNumber)
{
this.myNumber = aNumber;
}
public getNumber()
{
return myNumber;
}
}
بإعداد وتهيئة متغير فئة myNumber إلى القيمة التي تم تمريرها كمعلمة إلى المنشئ.
كما هو موضح في القائمة، يتم إضافة مُعدِّل وصول إلى اسم الفئة "class" والطريقة والمتغيرات "variables" الأكثر شيوعًا هما public وprivate. يسمح المعدِّل public لكل من الكود خارج الفصل وداخل الفصل بالإشارة إليه واستخدامه، بينما يسمح private فقط للكود داخل الفصل بالوصول إليه. ينطبق نفس المفهوم على الطرق.
في القائمة، يمكن لجميع التعليمات البرمجية استدعاء المنشئ MyClass، ولكن فقط الكائن المُنشأ يمكنه الرجوع إلى المتغير myNumber مباشرةً. يجب على التعليمات البرمجية خارج الكائن استدعاء الطريقة العامة
getNumber لتقييم myNumber.
مع بدء تطوير تقنيات الهجوم والبدء في كتابة التعليمات البرمجية المخصصة، ستصبح هذه المفاهيم والمصطلحات أكثر أهمية بشكل متزايد. بالإضافة إلى ذلك، سنعتمد على هذه المفاهيم أثناء التحقيق في التعليمات البرمجية عالية المستوى وهندستها العكسية.
2.2 Windows Concepts | مفاهيم ويندوز
أصبحت خوادم ومحطات العمل التي تعمل بنظام Windows منتشرة في بيئات الشبكات الحديثة. دعنا نخصص بعض الوقت لمناقشة بعض المفاهيم والمصطلحات الأساسية الخاصة بنظام Windows والتي سنستخدمها في العديد من الوحدات في هذه الدورة.
1.2.2 Windows On Windows
تستخدم معظم الأجهزة التي تعمل بنظام Windows الإصدار 64 بت من نظام التشغيل Windows.
ومع ذلك، لا تزال العديد من التطبيقات تعمل بنظام 32 بت. لتسهيل ذلك، قدمت Microsoft مفهوم Windows On Windows 64-bit (WOW64)31 الذي يسمح لإصدار 64 بت من Windows بتنفيذ تطبيقات 32 بت دون أي فقدان تقريبًا للكفاءة "لاحظ أن تثبيتات Linux ذات 64 بت لا تدعم بشكل أصلي تنفيذ التطبيقات ذات 32 بت."
يستخدم WOW64 أربع مكتبات 64 بت (Ntdll.dll وWow64.dll وWow64Win.dll وWow64Cpu.dll) لمحاكاة تنفيذ التعليمات البرمجية 32 بت وإجراء عمليات الترجمة بين التطبيق والنواة "Kernel
في إصدارات 32 بت من Windows، يتم تخزين معظم تطبيقات Windows الأصلية والمكتبات في C:\Windows\System32. في إصدارات 64 بت من Windows، يتم تخزين البرامج الأصلية 64 بت ومكتبات DLL في C:\Windows\System32 ويتم تخزين إصدارات 32 بت في C:\Windows\SysWOW64.
باعتبارنا مختصين حماية، يجب أن نظل على دراية بالهندسة المعمارية أو البتات الخاصة بأهدافنا، لأن ذلك يحدد نوع الكود الشل وغيره من التعليمات البرمجية المترجمة التي يمكننا استخدامها.
2.2.2 Win32 APIs
إن نظام التشغيل Windows وتطبيقاته المختلفة مكتوبة بمجموعة متنوعة من لغات البرمجة التي تتراوح من لغة التجميع إلى لغة C# ولكن العديد منها يستخدم واجهات برمجة التطبيقات المضمنة التي يوفرها Windows (أو واجهات برمجة التطبيقات APIs).
توفر هذه الواجهات، المعروفة باسم واجهة برمجة تطبيقات Win32 APIs، للمطورين وظائف جاهزة مسبقًا. تم تصميم واجهات برمجة التطبيقات نفسها ليتم استدعاؤها من لغة C وتم توثيقها بأنواع بيانات على غرار لغة C ولكن كما سنكتشف خلال هذه الدورة، يمكن استخدامها مع لغات أخرى متعددة.
تم توثيق العديد من واجهات برمجة التطبيقات Win32 بواسطة Microsoft. أحد الأمثلة البسيطة على ذلك هو واجهة برمجة التطبيقات GetUserNameA التي تم تصديرها بواسطة Advapi32.dll والتي تسترد اسم المستخدم الذي ينفذ الوظيفة.
الى هنا نكون انهينا المقدمة طبعاَ وقفنا هون مشان مايكون المقال طويل كتير عليكم بتمنى انو يكون هاد العمل قد نال أعجابكم
نتابع بالمقال القادم مع الـ Windows Concepts .. الى اللقاء