تعتمد العديد من المنظمات على تقنيات مايكروسوفت لإنجاز الأعمال. في الوقت نفسه، الفاعلون المهددون يمكن أن يستغلوا أنظمة التشغيل مثل ويندوز. لحسن الحظ، يقوم ويندوز بتسجيل أحداث أمان نظام التشغيل لمساعدتك على تتبع هذا السلوك.
أحداث الأمان التي ينتجها ويندوز تعتبر موردًا حيويًا في عملية استجابة الحوادث. الأدوات مثل عارض أحداث ويندوز من مايكروسوفت توفر لك الوصول اللازم لمراجعة الأحداث المسجلة، ولكن اكتشاف الشذوذ عن طريق التمرير اليدوي عبر سجل مزدحم غير واقعي.
في هذه المشاركة، ستتعلم كيفية تعقب الاختراقات الأمنية المحتملة في ويندوز من خلال التعرف على سياسات التدقيق، وسجلات أحداث ويندوز، وتحليل أحداث الأمان باستخدام PowerShell.
المتطلبات الأساسية
هذه المقالة معدة لنقل المعلومات التي تعلمك كيفية تحليل أحداث الأمان في ويندوز باستخدام PowerShell. إذا كنت ترغب في متابعة أي من العروض التوضيحية، ستحتاج إلى:
- A Windows 10+ PC – This PC will be used to generate and track down potential security events in the event log. This tutorial will be using Windows PowerShell 5.1.
- حقوق المسؤول على جهاز الكمبيوتر ويندوز
- A PowerShell code editor such PowerShell ISE or Visual Studio (VS) Code.
أين يخزن ويندوز أحداث الأمان
عندما يتم اتخاذ إجراء على نظام تشغيل Windows، يسجل Windows الإجراء كحدث في سجلات الأحداث واحدة أو أكثر. يتم تخزين سجلات أحداث Windows على نظام الملفات، افتراضيًا، في الدليل %SystemRoot%\system32\winevt\logs. يمكن تغيير هذا الموقع عن طريق تعديل مفتاح تسجيل الحدث EventLog المعني.
إذا كنت ترغب في معرفة موقع تخزين أهم سجلات الأحداث (التطبيقات، الأمان، والنظام) على نظامك، قم بنسخ ولصق الكود أدناه في نافذة تحكم PowerShell أو احفظه كسكريبت.
للوصول إلى موقع تخزين ملف سجل الأمان، يجب عليك تشغيل الكود كمسؤول.
الشاشة التالية تظهر الناتج المتوقع للكود، حيث يتم عرض اسم السجل وموقع التخزين لملفات السجل التطبيقات، الأمان، و النظام.

تعريف سياسات التدقيق: تحديد الأحداث للتسجيل
بشكل افتراضي، لا يقوم نظام Windows بتسجيل جميع الأحداث الأمنية التي قد تكون مطلوبة لاكتشاف أو التحقيق في اختراق. للتحكم في ما إذا كان Windows سيقوم بتسجيل شيء أم لا، يجب عليك تعريف وتطبيق سياسات التدقيق. تُعد سياسة التدقيق مجموعة من التعليمات الممررة إلى Windows تخبره بالأحداث التي يجب تسجيلها.
هناك طرق مختلفة لتعيين والعمل مع سياسات التدقيق، مثل سياسة المجموعة. يعمل سياسة المجموعة بشكل جيد إذا كنت بحاجة إلى تنفيذ سياسات التدقيق عبر العديد من الأجهزة. ولكن في هذا المقال، ستتمسك بجهاز واحد، لذا ستستخدم أداة auditpol. تأتي أداة auditpol مثبتة مع Windows وتتيح لك البحث وتعيين سياسات التدقيق على نظام Windows.
البحث عن سياسات التدقيق
على سبيل المثال، للعثور على حالة جميع سياسات التدقيق على نظام Windows الخاص بك، استخدم المعاملة /get
كما هو موضح أدناه. باستخدام المعاملة /category
تليها الرمز النجمي يخبر auditpol بالبحث عن حالة جميع سياسات التدقيق؛ ليس فقط واحدة تطابق فئة أو فئة فرعية معينة.
الصورة الشاشة التالية تُظهر نسخة مُقطعة من الناتج المتوقع للكود، حيث تعرض فئة تدقيق سياسة الحسابات، والفئات الفرعية، والحالة (الإعداد).

