re.capture_all
re.capture_all(stringText, regex)
説明
re.capture_all() 関数を使用して、文字列から正規表現の重複しない一致をすべて抽出します。標準の re.capture() 関数は最初の一致が見つかると停止しますが、re.capture_all() は文字列全体を検索して、パターンに一致するすべてのインスタンスを特定します。
この関数は次の 2 つの引数を取ります。
string_to_search: 検索する入力文字列または UDM フィールド。regex_pattern: 適用する正規表現。注: この正規表現には、キャプチャ グループを 1 つだけ含める必要があります。
一般的なユースケース
re.capture_all() は、単一のログフィールドに複数の有用なデータポイントが含まれているシナリオを解決するために使用します。
- 複数のインジケーターを抽出する: 単一のログメッセージまたは説明フィールドからすべての IP アドレス、URL、ホスト名を取得します。
- 区切り文字で区切られたデータを解析する: 複数の情報がカンマやセミコロンで区切られているフィールドや、他のテキストと混在しているフィールドから、特定の値を抽出します。
- 自由形式のテキストを分析する: 非構造化フィールド([メモ] や [コメント] など)をスキャンして、ファイルパスやレジストリキーなどのパターン マッチをすべて特定します。
- コマンドラインの監査: プロセスのコマンドラインからすべての引数または特定のフラグを抽出し、コマンドの範囲を把握します。
パラメータのデータ型
STRING、STRING
戻り値の型
ARRAY_STRINGS
例
このセクションでは、さまざまなタイプのテレメトリーに re.capture_all() を適用する方法を示す例を示します。これらのパターンは、events セクションでデータをフィルタリングするか、outcome セクションで最終的な検出アラートを拡充するために使用します。
例: コマンドラインから 5 番目の .conf パスを抽出する
この検索例では、まずコマンドラインに .conf が存在することを確認します。
次に、完全なコマンドラインを保存し、.conf ファイルパスに関連する特定のパターンの 5 番目の出現を抽出します。re.capture_all() 関数と arrays.index_to_str() を組み合わせて、コマンドラインから 5 番目の .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() を使用してこれらの一致を 1 つの読み取り可能なリストに統合できます。
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()でラップする必要があります。