re.capture_all
re.capture_all(stringText, regex)
Beschreibung
Mit der Funktion re.capture_all() können Sie alle nicht überlappenden Übereinstimmungen eines regulären Ausdrucks aus einem String extrahieren. Die Standardfunktion re.capture() wird nach der ersten gefundenen Übereinstimmung beendet, während re.capture_all() den gesamten String durchsucht, um jede Instanz zu ermitteln, die mit Ihrem Muster übereinstimmt.
Diese Funktion akzeptiert zwei Argumente:
string_to_search: Der Eingabestring oder das UDM-Feld, in dem Sie suchen möchten.regex_pattern: Der reguläre Ausdruck, den Sie anwenden. Hinweis: Dieser reguläre Ausdruck darf nicht mehr als eine Erfassungsgruppe enthalten.
Gängige Anwendungsfälle
Mit re.capture_all() können Sie Szenarien lösen, in denen ein einzelnes Logfeld mehrere wertvolle Datenpunkte enthält.
- Mehrere Indikatoren extrahieren:Alle IP-Adressen, URLs oder Hostnamen aus einer einzelnen Log-Nachricht oder einem einzelnen Beschreibungsfeld abrufen.
- Begrenzte Daten parsen:Bestimmte Werte aus Feldern isolieren, in denen mehrere Informationen durch Kommas, Semikolons oder in Kombination mit anderem Text getrennt sind.
- Freiformtext analysieren:Unstrukturierte Felder wie Notizen oder Kommentare werden gescannt, um alle Musterübereinstimmungen zu identifizieren, z. B. Dateipfade oder Registrierungsschlüssel.
- Befehlszeilen prüfen:Extrahieren Sie alle Argumente oder bestimmte Flags aus der Befehlszeile eines Prozesses, um den Umfang eines Befehls besser zu verstehen.
Parameterdatentypen
STRING, STRING
Rückgabetyp
ARRAY_STRINGS
Beispiele
In diesem Abschnitt finden Sie Beispiele, die zeigen, wie Sie re.capture_all() auf verschiedene Arten von Telemetriedaten anwenden. Sie verwenden diese Muster im Abschnitt events, um Daten zu filtern, oder im Abschnitt outcome, um Ihre endgültigen Benachrichtigungen zur Erkennung anzureichern.
Beispiel: Fünften .conf-Pfad aus einer Befehlszeile extrahieren
In diesem Suchbeispiel wird zuerst geprüft, ob .conf in einer Befehlszeile vorhanden ist.
Anschließend wird die vollständige Befehlszeile gespeichert und das fünfte Vorkommen eines bestimmten Musters im Zusammenhang mit .conf-Dateipfaden extrahiert. Sie können die Funktion re.capture_all() mit arrays.index_to_str() kombinieren, um ein bestimmtes Vorkommen zu extrahieren, z. B. den fünften .conf-Pfad aus einer Befehlszeile.
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)
Beispiel: Alle Wörter extrahieren, die mit error beginnen
In diesem Beispiel werden alle Wörter, die mit error beginnen, aus einer Beschreibung des Sicherheitsergebnisses erfasst und in einem Array namens $all_errors gespeichert.
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
}
Beispiel: Alle erfassten IP-ähnlichen Muster aus einem User-Agent-String zusammenführen
In diesem Beispiel werden alle IPv4-Adressen aus dem Feld network.http.user_agent von Sicherheitsereignissen extrahiert.
Da re.capture_all() ein Array zurückgibt, können Sie arrays.join_string() verwenden, um diese Übereinstimmungen in einer einzigen, lesbaren Liste zusammenzuführen.
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
}
Bekannte Einschränkungen
- Einzelne Erfassungsgruppe:Der reguläre Ausdruck, der mit
re.capture_all()verwendet wird, darf nicht mehr als eine Erfassungsgruppe enthalten. - Array-Rückgabetyp:Die Funktion gibt ein Array von Strings zurück. Wenn Sie das Ergebnis einer Ereignisvariablen zuweisen oder in Funktionen verwenden möchten, die einen einzelnen String erwarten, müssen Sie es in der Regel mit
arrays.join_string()umschließen.