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