كيفية تتبع الأحداث الأمنية الهامة في نظام التشغيل Windows باستخدام PowerShell


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

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

في هذه المشاركة، ستتعلم كيفية تعقب الاختراقات الأمنية المحتملة في ويندوز من خلال التعرف على سياسات التدقيق، وسجلات أحداث ويندوز، وتحليل أحداث الأمان باستخدام 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 أو احفظه كسكريبت.

للوصول إلى موقع تخزين ملف سجل الأمان، يجب عليك تشغيل الكود كمسؤول.

 #عرض سجلات التطبيقات، الأمان، والنظام في مصفوفة. 
 $arrLogs = @(
     "Application"
     "Security"
     "System"
 )
  #استخدام cmdlet ForEach-Object لاستهداف كل سجل بواسطة cmdlet Get-ItemProperty المناسب. 
 $arrLogs | ForEach-Object {
      #استخدام cmdlet Get-ItemProperty لإدراج مسار الملف المكون لسجل التطبيقات، الأمان، والنظام. 
     Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\EventLog\$_ -Name File | Select-Object PSChildName,File
 }

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

Application, Security, and System audit log location

تعريف سياسات التدقيق: تحديد الأحداث للتسجيل

بشكل افتراضي، لا يقوم نظام Windows بتسجيل جميع الأحداث الأمنية التي قد تكون مطلوبة لاكتشاف أو التحقيق في اختراق. للتحكم في ما إذا كان Windows سيقوم بتسجيل شيء أم لا، يجب عليك تعريف وتطبيق سياسات التدقيق. تُعد سياسة التدقيق مجموعة من التعليمات الممررة إلى Windows تخبره بالأحداث التي يجب تسجيلها.

هناك طرق مختلفة لتعيين والعمل مع سياسات التدقيق، مثل سياسة المجموعة. يعمل سياسة المجموعة بشكل جيد إذا كنت بحاجة إلى تنفيذ سياسات التدقيق عبر العديد من الأجهزة. ولكن في هذا المقال، ستتمسك بجهاز واحد، لذا ستستخدم أداة auditpol. تأتي أداة auditpol مثبتة مع Windows وتتيح لك البحث وتعيين سياسات التدقيق على نظام Windows.

البحث عن سياسات التدقيق

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

#الحصول على تكوين سياسة تدقيق النظام.
auditpol /get /category:*

الصورة الشاشة التالية تُظهر نسخة مُقطعة من الناتج المتوقع للكود، حيث تعرض فئة تدقيق سياسة الحسابات، والفئات الفرعية، والحالة (الإعداد).

Audit policy category, subcategory, and configuration

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 كمسؤول وقم بتشغيل الأمر التالي. هذا الأمر يبدأ بتسجيل جميع الأحداث (نجاحًا وفشلًا) التي تتبع الفئة الفرعية تسجيل الدخول.

تكوين فئة تسجيل الدخول يجبر النظام على تسجيل الأحداث:

# قم بتعيين أحداث تسجيل الدخول لالتقاط النشاط الناجح / الفاشل.
auditpol /set /subcategory:"Logon" /success:enable /failure:enable

هناك مصادر عديدة متاحة لمساعدتك في تكوين سياسة تدقيق الممارسات الأفضل، بما في ذلك مركز أمان الإنترنت (CIS) للمعايير الأساسية، و دليل تنفيذ التوجيهات الأمنية لوكالة نظم المعلومات الدفاعية (DISA)، والتوجيهات التي تم نشرها بواسطة مايكروسوفت.

إنشاء سجلات فشل تسجيل الدخول للتحليل

سيكون هذا المقال دليلًا تعليميًا، وسيتوقع منك متابعته. إذا كنت قد قمت بتكوين Windows لتدقيق أحداث تسجيل الدخول أعلاه، دعونا الآن ننشئ بعض الأحداث الأمنية للتحليل لاحقًا. على وجه التحديد، دعونا نولد 35 محاولة تسجيل دخول فاشلة سيتم تسجيلها في سجل الأمان الخاص بنظامك لتقليد نشاط القوة العنيفة.

1. افتح محرر الكود المفضل لديك.

٢. قم بنسخ الشيفرة التالية ولصقها في محرر الشيفرة. يحاول هذا المقتطف من الشيفرة فتح عملية PowerShell.exe باستخدام أمر Start-Process باستخدام أسماء مستخدمين وكلمات مرور وهمية.

