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().