הרבה ארגונים סומכים על טכנולוגיות של Microsoft כדי לבצע עבודה. באותו זמן, יכולים גורמי איום לנצל מערכות הפעלה כמו Windows. למזלנו, Windows מקליטה ארועי אבטחת מערכת כדי לעזור לך לזהות את ההתנהגות הזו.
ארועי האבטחה שמייצרת Windows מהווים מקור חיוני בתהליך התגובה לאירועים. כלים כמו מציג האירועים של Windows של Microsoft מספקים לך את הגישה הנחוצה לבדיקת האירועים שנלכדו, אך זיהוי התנגשויות באופן ידני על ידי גלילה בעץ אירועים מלא באופן בלתי מציאותי.
בפוסט הזה, תלמד כיצד לזהות אפשרי חדירות אבטחה ב-Windows על ידי למידה על מדיניות אודיט, יומני אירועי Windows וניתוח אירועי אבטחה עם PowerShell.
דרישות מוקדמות
מאמר זה מיועד להעביר מידע שמלמד אותך כיצד לנתח אירועי אבטחת Windows בעזרת 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.
- הרשאות מנהל ב-PC של Windows
- A PowerShell code editor such PowerShell ISE or Visual Studio (VS) Code.
איפה Windows אוחסן אירועי אבטחה
כאשר נעשה פעולה במערכת ההפעלה Windows, Windows משמיעה את הפעולה כאירוע באחד או יותר מיומנים האירועים. יומני אירועי Windows מאוחסנים במערכת הקבצים, כברירת מחדל, בספריית %SystemRoot%\system32\winevt\logs. אפשר לשנות את המיקום הזה על ידי שינוי במפתח רישום ה-EventLog הרלוונטי.
אם תרצה לראות איפה מאוחסנים היומנים החשובים ביותר (יישום, אבטחה ומערכת) במערכת שלך, העתק והדבק את הקוד למסוף PowerShell או שמור אותו כסקריפט.
כדי לגשת למיקום האחסון של קובץ יומן האבטחה, עליך להריץ את הקוד כמנהל.
התמונה הבאה מציגה את הפלט הצפוי של הקוד, המציג את שמות היומנים ואת מיקומי האחסון עבור יומני היישום, האבטחה והמערכת.

מדיניות אודיט: הגדרת אירועים לרשום
באופן ברירת מחדל, Windows לא מכילה את כל האירועים האבטחתיים שעשויים להיות נחוצים לזיהוי או לחקירת התקפה. כדי לשלוט במה ש-Windows רשאית ומה לא לרשום, עליך להגדיר וליישם מדיניות אודיט (audit policies). מדיניות אודיט היא סט של הוראות שמועברות ל-Windows ואומרות לו אילו אירועים לרשום.
ישנם כמה דרכים שונות להקצות ולעבוד עם מדיניות אודיט, כמו למשל Group Policy. Group Policy עובדת היטב אם עליך ליישם מדיניות אודיט במספר רב של מכונות. אך במאמר זה, תישאר על התקן יחיד, ותשתמש בכלי ה-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: הוזנו זיהויים חד משמעיים
קיימים מקורות רבים זמינים לסיוע בהגדרת מדיניות ביקורת מבוססת מיטב התרגילים, כולל מרכז האבטחה לאינטרנט (CIS) בנקודות בקרה, ו-מדריכי יישום טכני של סוכנות מערכות מידע לביטחון (DISA STIG), והנחיות המתפרסמות על ידי מיקרוסופט.
ייצור לוגים על התחברויות נכשלות לצורך ניתוח
מאמר זה יהיה מדריך, ונצפה ממך לעקוב. אם הגדרת Windows לבצע ביקורת על אירועי התחברות למעלה, נתחיל כעת ביצירת אירועי אבטחה עבור ניתוח מאוחר יותר. בדיוק, נייצר 35 ניסיונות התחברות נכשלים שירשמו ביומן האבטחה של המערכת שלך כדי לחקות פעילות כוח גובה.
1. פתח את עורך הקוד המועדף עליך.
2. העתיקו את הקוד הבא והדביקו אותו בעורך קוד. קטע הקוד הזה מנסה לפתוח את תהליך PowerShell.exe באמצעות הפקודה Start-Process
באמצעות שמות משתמש וסיסמאות מזוייפות.
3. שמרו את קובץ הסקריפט של 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
לא מחזירה את כל המאפיינים ממקור הנתונים של ה-XML של האירוע כאובייקט PowerShell.
2. עכשיו, חברו את הפלט של הפקודה לעיל ל-cmdlet של Select-Object
וציינו את הפרמטר Property
על מנת להציג את כל המאפיינים.
שימו לב ש-PowerShell היה מסתיר רבים מהמאפיינים השונים. יותר במיוחד, מאפיין בשם Properties
. המאפיין Properties
מכיל את ערכו של כל מאפיין האירוע שראיתם לפני כן בתבנית ה-XML.