# قم بتعريف 5 أسماء مستخدمين لتسجيل فشل الدخول.
 $arrUsers = @(
     "AtaBlogUser1"
     "AtaBlogUser2"
     "AtaBlogUser3"
     "AtaBlogUser4"
     "AtaBlogUser5"
 )
 # قم بتكرار الأسماء المستخدمة باستخدام ForEach-Object لتوليد فشل في تسجيل الدخول لكل منها.
 $arrUsers | ForEach-Object {
     $securePassword = ConvertTo-SecureString "AtA810GRu13Z%%" -AsPlainText -Force 
     $storedCredential = New-Object System.Management.Automation.PSCredential($_, $securePassword)
     Start-Process -FilePath PowerShell -Credential $storedCredential
 }
 # قم بتوليد 30 فشل في تسجيل الدخول للمستخدم AtaBlogUser.
 $i = 0
 Do {
     $securePassword = ConvertTo-SecureString "AtA810GRu13Z%%" -AsPlainText -Force 
     $storedCredential = New-Object System.Management.Automation.PSCredential("AtaBlogUser", $securePassword)
     Start-Process -FilePath PowerShell -Credential $storedCredential
     $i++
 } Until ($i -eq 30)

٣. احفظ النص النصي لـ PowerShell كـ Invoke-BogusEvents.ps1 أو أي اسم تفضله ثم قم بتنفيذ النص النصي.

عند التنفيذ، ستلاحظ ظهور خطأ متوقع يتكرر 35 مرة يشير إلى اسم المستخدم أو كلمة المرور غير صحيحة.

Authentication failure due to incorrect user name or password.

إذا لم تتلقَّ النتيجة المتوقعة، تأكد من أن خدمة تسجيل الدخول الثانوي في حالة تشغيل.

الوصول إلى أحداث 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).

# قم بتصفية سجل الأمان للحصول على أحدث 10 حالات من رقم الحدث 4625
Get-WinEvent -FilterHashtable @{LogName='Security';ID=4625} -MaxEvents 10

إذا نجح الأمر، يجب أن ترى نتائج مشابهة لما يلي:

10 instances of Event ID 4625

الوصول إلى خصائص الحدث باستخدام 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 لكل من تلك الأحداث.

(Get-WinEvent -ListProvider 'Microsoft-Windows-Security-Auditing').Events
Get Win Event List Provider

3. الآن بعد أن حصلت على الشيفرة للعثور على قوالب لجميع أنواع الأحداث، قم بتحديدها عن طريق إرجاع الحدث المرتبط بالمعرف 4625 فقط.

(Get-WinEvent -ListProvider 'Microsoft-Windows-Security-Auditing').Events | Where-Object -Property ID -eq 4625

4. بمجرد أن تعيد فقط نوع الحدث تسجيل الدخول مع معرف الحدث 4625، قم بتقييد ذلك لعرض الخاصية Template فقط كما في الأسفل.

#الحصول على قالب XML لخصائص الحدث ذات معرف الحدث 4625.
 ((Get-WinEvent -ListProvider 'Microsoft-Windows-Security-Auditing').Events | Where-Object -Property ID -eq 4625).Template

الصورة أدناه تظهر نسخة مقتطعة من إخراج الشيفرة، محددة اسم خاصية الحدث، ونوع الإدخال ونوع الإخراج. يمكنك رؤية أن معرف الحدث 4625 لديه خصائص حدث مع تعاريف مدخلات ومخرجات مختلفة.

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

XML template example

كيف يترجم PowerShell XML إلى كائنات

الآن بعد أن رأينا كيف يقوم Windows بتخزين الأحداث في XML وكيفية رؤية تلك القوالب في PowerShell، دعنا ننتقل إلى كيفية ترجمة PowerShell لتلك الـ XML إلى كائنات.

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

Get-WinEvent -FilterHashtable @{LogName='Security';ID=4625} -MaxEvents 1
Get-WinEvent FilterHashtable

بشكل افتراضي، لا يقوم cmdlet Get-WinEvent بإرجاع جميع السمات من مصدر بيانات الحدث كـ PowerShell object.

2. الآن، قم بتوجيه إخراج الأمر أعلاه إلى cmdlet Select-Object وحدد معلمة Property وقم بتمرير قيمة لإظهار جميع الخصائص.

Get-WinEvent -FilterHashtable @{LogName='Security';ID=4625} -MaxEvents 1 | Select-Object -Property *

لاحظ أدناه أن PowerShell كان يخفي العديد من الخصائص المختلفة. وتحديدًا، خاصية تُدعى Properties. تحتوي خاصية Properties على قيمة كل سمة حدث رأيتها سابقًا في القالب XML.

Powershell hiding Properties

