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 位址、網址或主機名稱。
  • 剖析分隔資料:從欄位中擷取特定值,這些欄位包含多個以半形逗號、半形分號分隔的資訊,或與其他文字混雜。
  • 分析任意格式的文字:掃描非結構化欄位 (例如「附註」或「留言」),找出所有符合模式的內容,例如檔案路徑或登錄機碼。
  • 稽核指令列:從程序指令列擷取所有引數或特定標記,以便瞭解指令範圍。

參數資料類型

STRINGSTRING

傳回類型

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
}
範例:從 User-Agent 字串中擷取所有類似 IP 的模式並加入

在這個規則範例中,您會從安全事件的 network.http.user_agent 欄位擷取所有 IPv4 位址。

由於 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() 包裝結果。