re.capture_all

re.capture_all(stringText, regex)

Descrizione

Utilizza la funzione re.capture_all() per estrarre ogni corrispondenza non sovrapposta di un'espressione regolare da una stringa. Mentre la funzione standard re.capture() si interrompe dopo la prima corrispondenza trovata, re.capture_all() continua a scorrere l'intera stringa per identificare ogni istanza che corrisponde al pattern.

Questa funzione accetta due argomenti:

  • string_to_search: La stringa di input o il campo UDM in cui vuoi eseguire la ricerca.
  • regex_pattern: l'espressione regolare che applichi. Nota: questa espressione regolare non deve contenere più di un gruppo di acquisizione.

Casi d'uso comuni

Utilizzi re.capture_all() per risolvere scenari in cui un singolo campo di log contiene più punti dati preziosi.

  • Estrai più indicatori: estrai tutti gli indirizzi IP, gli URL o i nomi host da un singolo messaggio di log o campo di descrizione.
  • Analizza dati delimitati:isola valori specifici da campi in cui più informazioni sono separate da virgole, punti e virgola o miste ad altro testo.
  • Analizza il testo in formato libero:esegui la scansione dei campi non strutturati (come Note o Commenti) per identificare ogni corrispondenza di pattern, ad esempio percorsi di file o chiavi del registro.
  • Righe di comando di controllo:estrai tutti gli argomenti o i flag specifici da una riga di comando del processo per comprendere meglio l'ambito di un comando.

Tipi di dati dei parametri

STRING, STRING

Tipo restituito

ARRAY_STRINGS

Esempi

Questa sezione mostra esempi che illustrano come applicare re.capture_all() a diversi tipi di telemetria. Utilizzi questi pattern nella sezione events per filtrare i dati o nella sezione outcome per arricchire gli avvisi di rilevamento finali.

Esempio: estrarre il quinto percorso .conf da una riga di comando

Questo esempio di ricerca conferma innanzitutto la presenza di .conf in una riga di comando.

Salva quindi la riga di comando completa ed estrae la quinta occorrenza di un pattern specifico correlato ai percorsi dei file .conf. Puoi combinare la funzione re.capture_all() con arrays.index_to_str() per estrarre un'occorrenza specifica, ad esempio il quinto percorso .conf da una riga di 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)
Esempio: estrai tutte le parole che iniziano con error

In questo esempio di regola, acquisisci ogni parola che inizia con error dalla descrizione di un risultato di sicurezza e le memorizzi in un array chiamato $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
}
Esempio: unisci tutti i pattern simili a IP acquisiti da una stringa User-Agent

In questo esempio di regola, estrai tutti gli indirizzi IPv4 dal campo network.http.user_agent degli eventi di sicurezza.

Poiché re.capture_all() restituisce un array, puoi utilizzare arrays.join_string() per unire queste corrispondenze in un unico elenco leggibile.

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
}

Limitazioni note

  • Singolo gruppo di acquisizione:l'espressione regolare utilizzata con re.capture_all() non deve contenere più di un gruppo di acquisizione.
  • Tipo restituito dell'array:la funzione restituisce un array di stringhe. Per assegnare il risultato a una variabile evento o per utilizzarlo in funzioni che prevedono una singola stringa, in genere devi racchiuderlo tra arrays.join_string().