A Setting that is configured as No Auditing means that all events associated with that audit policy subcategory will not be logged.
ضبط سياسات التدقيق
يمكن لأداة auditpol أن تفعل المزيد من مشاهدة إعدادات سياسة التدقيق. يمكنها أيضًا تعديلها باستخدام الأمر auditpol /set
. لعرض أقسام المستقبل في هذا البرنامج التعليمي، افتح موجه PowerShell كمسؤول وقم بتشغيل الأمر التالي. هذا الأمر يبدأ بتسجيل جميع الأحداث (نجاحًا وفشلًا) التي تتبع الفئة الفرعية تسجيل الدخول.
تكوين فئة تسجيل الدخول يجبر النظام على تسجيل الأحداث:
- 4624: تم تسجيل دخول حساب بنجاح
- 4625: فشل تسجيل الدخول إلى حساب
- 4626: معلومات المطالبات المستخدم/الجهاز
- 4648: تم محاولة تسجيل الدخول باستخدام بيانات اعتماد صريحة
- 4675: تم تصفية SIDs
هناك مصادر عديدة متاحة لمساعدتك في تكوين سياسة تدقيق الممارسات الأفضل، بما في ذلك مركز أمان الإنترنت (CIS) للمعايير الأساسية، و دليل تنفيذ التوجيهات الأمنية لوكالة نظم المعلومات الدفاعية (DISA)، والتوجيهات التي تم نشرها بواسطة مايكروسوفت.
إنشاء سجلات فشل تسجيل الدخول للتحليل
سيكون هذا المقال دليلًا تعليميًا، وسيتوقع منك متابعته. إذا كنت قد قمت بتكوين Windows لتدقيق أحداث تسجيل الدخول أعلاه، دعونا الآن ننشئ بعض الأحداث الأمنية للتحليل لاحقًا. على وجه التحديد، دعونا نولد 35 محاولة تسجيل دخول فاشلة سيتم تسجيلها في سجل الأمان الخاص بنظامك لتقليد نشاط القوة العنيفة.
1. افتح محرر الكود المفضل لديك.
٢. قم بنسخ الشيفرة التالية ولصقها في محرر الشيفرة. يحاول هذا المقتطف من الشيفرة فتح عملية PowerShell.exe باستخدام أمر Start-Process
باستخدام أسماء مستخدمين وكلمات مرور وهمية.
٣. احفظ النص النصي لـ PowerShell كـ Invoke-BogusEvents.ps1 أو أي اسم تفضله ثم قم بتنفيذ النص النصي.
عند التنفيذ، ستلاحظ ظهور خطأ متوقع يتكرر 35 مرة يشير إلى اسم المستخدم أو كلمة المرور غير صحيحة.

إذا لم تتلقَّ النتيجة المتوقعة، تأكد من أن خدمة تسجيل الدخول الثانوي في حالة تشغيل.
الوصول إلى أحداث Windows باستخدام PowerShell
الآن بعد التأكد من وجود على الأقل 35 حدثًا أمنيًا لنظام التشغيل Windows، دعونا نتعمق في كيفية العثور عليها باستخدام أمر Get-WinEvent
في PowerShell.
قد تكون ملمًا بأمر
Get-EventLog
في PowerShell، الذي يُستخدم أيضًا للوصول إلى سجل الأحداث بشكل برمجي. يستخدمGet-EventLog
واجهة برمجة تطبيقات Win32 متهالكة ولن يتم مناقشته في هذه المقالة.
افتح نافذة تحكم PowerShell كمسؤول واستدعِ الأمر Get-WinEvent
، مرر إليه معلمات FilterHashtable
و MaxEvents
كما هو موضح أدناه.
الأمر أدناه يستعلم سجل الأمان في نظامك (LogName='Security'
) بحثًا عن رقم الحدث 4625 (ID=4625
) ويُرجع أحدث 10 حالات (MaxEvents 10
).
إذا نجح الأمر، يجب أن ترى نتائج مشابهة لما يلي:

الوصول إلى خصائص الحدث باستخدام Get-WinEvent
في القسم أعلاه، استخدمت Get-WinEvent
لرؤية أحداث أمان Windows على مستوى عال، ولكن الحدث في Windows يحتوي على معلومات أكثر بكثير. يحتوي كل حدث Windows على خصائص قيمة يمكنك استخدامها لتحليل أعماق.
أحداث Windows كـ XML
عندما تسجل Windows حدثًا، يتم تخزينه في شكل XML. إذا كانت هذه هي الحالة، فلماذا عاد أمر Get-WinEvent
الخاص بك بكائنات PowerShell النموذجية؟ يقرأ أمر Get-WinEvent
API الخاص بنظام Windows ويترجم الأحداث إلى كائنات PowerShell لزيادة الوظائف.
يحتوي كل حدث Windows على سمات متنوعة تتبع هيكل XML محدد أو هيكل.
سترى أدناه أن كل حدث يتبع هيكلًا محددًا مع ثلاث سمات:
الاسم
– اسم الخاصيةinType
– تعريف نوع الإدخال أو كيفية قبول الحدث لقيمةoutputType
– تعريف نوع الإخراج أو كيفية تسجيل الحدث
العثور على قوالب XML للحدث باستخدام PowerShell
كما ذُكر أعلاه، يتم تخزين كل حدث أمان في Windows في XML وله مخطط محدد، ولكن كيف يبدو هذا المخطط؟ دعونا نكتشف.
في إحدى الأقسام السابقة، قمت بتوليد بعض الأحداث بالمعرف 4625 في سجل الحدث الأمني. هذا النوع من الحدث له سمات محددة تنطبق عليه فقط. للعثور على تلك السمات وكيف يبدو النموذج:
1. افتح نافذة PowerShell كمسؤول إذا لم تكن مفتوحة بالفعل.
2. قم بتشغيل Get-WinEvent
مرة أخرى، ولكن هذه المرة استخدم معلمة ListProvider
محددًا المزود الذي يستخدمه Windows لتسجيل الأحداث في سجل الحدث الأمني وقم بإرجاع الخاصية Events
فقط.
الخاصية Events
تحتوي على جميع الأحداث التي قام بتسجيلها مزود القائمة وتكشف عن النموذج XML لكل من تلك الأحداث.

3. الآن بعد أن حصلت على الشيفرة للعثور على قوالب لجميع أنواع الأحداث، قم بتحديدها عن طريق إرجاع الحدث المرتبط بالمعرف 4625 فقط.
4. بمجرد أن تعيد فقط نوع الحدث تسجيل الدخول مع معرف الحدث 4625، قم بتقييد ذلك لعرض الخاصية Template
فقط كما في الأسفل.
الصورة أدناه تظهر نسخة مقتطعة من إخراج الشيفرة، محددة اسم خاصية الحدث، ونوع الإدخال ونوع الإخراج. يمكنك رؤية أن معرف الحدث 4625 لديه خصائص حدث مع تعاريف مدخلات ومخرجات مختلفة.
الصورة أدناه تسلط الضوء على خاصية SubjectUserSid
لمعرف الحدث 4625. يقبل هذا الحدث بشكل خاص نوع إدخال (inType
) من win:SID
ويقوم بتقديم الناتج (outType
) كـ string
وهو الطريقة التي يتم بها تخزينه داخل سجل الأمان.

كيف يترجم PowerShell XML إلى كائنات
الآن بعد أن رأينا كيف يقوم Windows بتخزين الأحداث في XML وكيفية رؤية تلك القوالب في PowerShell، دعنا ننتقل إلى كيفية ترجمة PowerShell لتلك الـ XML إلى كائنات.
1. قم بتشغيل الأمر Get-WinEvent
مرة أخرى لإرجاع معرف الحدث 4625. حتى الآن، لا يوجد شيء جديد. لاحظ أن PowerShell يظهر فقط أربع خصائص، TimeCreated
، Id
، LevelDisplayName
، و Message
.

بشكل افتراضي، لا يقوم cmdlet Get-WinEvent
بإرجاع جميع السمات من مصدر بيانات الحدث كـ PowerShell object.
2. الآن، قم بتوجيه إخراج الأمر أعلاه إلى cmdlet Select-Object
وحدد معلمة Property
وقم بتمرير قيمة لإظهار جميع الخصائص.
لاحظ أدناه أن PowerShell كان يخفي العديد من الخصائص المختلفة. وتحديدًا، خاصية تُدعى Properties
. تحتوي خاصية Properties
على قيمة كل سمة حدث رأيتها سابقًا في القالب XML.