٣. قم بتقييد إخراج الأمر Get-WinEvent أعلاه ليكشف عن خاصية Properties. تحتوي هذه الخاصية على جميع خصائص الحدث، وليست خصائص كائن PowerShell، في مصفوفة. ليس

# قائمة خصائص الحدث لأول حالة من معرف الحدث 4625
 $eventProperties = (Get-WinEvent -FilterHashtable @{LogName='Security';ID=4625} -MaxEvents 1).properties
 $eventProperties

على اليسار من اللقطة المعروضة أدناه هو الإخراج من الأمر أعلاه. تحتوي المصفوفة على قيم لكل من السمات XML في القالب XML على الجانب الأيمن من اللقطة المعروضة.

يوضح إخراج الكود في اللقطة المعروضة أن حدث فشل في المصادقة للمستخدم AtaBlogUser (TargetUserName) من النظام Desktop-XXXXX (WorkstationName) باستخدام عنوان IP ::1 (IpAddress).

Expected output correlating property values to Event ID 4625’s XML template.

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

يجب عليك الإشارة إلى خاصية value على كائن خاصية الحدث الفردية لإرجاع القيمة فقط (AtaBlogUser). $eventProperties[5].value

$eventProperties[5].value
Event attribute property positions

سيتم استخدام الممارسات الموصوفة طوال هذا القسم في الأقسام التالية لتتبع محاولة الهجوم العنيف التي قمت بمحاكاتها في وقت سابق في هذه المشاركة.

كشف هجوم القوة العنيفة

‏أنت الآن مستعد لاستخدام مهارات PowerShell الخاصة بك لتتبع هجوم القوة الغاشمة الذي قمت بتكراره في وقت سابق في هذا المنشور! دعونا نضع مهاراتك على الاختبار من خلال تحاكي كيف يمكن أن يبدو تتبع هجوم القوة الغاشمة استنادًا إلى فترة زمنية محددة.

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

