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().