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