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