לחפש פוליסי בגישה מותנית (CAP) – Threat Hunting

חיפושים, ציד ותחקור הם מנת חלקם של אנליסטים, מתחקרים ומפתחי תוכן ל SIEM, והם מסייעים בהיבטים רבים של יצירת חוקי זיהוי, יצירת חוקי ציד, איתור תוקף, תחקור תקריות, זיהוי חשיפות ומציאת שלל בעיות אבטחה. כאשר מדובר בציד יומיומי אז הפעולות נעשות באופן פרואקטיבי – כאמור, המטרה למצוא את הדברים הקטנים והמהותיים שיכולים לגרום לבעיות משפיעות ורוחביות בהמשך. ביומיום שלי אני מוצא המון מקרים שבהם ישנו תוקף רדום ברשת או מקרים בהם ישנה ישיבה על הגדר.

המאמר הינו חלק מסדרת מאמרים קצרים על חיפוש וציד (Cyber Threat Hunting) באמצעות KQL. השאילתות מובאות על סמך ידע וניסיון מהשטח ועל סמך יצירה ופיתוח תוכן, תחקור, חיפוש וציד על גבי מערכות רבות. השאילתות יכולות להיות פשוטות או מורכבות ויכולות להתאים למערכות כמו Microsoft Sentinel או Advanced Hunting.

הסטטוס של Condtional Access Policy

החוקים והתנאים של Azure AD Condtional Access הם חלק מתשתית ומדיניות אכיפה של גישה בענן. התנאים מתבססים על מספר סיגנלים שמטרתם לברר ולבדוק כל בקשה ולאשר כל גישה בהתאם לתנאים שונים, למשל, התנאי המוכר של חסימת גישה מתוך מיקום בעל פוטנציאל תקיפה גבוה (סיכון ברמת כתובות).

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

כחלק מתוך חיפושים ומציאת בעיות אני מצרף שאילתה שהיא פשוטה וקצרה אך יעילה ומאפשרת לקבל תמונת מצב לגבי החוקים, שימוש בשטח ותובנות נוספות. בואו נפרק את השאילתה.

בחלק הראשון של השאילתה נציג נתונים ראשונים באמצעות טבלה מסוימת:

טבלת SigninLogs מכילה את כל יומני הכניסה של Azure AD ומאפשרת למצוא נתונים עשירים, בין היתר, איזה משתמש ניסה להיכנס ואיך, מאיזה IP הגיע המשתמש, סוגי מכשירים, ניסיונות התחברות ושלל שדות וערכים שיכולים לסייע בכתיבת תוכן, ציד ותחקור.

האופרטור project לוקח שדות מסויימים ומציג לנו את הפלט שלהם. זה יכול להיות שימושי כאשר מתמקדים בעמודות ספציפיות או כאשר מרדדים את כמות הנתונים בפלט.

SigninLogs
| where TimeGenerated > ago (1d)
| project TimeGenerated //ConditionalAccessPolicies
בשלב שני נוסיף את האופרטורים הבאים:
| mv-expand ConditionalAccessPolicies
| extend CAResult = tostring(ConditionalAccessPolicies.result)
| extend CAPolicyName = tostring(ConditionalAccessPolicies.displayName)

האופרטור mv-expand משמש להרחבת עמודות מרובות ערכים לשורות נפרדות. במקרה זה, היא מרחיבה את העמודה ConditionalAccessPolicies, שעשויה להכיל מספר ערכים עבור כל יומן כניסה. על ידי הרחבת עמודה זו, השאילתה יכולה לעבוד עם כל ערך בנפרד.

האופרטור extend משמש להוספת עמודות חדשות לפלט. במקרה זה, השאילתה מוסיפה עמודה חדשה בשם CAResult, שתכיל את ערך המחרוזת של מאפיין התוצאה בעמודה ConditionalAccessPolicies. הפונקציה tostring() משמשת להמרת מאפיין התוצאה למחרוזת כך שניתן יהיה להציג אותה בפלט.

האופרטור extend דומה לקודמתה, אך הפעם יוצרת עמודה חדשה בשם CAPolicyName ומפרסמת אותה בערך המחרוזת של המאפיין displayName בעמודה ConditionalAccessPolicies. זה מאפשר להציג את השם של מדיניות הגישה המותנית שהוחלה עבור כל יומן ורישום כניסה.

f1b6c monosnap microsoft sentinel microsoft azure 2023 03 17 13 09 07

עד כה, שאילתה זו מרחיבה את העמודה ConditionalAccessPolicies בטבלה SigninLogs, ולאחר מכן יוצרת עמודות חדשות בשם CAResult וכן CAPolicyName על סמך המאפיינים של העמודה. זה מאפשר בתורו להציג את התוצאות ושמות המדיניות עבור כל ערך בודד בעמודה ConditionalAccessPolicies, מה שעשוי להיות שימושי לניתוח נוסף.

בשלב השלישי והאחרון הוסיף את הרמטרים המסכמים בשביל לקבל תמונת מצב

| summarize CAResults=make_set(CAResult) by CAPolicyName
| where CAResults !has "success" and CAResults !has "failure"

אופרטור summarize משמש לקיבוץ/מירכוז לפי עמודה אחת או יותר ולבצע צבירה על הנתונים. במקרה זה, השאילתה מקבצת את הנתונים לפי העמודה CAPolicyName, ומשתמשת בפונקציית הצבירה make_set() כדי ליצור קבוצה של כל ערכי CAResult הייחודיים עבור כל מדיניות. לפלט המתקבל תהיה שורה אחת עבור כל מדיניות, עם קבוצה של ערכי CAResult ייחודיים עבור כל מדיניות.

האופרטור where תסנן את הפלט כך שיכלול רק שורות שבהן ערכת CAResults אינה מכילה את ערך המחרוזת “success” או “failure”. המשמעות היא שהפלט שיתקבל יציג רק מדיניות שלא הובילה לניסיון כניסה מוצלח או כושל.

f69d6 monosnap microsoft sentinel microsoft azure 2023 03 17 13 02 57

לסיכום, שאילתה זו נועדה לחקור כניסות אחרונות ואת המצב של מדיניות גישה מותנית שהוחלה במהלך כניסות אלה מול Azure AD. השאילתה לא תבדוק מצב נתון  ופשוט של תנאי, והאם הוא מופעל או מדוסבל.

טיפ: אפשר לשחק עם השאילתה ולהוסיף ConditionalAccessStatus, במטרה להבין האם מכילה משתמשים מדוסבלים בקבוצות, להציג שדות נוספות ועוד שאר רעיונות.

למאמרי ציד נוספים בעברית

למאמר שאילתות ציד נוספות

השאילתה CAP-Not-inUse

You may also like...

2 Responses

  1. משתמש אנונימי (לא מזוהה) הגיב:

    אחלה מאמר אך אין אפשרות להעתיק את השאילתות כדי להריץ בסביבה 🙂

השאר תגובה

%d