היסטוריית PowerShell ואפשרויות תחקור
תוקפים רבים מנצלים כלים מובנים במערכות הפעלה בכדי להריץ תקיפות, להיעלם מהמכם ולהיות חמקמקים. כאשר ישנו מצב להריץ כלי תקיפה שאינם מתעדים את הפעולות אז מדובר על הצלחה. במערכות Windows ישנם כלים רבים שניתנים לניצול כחלק מתקיפה, ואחד החזקים שבהם הוא PowerShell.
PowerShell הוא מסגרת מונחית עצמים (object-oriented framework), המורכבת ממעטפת (Shell) ושפת סקריפטים. המעטפת מגיעה כברירת מחדל בכל Windows בגרסאות השונות, וניתן להתקין אותה גם במערכות Linux/MacOS. בנוסף, מוכרת כשפה המאפשרת להפוך משימות ניהוליות לאוטומטיות ולנהל תצורות במערכות הפעלה שונות. PowerShell מתבסס על גבי רכיב .NET, ולכן זה מאפשר לו להפוך משימות ידניות לאוטומטיות עם cmdlets, סקריפטים, קובצי הפעלה ומחלקות .NET סטנדרטיות במערכות מסויימות.
כידוע, PowerShell הוא כלי מאוד פופולרי בקרב גורמים מגוונים, כמו, SecOps, System, RedTeam וכו. לכן כל גורם יכול לבצע עימו אינספור פעולות, כמו שינוי תצורה, שינויים במערכת, אוטומציות לניהול משתמשים ווכן האפשרות לניצול ע”י תוקפים והרצת Reverse Shell. מכיוון ש PowerShell הוא כלי עוצמתי אנו צריכים להבין מי משתמש, איך, מתי ובאיזה אופן. הסיבה לכך נעוצה בעובדה שתוקפים יכולים באמצעותו להיות מתחת לבקרות אבטחה שבועות ספורים מבלי שיהיה להם זיהוי, או גרוע מכך, מבלי שבקרות האבטחה יידעו שמדובר על פעולה התקפית כלל.
בהיבט תחקור, ישנם דרכים רבות לתחקר היסטוריית PowerShell, החל מקובצי היסטוריה דיפולטים שנמצאים במערכת ועד הפעלת לוגים מתקדמים, והאפשרויות של הזרמתם אל מערכות SIEM. המאמר הזה נוגע באפשרות ספציפית של תחקור בהיסטוריה של PSReadline ConsoleHost History.
כחלק מתחקורים שאני מבצע ישנם המון מקרים רבים בהם אין לוגים מורחבים או מתקדמים ולכן צריך להשתמש ביומני רישום ולוגים דיפולטיים, כמו זה של PowerShell. ההיסטוריה של PowerShell מוכר כקובץ PSReadline ConsoleHost_history.txt והוא חלק מתוך מודול PSReadline. הקובץ PSReadline ConsoleHost_history.txt של משתמש מערכת יכול לספק את המידע הנדרש או לפחות לספק מידע שיכול להיות חלק מתחקיר כולל.
מודול PSReadline
המודול PSReadLine התחיל כמודול עצמאי, ולימים הפך לחוויית ברירת המחדל של עריכת שורת הפקודה, החל מגרסה PowerShell v3. רשימה מלאה של המודול עם התכונות זמינים בדף גיטהאב. המודול אחראי, בין היתר, לאפשר צפייה בפקודות קודמות מחלון PowerShell. לשם כך, הוא מתעד את כל מה שהוקלד בקונסול. זה יכול להישמר בזיכרון, או בקובץ.
כמה נקודות ענייניות של המודול
- החל מגרסה PowerShell v5 וכן במערכת Windows 10, אפשרות ברירת המחדל היא לשמור היסטוריה בקובץ. הגדרה זו מעניקה את היכולת להתחיל הפעלה חדשה עם ההיסטוריה מההפעלה הקודמת.
- חשוב לדעת שיש ב PowerShell שני סוגי תיעוד: היסטוריה ותיעוד המובנה, היסטוריה ותיעוד מנוהל ע”י מודול PSReadline – כל אחד מהם מוגדר ומתועד באופן נפרד אבל שניהם זמינים בהפעלה שבהם מודול PSReadline נטען.
- היסטוריית PSReadLine עוקבת אחר הפקודות המופעלות ב PowerShell. ההיסטוריה נכתבת לקובץ מרכזי לכל מערכת. הקובץ זמין לכל הסשנים ומכיל את כל העבר. ההיסטוריה אינה נמחקת כאשר ההפעלה מסתיימת. כמו כן, ההיסטוריה הזו אינה מנוהלת על ידי cmdlets.
- ישנו הבדל בניהול ותיעוד היסטוריה בין התיעוד המובנה לבין התיעוד המנוהל.
- ישנם הבדלים בין גרסאות פווראשל השונות וניתן לבדוק את השינויים באתר Microsoft Docs (בהמשך המאמר מצורף קישור).
פרטי קובץ היסטוריה
מיקום ברירת המחדל עבור קובץ זה הוא בתיקיית PowerShell של AppData והוא מגיע עם מספר אפשרויות:
APPDATA\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt
- מיקום קובץ – HistorySavePath
- האפשרויות שמתועדות לאחר הפעלת פקודות – HistorySaveStyle
- מספר הכניסות והמירבי של הערכים – MaximumHistoryCount
טיפ: ניתן לשנות את הערכים באמצעות הפקודה Set-PSReadlineOption.
אז מה ההיסטוריה מספרת לנו במודול של PSReadline? בקיצור, את כל מה שנקליד בקונסול. ישנם מספר דרכים להבין איזה פקודות הופעלו בעבר.
צפייה בתוכן ישיר של הקובץ מתוך קריאת תוכן בפקודת Get-Content
צפייה של פקודות עבר מתוך הרצת הפקודה Get-History שמביאה תוצאות אחרונות בלבד
אפשר גם להריץ את הפקודה הבאה בשביל לקבל את מיקום הקובץ
(Get-PSReadlineOption).HistorySavePath
לצד אפשרויות תיעוד והיסטורייה של פעולות, עדיין ישנו פער ולכן ישנן פעולות שאינן מתועדות. מה אינו מתועד? פקודות והפעלות PowerShell ללא סשן אינן מתועדות. למשל, אם ישנה הפעלה והשגה של ביצוע קוד מרוחק (RCE) על המערכת והרצת “רברס של” (למשל, Nishang) או Meterpreter – במקרים כאלה הפעולות אינן מתועדות ואינם נרשמות בקובץ.
מידע נוסף על PSReadLine History
שימושיות בצוותי אבטחה
היסטוריה ותיעוד PowerShell מסייע לגורמי וצוותי אבטחה שונים, כל אחד בהיבט האבטחה שלו.
צוות אדום – דרך נוחה להפעיל כלי תקיפה ולהיעלם מהמכם ע”י הפעלת סשנים שלא יתועדו במודול PSReadline ולכן גם לא יהיו חלק מההיסטוריה. למשל, טריק מוכר ופשוט בבדיקות אבטחה הוא לבצע הסלמת הרשאות באמצעות היסטוריית PowerShell, איך? כאשר אדמינים עובדים מול עמדה מרוחקת וטוענים בעמדה המרוחקת בממשק PowerShell את ההרשאות (Creds) שלהם, במצב כזה הם עלולים לטעון את הקרדס ישירות להיסטוריה, לרוב במצבי Plain Text.
צוות כחול – היסטוריית PowerShell היא דרך נוספת לקבל תיעוד על הרצת פעולות, ומשם להבין את הפערים אל מול תיעוד מתקדם יותר, קרי, Script-Block. הצוות המגן (ואולי יחד עם SecOps) צריך לנטר ולעקוב אחר מקרים בהם ישנה נגיעה חשודה בקובץ (למשל, תיעוד של פקודות תקיפה), מחיקה של התוכן בקובץ, או כל שינוי שהקובץ עובר.
בפריימורק של MITRE זה מסווג לפי התיאור הבא T1070.003 – Indicator Removal on Host: Clear Command History.
צוות IR – לעיתים ישנם נתונים שלא יסולאו בפז, מכיוון שהתיעוד במודול הנ”ל יכול להוביל לכיווני תחקור נוספים, להעיד על אינדיקציה מסויימת ולתת ראיות בתחקיר. במהלך תחקיר אירוע כאשר מבצעים איסוף ובדיקה של ארטיפקטים, יומני אירוע וכן הלאה, אנו חייבים לאסוף את הנתונים המשוייכים אל PowerShell, בינהם קובצי היסטוריה. אפשרויות כלליות בתחקור מוזכרות בהמשך המאמר.
במרחב הסייבר, תוקפים מנצלים את העובדה שניטור, תיעוד והיסטוריית PowerShell אינו חלק מהותי של צוותי BlueTeam + SOC, ולכן מנצלים את העובדות הנ”ל בשביל להריץ תקיפה בדרכים שאינן מתועדות, להיעלם מהבקרות ולמקסם את החמקמקות (elusive) שלהם.
אפשרויות בתחקור היסטוריית PowerShell
קובץ היסטוריה הוא קובץ טקסט לכל דבר ולעיתים עלול להיות קובץ עם עשרות אלפי שורות לוג, וכידוע בתחקור ומעבר ידני על אלפי שורות לוג אנו עלולים לפספס עדויות או ראיות, ולכן ישנם מצבים שכדאי להשתמש בכלים שמסייעים לנתח את הלוג, לבצע הלימה עם ארטיפקטים אחרים ועוד. כאשר זה מגיע לכלי תחקור ישנם אינספור כלים לניתוח קובץ היסטוריה של PowerShell, ובמיוחד כאלה שמספקים באופן מהיר סינון לפי פקודות התקפיות, סינון ארטיפקטים וכן הלאה.
אחד הכלים הוא ArtiFast. מדובר על כלי פשוט שתומך במגוון רחב של ארטיפקטים עם יותר מ 1500 סוגים על גבי מערכות הפעלה שונות ובמטרה לאפשר ניתוח לוג מהיר על גבי ראיות, צירי זמן וקורלציה בין ראיות. לאחר שתוספי הניתוח משלימים את העיבוד והניתוח, ניתן לבדוק אותו באמצעות תצוגה, ציר זמן, ארטיפקט ומשם יצירת אינדקס, סינון וחיפוש.
טיפ: במקרים בהם ישנו Microsoft Sentienl אפשר להזרים את היסטוריית PowerShell עם הגדרות ספציפיות ומובנות, ומשם לבצע מניפולציות נוספות של הקובץ, ולאחר מכן, להצליב מידע מול מערכות אחרות.
כמו בכל תחקור אנו חייבים ליצור Case (ואפילו Case משנה), לתייג את סוג התחקיר, לתייג את סוג האירוע והתחקור עצמו, בכדי ליצור מיפוי מדוייק של התחקור ושמירת ראיות בהתאם לכל Case.
פעולות כלליות בכלי ArtiFast
- יצירת Case, בחירת נתיב הראיות הראשוני, סוג עיבוד המידע.
- עיבוד המידע מאפשר להזין מידע שיכול להועיל בחיפוש לאחר מכן כמו חישוב HASH, או ביצוע Carving ועוד.
- קטגוריית ארטיפקטים יכולה להיות PowerShell במקרה הזה וניתנת להרחבה כאשר מרכזים ואוספים מספר סוגי ראיות ראשוניות (סוגי לוגים, קבצים ועוד)
- הגדרת Hashsets
לאחר יצירת Case והגדרת נתיב הקובץ, ארטפיקט ומידע נוסף הקובת מנותח באופן ראשוני בכלי ומשם ניתן לבצע חיפושים, להבין האם ישנה הלימה מול ארטיקפט אחר, לבצע קורלציה בין פקודות.
במצב כזה אנו יכולים לחפש ידנית כלי תקיפה, לחפש פקודות תקיפה או לייבא קובץ עם סט של חיפושים.
שמדובר על חיפוש מהיר אפשר לעיתים לחפש בצורה מהירה עם הפקודה הבאה ומתוך ממשק PowerShell בעצמו.
עוד משהו קטן שקפץ במהלך בדיקות אבטחה שנעשו מול PowerShell. במהלך בדיקות אבטחה שונות וגם במהלך כתיבת המאמר כאשר נגעתי בדרכים שונות בקובץ ConsoleHost_History.txt, בין אם זה באמצעות ממשק PowerShell או ממש ישירות בקובץ עצמו קיבלתי התראה מתוך Defender for Endpoint (בסביבות שהוא קיים) על כך שיש נגיעות רבות ופתיחה של הקובץ. למה קפצה התראה? בגלל שיש נגיעה בקובץ ובגלל שינוי מינורי.
במקרים אחרים בהם ביצעתי בדיקות אבטחה וקובצי היסטוריה היו מנוטרים ב Defender for Endpoint קפצה התראה בגלל שהקובץ הכיל בתוכו פקודות תקיפה שונות (פקודה מעורפלת, קריאה לקובץ Mimikazt ועוד).
ביומיום, במקרים בהם אין ניטור על היסטוריית PowerShell, ובמקרים בהם הקובץ אינו מכיל פקודות תקיפה, וכמובן אין נגיעה בקובץ אז לא תקפוץ התראה.
לסיכום
תיעוד ושמירת היסטוריה ב PowerShell יכולה להיעשות בדרכים רבות, באמצעות האפשרויות המובנות או באמצעות הפעלת לוג מתקדם (למשל Script-Block). ניתוח הלוג יכול להיעשות באופן עצמאי, ובאמצעות כלים אחרים, וישנם לא מעט כלים שמבצעים ניתוח של לוג PowerShell עם נתונים נוספים מתוך Event Viewer, קובצי לוג אחרים וכן הלאה.
מאמרים נוספים של תיעוד וניטור PowerShell
מאמר מצוין. תודה