3. הגבל את פלט הפקודה Get-WinEvent
למעלה כדי לחשוף את המאפיין Properties
. מאפיין זה מאחסן את כל מאפייני האירוע, לא מאפייני אובייקט של PowerShell, במערך.
משמאל לצילום המסך למטה הוא הפלט מהפקודה למעלה. המערך מכיל את הערכים עבור כל אחד מתכונות ה-XML בתבנית ה-XML מצד ימין של צילום המסך.
פלט הקוד המוצג בצילום המסך מתקשר כי אירעה כשל באימות עבור המשתמש AtaBlogUser
(TargetUserName
) מהמערכת Desktop-XXXXX
(WorkstationName
) באמצעות כתובת IP של ::1
(IpAddress
).

אולי היית רוצה להחזיר רק את הערך עבור מאפיין האירוע TargetUserName
. מאחר וכבר אחסנת את כל מאפייני האירוע במשתנה בשם $eventProperties
, התייחס לאינדקס החמישי, שמחזיק את הערך עבור TargetUserName
.
עליך להתייחס למאפיין value
על אובייקט מאפיין האירוע הבודד כדי להחזיר רק את הערך (AtaBlogUser
). $eventProperties[5].value

התרגולים המתוארים לאורך חלק זה ישמשו בפרקים הבאים כדי לאתר את ניסיון הפריצה בכוח גס שדמיינת קודם לכן בפוסט זה.
זיהוי ניסיון פריצה בכוח גס
שינית עכשיו מוכן להשתמש בכישורי PowerShell שלך כדי לגלות את התקפת הכוח הגס ששיכנעת אחר כך בפוסט הזה! בואו נשים למבחן את הכישורים שלך על ידי הדמיה לכך כיצד ייראה לגלות התקפת כוח גס בהתבסס על טווח זמן מסוים.
נניח שהתראת על אירוע בו הארגון שלך חושב שמישהו מנסה להשתמש בחשבון מנהל להתחבר לשרת Windows חשוב. הפעולה החשודה החלה אתמול. עליך לגלות את מספר אירועי ה-ID 4625: נכשלה נסיון להתחבר לחשבון שהתרחשו ביחד במשך ה-24 שעות האחרונות ולקבוע את סוג ההתחברות של כל אירוע.
1. מצא את כל האירועים עם ה-ID 4625 (ID=4625
) ביומן אבטחה של Windows (LogName="Security"
) מה-24 השעות האחרונות (StartTime=((Get-Date).AddDays(-1).Date
), סוף בזמן הנוכחי (Get-Date
).
2. עכשיו, ספור את כל האירועים שמאוחסנים במשתנה כדי לקבוע אם יש יותר אירועים נכשלים בהתחברות מאשר צפוי.
כעת תראה ערך מספרי המציין את מספר הפעמים שבהן נמצא האירוע עם ה-ID 4625 ביומן האירועים לאבטחה למשך ה-24 שעות האחרונות.
3. אז גילית שהתקפת כוח גס אירעה, כעת חפש מידע נוסף על אירועי אבטחת Windows אלו. כדי לעשות זאת, החזר רק על התכונות מכל אחד מהאירועים שאתה מעוניין בהם.
כפי שצוין למעלה, כל ערך עבור אירוע מסויים מאוחסן במערך עם אינדקס ספציפי. מאפייני האירוע המעניינים לדמו זהם למטה.
- TargetUserName אינדקס:
[5]
- LogonType אינדקס:
[10]
- WorkstationName אינדקס:
[13]
- IpAddress אינדקס:
[19]
הקוד למטה קורא בכל אובייקט במשתנה $events, אוסף רק את המאפיינים המעניינים, ומחבר אותם לשורה אחת.
בצילום המסך למטה מוצגת גרסה מקוצרת של פלט הקוד, המציין רשימה מופרדת בפסיקים של TargetUserName, LogonType, WorkstationName ו־IpAddress.

4. כפי שראית מהתבנית XML למעלה, לתבנית של אירוע ID 4625 יש מאפיין LogonType
. מאפיין זה מציין את השיטה שבה חשבון מנסה לאמת. דרך חקירה נוספת, לגוון בזמן, שם לבת לכך שהמאפיין LogonType
היה שונה מעת לעת.

LogonType
attributeערך ה־LogonType
הוא ערך מספרי בין 2 ל־11, אך מה משמעותו? תבצע מחקר ותגלה מה משמעותם של כל ערך.
2 – אינטראקטיבי – משתמש מחובר למחשב זה.
3 – רשת – משתמש או מחשב מחוברים למחשב זה מהרשת.
4 – עצמאי – סוג התחברות עצמאי משמש על ידי שרתי עצמאי, שבהם תהליכים עשויים להיות ב־ריצה מטעם משתמש בלי התערבות ישירה שלו.
5 – שירות – שירות התחיל על ידי מנהל שליטת השירותים.
7 – פתיחה מחדש – תחנת העבודה פתוחה מחדש.
8 – טקסט ברשת – משתמש מחובר למחשב זה מהרשת. הסיסמה של המשתמש הועברה לחבילת האימות בפורמטה לא מוצפנת שלה. חבילות האימות המובנות מוצפנות קודם את פרטי האימות לפני שהן נשלחות דרך הרשת. פרטי האימות אינם עוברים דרך הרשת בפליינטקסט (נקרא גם cleartext).
9 – פרטי אימות חדשים – הקורא העתיק את האסימון הנוכחי שלו וציין פרטי אימות חדשים לחיבורים יוצאים. הסשן החדש של התחברות משתמש באותו זהות מקומית, אך משתמש בפרטי אימות שונים לחיבורים רשת אחרים.
10 – אינטראקטיבי רחוק – הקורא העתיק את האסימון הנוכחי שלו וציין פרטי אימות חדשים לחיבורים יוצאים. הסשן החדש של התחברות משתמש באותו זהות מקומית, אך משתמש בפרטי אימות שונים לחיבורים רשת אחרים.
11 – אינטראקטיבי במטמון – משתמש מחובר למחשב זה עם פרטי אימות רשת שמאוחסנים מקומית על המחשב. שרת הדומיין לא פנה לאימות את הפרטים.
עכשיו שיש לך הבנה טובה של כל סוגי הכניסה LogonType
, במקום לראות ערך מספרי בפלט, אתה רוצה מחרוזת תיאורית יותר מתארת. כדי ליצור "מפות" בפוורשל, ניתן להשתמש בטבלת צימודים.
5. לשלב את Get-WinEvent
וטבלת הצימודים של LogonType
עם ForEach-Object
כדי ליצור סקריפט שיחזיר רק את התכונות שתרצה עם ערך ידידותי למשתמש ל- LogonType
, כפי שמוצג למטה. פקודת Format-Table
מוסיפה לפלט בעל התגובה הידידותית למשתמש על ידי עיצוב תגובת הפוורשל כטבלה.
בנקודה זו, יש לך סקריפט שמחזיר אובייקטים מסוג PSCustomObject שמאפשר לך לבצע הרבה סוגי ניתוחים שונים! כדי לסיים את ניתוח השיעור הזה, תעדיף את ניסיונות הכשלון באימות לפי TargetUserName
. כדי לתת עדיפות לכשלונות לפי התכונה TargetUserName
, שלב את הקוד מעל עם פקודת Group-Object
. השתמש ב- Sort-Object
ובמתג ה- Descending
שלו כדי לזהות את המשתמש הגורם לכשלון ביותר.
עבודה מצוינת! השתמשת כעת ב-PowerShell כדי לזהות את ניסיון הפריצה המחושב שהדמית לפני כן בפוסט זה. לפי הפלט, משתמש_בלוג_אטא נכשל באימות 30 פעמים ב-24 השעות האחרונות!

שלבים הבאים
במדריך זה, למדת כיצד חלונות מתעדכנים באירועים, כיצד לאפשר את תיעוד האירועים עבור סוגי אירועים מסוימים, וכיצד לבנות כלי PowerShell לשאילתת האירועים אלה.
עם סקריפט PowerShell שיש לך עכשיו, איך תוכל לשפר אותו? איך תקח את הקוד שלמדת היום ותבנה כלי טוב יותר?
Source:
https://adamtheautomator.com/windows-security-events/