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
}
示例:联接用户代理字符串中捕获的所有类似 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()将其封装起来。