re.capture_all

re.capture_all(stringText, regex)

Descrição

Use a função re.capture_all() para extrair todas as correspondências não sobrepostas de uma expressão regular de uma string. Enquanto a função padrão re.capture() para após a primeira correspondência encontrada, re.capture_all() continua por toda a string para identificar todas as instâncias que correspondem ao seu padrão.

Essa função usa dois argumentos:

  • string_to_search: a string de entrada ou o campo UDM que você quer pesquisar.
  • regex_pattern: a expressão regular que você aplica. Observação: essa expressão regular não pode conter mais de um grupo de captura.

Casos de uso comuns

Você usa re.capture_all() para resolver cenários em que um único campo de registro contém vários pontos de dados valiosos.

  • Extrair vários indicadores:extraia todos os endereços IP, URLs ou nomes de host de uma única mensagem de registro ou campo de descrição.
  • Analisar dados delimitados:isola valores específicos de campos em que várias informações são separadas por vírgulas, pontos e vírgulas ou misturadas com outros textos.
  • Analisar texto de forma livre:verifique campos não estruturados (como Observações ou Comentários) para identificar todas as correspondências de padrões, como caminhos de arquivo ou chaves de registro.
  • Linhas de comando de auditoria:extraia todos os argumentos ou flags específicos de uma linha de comando de processo para entender melhor o escopo de um comando.

Tipos de dados de parâmetros

STRING, STRING

Tipo de retorno

ARRAY_STRINGS

Exemplos

Esta seção mostra exemplos de como aplicar re.capture_all() a diferentes tipos de telemetria. Você usa esses padrões na seção events para filtrar dados ou na seção outcome para enriquecer seus alertas de detecção finais.

Exemplo: extrair o quinto caminho .conf de uma linha de comando

Este exemplo de pesquisa primeiro confirma a presença de .conf em uma linha de comando.

Em seguida, ele salva a linha de comando completa e extrai a quinta ocorrência de um padrão específico relacionado a caminhos de arquivo .conf. Você pode combinar a função re.capture_all() com arrays.index_to_str() para extrair uma ocorrência específica, como o quinto caminho .conf de uma linha de comando.

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)
Exemplo: extrair todas as palavras que começam com error

Neste exemplo de regra, você captura todas as palavras que começam com error de uma descrição de resultado de segurança e as armazena em uma matriz chamada $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
}
Exemplo: combinar todos os padrões semelhantes a IP capturados de uma string de user agent

Neste exemplo de regra, você extrai todos os endereços IPv4 do campo network.http.user_agent de eventos de segurança.

Como re.capture_all() retorna uma matriz, é possível usar arrays.join_string() para mesclar essas correspondências em uma única lista legível.

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
}

Limitações conhecidas

  • Grupo de captura único:a expressão regular usada com re.capture_all() não pode conter mais de um grupo de captura.
  • Tipo de retorno da matriz:a função retorna uma matriz de strings. Para atribuir o resultado a uma variável de evento ou usá-lo em funções que esperam uma única string, geralmente é necessário envolvê-lo com arrays.join_string().