re.capture_all

re.capture_all(stringText, regex)

Description

Utilisez la fonction re.capture_all() pour extraire chaque correspondance non chevauchante d'une expression régulière à partir d'une chaîne. Alors que la fonction re.capture() standard s'arrête après la première correspondance trouvée, re.capture_all() continue de parcourir toute la chaîne pour identifier chaque instance correspondant à votre modèle.

Cette fonction utilise deux arguments :

  • string_to_search : chaîne d'entrée ou champ UDM que vous souhaitez rechercher.
  • regex_pattern : expression régulière que vous appliquez. Remarque : Cette expression régulière ne doit pas contenir plus d'un groupe de capture.

Cas d'utilisation courants

Vous utilisez re.capture_all() pour résoudre les scénarios dans lesquels un seul champ de journal contient plusieurs points de données intéressants.

  • Extraire plusieurs indicateurs : extraire toutes les adresses IP, les URL ou les noms d'hôte d'un seul message de journal ou champ de description.
  • Analyser les données délimitées : isolez des valeurs spécifiques à partir de champs où plusieurs informations sont séparées par des virgules, des points-virgules ou mélangées à d'autres textes.
  • Analyser le texte libre : analysez les champs non structurés (comme Notes ou Commentaires) pour identifier chaque correspondance de modèle, comme les chemins d'accès aux fichiers ou les clés de registre.
  • Auditer les lignes de commande : extrayez tous les arguments ou indicateurs spécifiques d'une ligne de commande de processus pour mieux comprendre la portée d'une commande.

Types de données des paramètres

STRING – STRING

Type renvoyé

ARRAY_STRINGS

Exemples

Cette section présente des exemples qui montrent comment appliquer re.capture_all() à différents types de données de télémétrie. Vous utilisez ces modèles dans la section events pour filtrer les données ou dans la section outcome pour enrichir vos alertes de détection finales.

Exemple : Extraire le cinquième chemin d'accès .conf à partir d'une ligne de commande

Cet exemple de recherche confirme d'abord la présence de .conf dans une ligne de commande.

Il enregistre ensuite la ligne de commande complète et extrait la cinquième occurrence d'un modèle spécifique lié aux chemins d'accès aux fichiers .conf. Vous pouvez combiner la fonction re.capture_all() avec arrays.index_to_str() pour extraire une occurrence spécifique, comme le cinquième chemin .conf à partir d'une ligne de commande.

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)
Exemple : Extraire tous les mots commençant par error

Dans cet exemple de règle, vous capturez chaque mot commençant par error à partir de la description d'un résultat de sécurité et vous les stockez dans un tableau appelé $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
}
Exemple : Joindre tous les modèles de type adresse IP capturés à partir d'une chaîne User-Agent

Dans cet exemple de règle, vous extrayez toutes les adresses IPv4 du champ network.http.user_agent des événements de sécurité.

Comme re.capture_all() renvoie un tableau, vous pouvez utiliser arrays.join_string() pour fusionner ces correspondances dans une seule liste lisible.

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
}

Limitations connues

  • Un seul groupe de capture : l'expression régulière utilisée avec re.capture_all() ne doit pas contenir plus d'un groupe de capture.
  • Type de retour de tableau : la fonction renvoie un tableau de chaînes. Pour attribuer le résultat à une variable d'événement ou l'utiliser dans des fonctions qui attendent une seule chaîne, vous devez généralement l'encapsuler avec arrays.join_string().