re.capture_all
re.capture_all(stringText, regex)
תיאור
אפשר להשתמש בפונקציה re.capture_all() כדי לחלץ מחרוזת מכל התאמה לא חופפת של ביטוי רגולרי. הפונקציה הרגילה re.capture() מפסיקה אחרי שהיא מוצאת את ההתאמה הראשונה, אבל הפונקציה re.capture_all() ממשיכה לסרוק את כל המחרוזת כדי לזהות כל מופע שתואם לתבנית.
הפונקציה הזו מקבלת שני ארגומנטים:
-
string_to_search: מחרוזת הקלט או שדה ה-UDM שרוצים לחפש. -
regex_pattern: הביטוי הרגולרי שאתם מחילים. הערה: הביטוי הרגולרי הזה לא יכול להכיל יותר מקבוצה אחת לחילוץ.
תרחישים נפוצים לדוגמה
משתמשים בפונקציה re.capture_all() כדי לפתור תרחישים שבהם שדה יומן יחיד מכיל כמה נקודות נתונים חשובות.
- שליפת כמה אינדיקטורים: שליפת כל כתובות ה-IP, כתובות ה-URL או שמות המארחים משדה תיאור או הודעת יומן יחידה.
- ניתוח נתונים מופרדים: בידוד ערכים ספציפיים משדות שבהם כמה פריטי מידע מופרדים באמצעות פסיקים, נקודה-פסיק או טקסט אחר.
- ניתוח טקסט חופשי: סריקת שדות לא מובנים (כמו הערות או תגובות) כדי לזהות כל התאמה לדפוס, כמו נתיבי קבצים או מפתחות רישום.
- ביקורת על שורות פקודה: חילוץ של כל הארגומנטים או של תגים ספציפיים משורת פקודה של תהליך, כדי להבין טוב יותר את היקף הפקודה.
סוגי נתונים של פרמטרים
STRING, STRING
סוג הערך שמוחזר
ARRAY_STRINGS
דוגמאות
בקטע הזה מוצגות דוגמאות שממחישות איך משתמשים ב-re.capture_all() עם סוגים שונים של טלמטריה. אפשר להשתמש בדפוסים האלה בקטע events כדי לסנן נתונים, או בקטע outcome כדי להוסיף הקשר להתראות הסופיות על זיהוי.
דוגמה: חילוץ הנתיב החמישי של קובץ .conf משורת פקודה
בדוגמה הזו של חיפוש, קודם מאשרים את הנוכחות של .conf בשורת פקודה.
לאחר מכן, הפקודה שומרת את שורת הפקודה המלאה ומחלצת את המופע החמישי של תבנית ספציפית שקשורה לנתיבי קבצים של .conf. אפשר לשלב את הפונקציה re.capture_all() עם arrays.index_to_str() כדי לחלץ מופע ספציפי, כמו הנתיב החמישי .conf משורת פקודה.
re.regex(principal.process.command_line, `\.conf`)
$command_line = principal.process.command_line
$path_component_5 = arrays.index_to_str(re.capture_all(principal.process.command_line, `[s='"]([^'"=s]*.conf)`), 4)
דוגמה: חילוץ כל המילים שמתחילות ב-error
בדוגמה הזו של כלל, כל מילה שמתחילה ב-error מתוך תיאור של תוצאת אבטחה נשמרת במערך שנקרא $all_errors.
rule ExtractErrors {
meta:
author = "user@example.com"
events:
$e.principal.hostname = "server1"
$log_message = $e.security_result[0].description
outcome:
$all_errors = re.capture_all($log_message, `error\w+`)
condition:
$e
}
דוגמה: הצטרפות לכל הדפוסים שדומים לכתובות IP שמופיעים במחרוזת User-Agent
בדוגמה הזו של כלל, אתם מחלצים את כל כתובות ה-IPv4 מהשדה network.http.user_agent של אירועי אבטחה.
הפונקציה re.capture_all() מחזירה מערך, ולכן אפשר להשתמש בפונקציה arrays.join_string() כדי למזג את ההתאמות האלה לרשימה אחת שקל לקרוא.
rule CaptureAllIPs {
meta:
author = "user@example.com"
events:
$e.network.http.user_agent != ""
$captured_ips = arrays.join_string(re.capture_all($e.network.http.user_agent, `\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}`), ", ")
condition:
$e
}
מגבלות ידועות
- קבוצת לכידה אחת: הביטוי הרגולרי שמשמש עם התג
re.capture_all()לא יכול להכיל יותר מקבוצת לכידה אחת. - סוג ההחזרה של המערך: הפונקציה מחזירה מערך של מחרוזות. כדי להקצות את התוצאה למשתנה של אירוע או להשתמש בה בפונקציות שמצפות למחרוזת אחת, בדרך כלל צריך להוסיף לה את התו
arrays.join_string().