٣. قم بتقييد إخراج الأمر Get-WinEvent
أعلاه ليكشف عن خاصية Properties
. تحتوي هذه الخاصية على جميع خصائص الحدث، وليست خصائص كائن PowerShell، في مصفوفة. ليس
على اليسار من اللقطة المعروضة أدناه هو الإخراج من الأمر أعلاه. تحتوي المصفوفة على قيم لكل من السمات XML في القالب XML على الجانب الأيمن من اللقطة المعروضة.
يوضح إخراج الكود في اللقطة المعروضة أن حدث فشل في المصادقة للمستخدم AtaBlogUser
(TargetUserName
) من النظام Desktop-XXXXX
(WorkstationName
) باستخدام عنوان IP ::1
(IpAddress
).

ربما ترغب فقط في إرجاع قيمة خاصية الحدث TargetUserName
. نظرًا لأنك قمت بالفعل بتخزين جميع خصائص الحدث في متغير يُسمى $eventProperties
، فقم بالإشارة إلى الفهرس الخامس، الذي يحمل القيمة لـ TargetUserName
.
يجب عليك الإشارة إلى خاصية value
على كائن خاصية الحدث الفردية لإرجاع القيمة فقط (AtaBlogUser
). $eventProperties[5].value

سيتم استخدام الممارسات الموصوفة طوال هذا القسم في الأقسام التالية لتتبع محاولة الهجوم العنيف التي قمت بمحاكاتها في وقت سابق في هذه المشاركة.
كشف هجوم القوة العنيفة
أنت الآن مستعد لاستخدام مهارات PowerShell الخاصة بك لتتبع هجوم القوة الغاشمة الذي قمت بتكراره في وقت سابق في هذا المنشور! دعونا نضع مهاراتك على الاختبار من خلال تحاكي كيف يمكن أن يبدو تتبع هجوم القوة الغاشمة استنادًا إلى فترة زمنية محددة.
لنفترض أنك تم تنبيهك إلى حادث حيث يعتقد تنظيمك أن هناك شخصًا يحاول استخدام حساب إداري لتسجيل الدخول إلى خادم Windows هام. بدأت هذه النشاطات أمس. يجب عليك اكتشاف عدد حوادث الهوية 4625: فشل حساب في تسجيل الدخول التي وقعت خلال الـ 24 ساعة الماضية وتحديد نوع تسجيل الدخول لكل حادثة.
1. العثور على جميع الأحداث ذات الهوية 4625 (ID=4625
) في سجل الأمان في Windows (LogName="Security"
) خلال الـ 24 ساعة الأخيرة (StartTime=((Get-Date).AddDays(-1).Date
)، انتهاءً في الوقت الحالي (Get-Date
)
2. الآن، قم بعد العد من جميع الأحداث المخزنة في المتغير لتحديد ما إذا كان هناك مزيد من حوادث تسجيل الدخول الفاشلة مما هو متوقع.
الآن يجب أن ترى قيمة عددية تشير إلى عدد مرات العثور على هوية الحدث 4625 في سجل الأمان للـ 24 ساعة الأخيرة.
3. لذا، لقد قررت أن هناك هجومًا بقوة غاشمة قد حدث، الآن تتبع مزيد من المعلومات حول هذه الأحداث الأمان في Windows. للقيام بذلك، قم بإرجاع السمات فقط من كل حدث تهمك.
تمامًا كما ذكرت سابقًا، يتم تخزين كل قيمة لحدث معين في مصفوفة بفهرس معين. خصائص الحدث المثيرة للاهتمام لهذا العرض التوضيحي موجودة أدناه.
- اسم الهدف الفهرس:
[5]
- نوع تسجيل الدخول الفهرس:
[10]
- اسم محطة العمل الفهرس:
[13]
- عنوان IP الفهرس:
[19]
يقوم الكود العيني أدناه بقراءة كل كائن في متغير $events، ويقوم بجمع الخصائص المثيرة للاهتمام فقط، ويقوم بدمجها في سطر واحد.
تُظهر اللقطة الشاشية التالية نسخة مقتصرة من الناتج المتوقع للكود، توضح قائمة مفصولة بفواصل لـ
اسم الهدف، نوع تسجيل الدخول، اسم محطة العمل، وعنوان IP.

4. كما رأيت من القالب السابق للـ XML، يحتوي قالب حدث ID 4625 على سمة نوع تسجيل الدخول
. تشير هذه السمة إلى الطريقة التي حاول فيها الحساب المصادقة. من خلال بعض التحقيقات الإضافية، لاحظت أن نوع تسجيل الدخول
كان مختلفًا أحيانًا.

LogonType
attributeSure, here is your text translated to Arabic:
القيمة LogonType
هي قيمة عددية من 2 إلى 11، ولكن ماذا يعني ذلك؟ قم بإجراء بعض الأبحاث واكتشاف ما يعنيه كل قيمة.
2 – تفاعلي – المستخدم قام بتسجيل الدخول إلى هذا الكمبيوتر.
3 – الشبكة – المستخدم أو الكمبيوتر قام بتسجيل الدخول إلى هذا الكمبيوتر من الشبكة.
4 – دفعة – يُستخدم نوع تسجيل الدخول الدفعي من قبل خوادم الدفعة، حيث قد تكون العمليات قيد التنفيذ نيابة عن مستخدم دون تدخله المباشر.
5 – الخدمة – تم بدء خدمة من قبل مدير التحكم في الخدمة.
7 – إلغاء القفل – تم إلغاء قفل هذا محطة العمل.
8 – NetworkCleartext – قام المستخدم بتسجيل الدخول إلى هذا الكمبيوتر من الشبكة. تم تمرير كلمة مرور المستخدم إلى حزمة المصادقة بتنسيقها الغير مشفر. جميع حزم المصادقة المدمجة تقوم بتجزئة بيانات الاعتماد قبل إرسالها عبر الشبكة. لا تنتقل بيانات الاعتماد عبر الشبكة بشكل نصي (يُسمى أيضًا نص مفتوح).
9 – NewCredentials – قام الطالب بنسخ جلسته الحالية وحدد بيانات اعتماد جديدة للاتصالات الصادرة. تمتلك الجلسة الجديدة نفس الهوية المحلية، ولكنها تستخدم بيانات اعتماد مختلفة للاتصالات الأخرى عبر الشبكة.
10 – RemoteInteractive – قام الطالب بنسخ جلسته الحالية وحدد بيانات اعتماد جديدة للاتصالات الصادرة. تمتلك الجلسة الجديدة نفس الهوية المحلية، ولكنها تستخدم بيانات اعتماد مختلفة للاتصالات الأخرى عبر الشبكة.
11 – CachedInteractive – قام المستخدم بتسجيل الدخول إلى هذا الكمبيوتر باستخدام بيانات اعتماد شبكية تم تخزينها محليًا على الكمبيوتر. لم يتم الاتصال بمراقب النطاق للتحقق من البيانات الاعتماد.
الآن بعد أن لديك فهم جيد لكل LogonType
، بدلاً من رؤية قيمة عددية في النتائج، تريد سلسلة وصفية أكثر تفصيلاً. لإنشاء “خرائط” في PowerShell، استخدم hashtable.
5. قم بدمج Get-WinEvent
وhashtable LogonType
باستخدام ForEach-Object
لإنشاء نصيب البرنامج النصي الذي سيعيد فقط الخصائص التي ترغب فيها باستخدام قيمة LogonType
سهلة الفهم كما هو موضح أدناه. تساهم cmdlet Format-Table
في إضافة المزيد من سهولة الاستخدام للناتج الذي يُعرض بواسطة PowerShell عن طريق تنسيق الاستجابة كجدول.
في هذه النقطة، لديك الآن سكريبت يعيد أنواع كائن PSCustomObject مما يتيح لك إجراء العديد من أنواع التحليل المختلفة! لإكمال تحليل هذا البرنامج التعليمي، قم بإعطاء الأولوية لمحاولات فشل المصادقة حسب TargetUserName
. لإعطاء الأولوية للفشل حسب خاصية TargetUserName
، قم بدمج الكود السابق مع cmdlet Group-Object
. استخدم Sort-Object
ومفتاحه Descending
لتحديد المستخدم الأكثر انتهاكًا.
عمل رائع! لقد استخدمت PowerShell لاكتشاف محاولة القوة الجبرية التي قمت بمحاكاتها في وقت سابق في هذه المقالة. وفقًا للناتج، فإن AtaBlogUser فشل في المصادقة 30 مرة في الـ 24 ساعة الماضية!

الخطوات التالية
في هذا البرنامج التعليمي، تعلمت كيفية تسجيل أحداث Windows، كيفية تمكين تسجيل الأحداث لأنواع معينة من الأحداث، وكيفية بناء أداة PowerShell لاستعلام هذه الأحداث.
مع البرنامج النصي PowerShell الذي لديك الآن، كيف يمكنك تحسينه؟ كيف ستأخذ الشيفرة التي تعلمتها اليوم وتبني أداة أفضل؟
Source:
https://adamtheautomator.com/windows-security-events/