חיפוש מול רשימות חיצוניות – Cyber Threat Hunting
חיפושים, ציד ותחקור הם מנת חלקם של אנליסטים ומפתחי תוכן ל SIEM והם מסייעים בהיבטים רבים של יצירת חוקי זיהוי, יצירת חוקי ציד, איתור תוקף, זיהוי חשיפות ומציאת שלל בעיות אבטחה, וכל זה נעשה באופן פרואקטיבי – כאמור, המטרה למצוא את הדברים הקטנים והמהותיים שיכולים לגרום לבעיות משפיעות ורוחביות בהמשך. ביומיום שלי אני מוצא המון מקרים שבהם ישנו תוקף רדום ברשת או מקרים בהם ישנה ישיבה על הגדר.
המאמר הינו חלק מסדרת מאמרים קצרים על חיפוש וציד (Cyber Threat Hunting) באמצעות KQL. השאילתות מובאות על סמך ידע וניסיון מהשטח ועל סמך יצירה ופיתוח תוכן, תחקור, חיפוש וציד על גבי מערכות רבות. השאילתות יכולות להתאים למערכות כמו Microsoft Sentinel או Advanced Hunting.
חיפוש מול מקור מידע חיצוני
האפשרויות של של שילוב מודיעין איומים ומקורות מידע מול מערכות כגון Microsoft Sentinel או כלי Microsoft Defender השונים מאפשרים ליצור חיפושים מתקדמים ולדייק את חוקי הזיהוי וע״י כך להוריד התראות כוזבות ולהרים דגל בבקרות כאשר ישנו חשד לפעולות לא לגיטימיות. האפשרויות של מודיעין איומים מאפשרים לחבר תריסרי קונקטורים ואפשרויות שמשלבים בין היתר שימוש באינדיקטורים וברשימות IP חיצוניות, בין תריסרי הקונקטורים והאפשרויות אפשר למצוא את האפשרות של האופרטור externaldata שמייבא כתובות IP זדוניות מגורם חיצוני ומשלב אותם מול טבלאות שונות במטרה למצוא ניסיונות גישה או קישוריות מול גורם לא מורשה.
השאילתה הבאה משלבת מספר אופרטורים בהם אופרטור לקריאה חיצונית, רגאקס להורדת רשומות מלוכלכות, שילוב שדות וערכים והתנייה מול טבלה ספציפית שתחפש ניסיון לגישה חיצונית מול רשומות זדוניות.
בשלב ראשון נוודא שיש ברשותינו מאגר כלשהוא עם כתובות חיצוניות IP זדוניות ולאחר מכן נשלב את האופרטור של externaldata לקריאה מתוך הכתובת המצורפת
externaldata(ip:string) [@"https://raw.githubusercontent.com/CriticalPathSecurity/Public-Intelligence-Feeds/master/compromised-ips.txt" ] with(format="csv")
- externaldata(ip:string הוא התחביר עבור externaldata שמציין את שם העמודה שתיווצר עם ערך ip, ואת סוג הנתונים של העמודה מחרוזת/סטרינג.
- @”https://raw.githubusercontent.com/CriticalPathSecurity/Public-Intelligence-Feeds/master/compromised-ips.txt היא כתובת האתר של מקור הנתונים החיצוני שממנו הנתונים מאוחזרים. @ אומר למנוע השאילתה לפרש את כתובת האתר כמחרוזת.
- with(format=”csv מציין שהפורמט של הנתונים שאוחזר הוא CSV.
הערות:
- ברשת ובפרט בגיטהאב ישנם אינספור רשימות של כתובות זדוניות ובנוסף אנו יכולים לקחת מתוך רשימה שאנו יוצרים.
- כדאי ליצור רשימה עמצאית על סמך איסוף מידע ידני או באמצעות מערכות מודיעין.
בשלב שני אנו יכולים לשלב אופורטור נוסף בשביל לזקק את המידע. במקרים רבים הנתונים עלולים להיות מוצגים ״בצורה מלוכלכת״ או לא מספיק מדוייקת ולכן נשתמש באופרטור regex בשביל לבצע התאמות ובכדי לנקות את הרשימה. מכיוון שיכולה להיות חפיפה מסוימת נשתמש באופרטור distinct לצורך מניעת כפילויות.
| where ip matches regex "(^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$)" | distinct ip
למי שעובד עם ChatGPT אז אפשר לייצר regex לטובת התאמת הכתובות לפי הפורמט הנכון. אגב, הצאט עושה עבודה גרועה מאוד ביצירת שאילתות ולכן לא ממליץ כלל להשתמש בו למטרה זאת.
כעת, כשיש לנו רשימה של כתובות IP זדוניות, אנו יכולים להשוות אותן מול הטבלה הספציפית במטרה לראות האם אובייקט או יוזר מסוים ניסה לגשת אליהן או שישנה קישוריות מול גורם לא מורשה.
בשלב שלישי ואחרון נשלב את כלל הפרמטרים שהזכרנו ונסיים את השאילתה עם הוספת משתנה שטוען את הקריאה מתוך המאגר החיצוני, שילוב של טבלת DeviceEvent מול שדה כתובות שבודק את כלל הכתובות במאגר, ולסיום נציג שדות שיזקקו את הנתונים.
let MalIPs = (externaldata(ip:string) [@"https://raw.githubusercontent.com/CriticalPathSecurity/Public-Intelligence-Feeds/master/compromised-ips.txt"] with(format="csv") | where ip matches regex "(^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$)" | distinct ip ); DeviceEvents | where RemoteIP in (MalIPs) | project Timestamp, DeviceName, LocalPort, RemotePort, RemoteUrl
לסיום, כך נראית שאילתה שקוראת לנתונים חיצונים ומחפשת מול טבלה ספציפית האם נעשה ניסיון לגשת או לצאת לאחת מתוך אותן כתובות זדוניות.
מאמרים נוספים לגבי Threat Hunting