1. العثور على جميع الأحداث ذات الهوية 4625 (ID=4625) في سجل الأمان في Windows (LogName="Security") خلال الـ 24 ساعة الأخيرة (StartTime=((Get-Date).AddDays(-1).Date)، انتهاءً في الوقت الحالي (Get-Date)

$events = Get-WinEvent -FilterHashTable @{LogName="Security";ID=4625;StartTime=((Get-Date).AddDays(-1));EndTime=(Get-Date)}

2. الآن، قم بعد العد من جميع الأحداث المخزنة في المتغير لتحديد ما إذا كان هناك مزيد من حوادث تسجيل الدخول الفاشلة مما هو متوقع.

$events.Count

الآن يجب أن ترى قيمة عددية تشير إلى عدد مرات العثور على هوية الحدث 4625 في سجل الأمان للـ 24 ساعة الأخيرة.

3. لذا، لقد قررت أن هناك هجومًا بقوة غاشمة قد حدث، الآن تتبع مزيد من المعلومات حول هذه الأحداث الأمان في Windows. للقيام بذلك، قم بإرجاع السمات فقط من كل حدث تهمك.

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

  • اسم الهدف الفهرس: [5]
  • نوع تسجيل الدخول الفهرس: [10]
  • اسم محطة العمل الفهرس: [13]
  • عنوان IP الفهرس: [19]

يقوم الكود العيني أدناه بقراءة كل كائن في متغير $events، ويقوم بجمع الخصائص المثيرة للاهتمام فقط، ويقوم بدمجها في سطر واحد.

#استخراج خصائص الحدث TargetUserName، LogonType، WorkstationName، و IpAddress من جميع حالات Event ID 4625 في آخر 24 ساعة.
 $events | ForEach-Object {
     ## الإشارة إلى خصائص كائن الخاصية
     ## إرجاع قيمة الفهارس 5 و 10 و 13 و 19 فقط من مصفوفة الخصائص
     ## دمج جميع القيم معًا عن طريق الانضمام بها بفاصلة
     $_.properties[5,10,13,19].value -join ", "
 }

تُظهر اللقطة الشاشية التالية نسخة مقتصرة من الناتج المتوقع للكود، توضح قائمة مفصولة بفواصل لـ
اسم الهدف، نوع تسجيل الدخول، اسم محطة العمل، وعنوان IP.

A truncated version of the code’s output, detailing TargetUserName, LogonType, WorkstationName, and IpAddress property values.

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

LogonType attribute

Sure, 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.

$logonTypes = @{
     [uint32]2 = "Interactive"
     [uint32]3 = "Network"
     [uint32]4 = "Batch"
     [uint32]5 = "Service"
     [uint32]7 = "Unlock"
     [uint32]8 = "NetworkCleartext"
     [uint32]9 = "NewCredentials"
     [uint32]10 = "RemoteInteractive"
     [uint32]11 = "CachedInteractive"
 }

5. قم بدمج Get-WinEvent وhashtable LogonType باستخدام ForEach-Object لإنشاء نصيب البرنامج النصي الذي سيعيد فقط الخصائص التي ترغب فيها باستخدام قيمة LogonType سهلة الفهم كما هو موضح أدناه. تساهم cmdlet Format-Table في إضافة المزيد من سهولة الاستخدام للناتج الذي يُعرض بواسطة PowerShell عن طريق تنسيق الاستجابة كجدول.

# استخدم Get-WinEvent للوصول إلى الخصائص الخاصة بكل حدث مسجل للمعرف 4625
$events = Get-WinEvent -FilterHashTable @{LogName="Security";ID=4625;StartTime=((Get-Date).AddDays(-1).Date);EndTime=(Get-Date)}
## قم بإنشاء "map" لقيمة رقمية
$logonTypes = @{
    [uint32]2 = "Interactive"
    [uint32]3 = "Network"
    [uint32]4 = "Batch"
    [uint32]5 = "Service"
    [uint32]7 = "Unlock"
    [uint32]8 = "NetworkCleartext"
    [uint32]9 = "NewCredentials"
    [uint32]10 = "RemoteInteractive"
    [uint32]11 = "CachedInteractive"
}
## ابدأ معالجة كل عنصر في مصفوفة $events
$events | ForEach-Object {
    ## ابحث عن القيمة الرقمية في hashtable
    $logonType = $logonTypes[$_.properties[10].value] 
    # أنشئ كائن PowerShell المخصص لإخراج الخصائص المرتبطة بالحدث
    [PSCustomObject]@{     
        TimeCreated = $_.TimeCreated     
        TargetUserName = $_.properties[5].value     
        LogonType = $logonType     
        WorkstationName = $_.properties[13].value     
        IpAddress = $_.properties[19].value 
    }
} | Format-Table -Wrap

في هذه النقطة، لديك الآن سكريبت يعيد أنواع كائن PSCustomObject مما يتيح لك إجراء العديد من أنواع التحليل المختلفة! لإكمال تحليل هذا البرنامج التعليمي، قم بإعطاء الأولوية لمحاولات فشل المصادقة حسب TargetUserName. لإعطاء الأولوية للفشل حسب خاصية TargetUserName، قم بدمج الكود السابق مع cmdlet Group-Object. استخدم Sort-Object ومفتاحه Descending لتحديد المستخدم الأكثر انتهاكًا.

#استخدم Get-WinEvent للوصول إلى خصائص كل حدث مسجل للمثيل رقم 4625
$events = Get-WinEvent -FilterHashTable @{LogName="Security";ID=4625;StartTime=((Get-Date).AddDays(-1).Date);EndTime=(Get-Date)}
## قم بإنشاء القيمة الرقمية لسلسلة "map"
$logonTypes = @{
    [uint32]2 = "Interactive"
    [uint32]3 = "Network"
    [uint32]4 = "Batch"
    [uint32]5 = "Service"
    [uint32]7 = "Unlock"
    [uint32]8 = "NetworkCleartext"
    [uint32]9 = "NewCredentials"
    [uint32]10 = "RemoteInteractive"
    [uint32]11 = "CachedInteractive"
}
## ابدأ في معالجة كل كائن في مصفوفة $events
$events | ForEach-Object {
    ## ابحث عن القيمة الرقمية في الجدول الهاش
    $logonType = $logonTypes[$_.properties[10].value] 
    #أنشئ كائن PowerShell مخصص لإخراج خصائص الحدث ذي الصلة
    [PSCustomObject]@{     
        TimeCreated = $_.TimeCreated     
        TargetUserName = $_.properties[5].value     
        LogonType = $logonType     
        WorkstationName = $_.properties[13].value     
        IpAddress = $_.properties[19].value 
    }
} | Group-Object -Property TargetUserName | Sort-Object -Property Count -Descending

عمل رائع! لقد استخدمت PowerShell لاكتشاف محاولة القوة الجبرية التي قمت بمحاكاتها في وقت سابق في هذه المقالة. وفقًا للناتج، فإن AtaBlogUser فشل في المصادقة 30 مرة في الـ 24 ساعة الماضية!

AtaBlogUser Logon Failures

الخطوات التالية

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

مع البرنامج النصي PowerShell الذي لديك الآن، كيف يمكنك تحسينه؟ كيف ستأخذ الشيفرة التي تعلمتها اليوم وتبني أداة أفضل؟

Source:
https://adamtheautomator.com/windows-security-events/