Skip to main content

Regexes

Online help & Tools

 

Various Patterns
# MAC Address:
^([0-9a-zA-Z]{2}[:-]){5}([0-9a-zA-Z]{2})$
([0-9a-zA-Z]{2}[:-]){5}
([0-9a-fA-F][0-9a-fA-F]:){5}([0-9a-fA-F][0-9a-fA-F])

# IP Address:
\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}
(\d(.+?).\d(.+?).\d(.+?).)
(\d+.\d+.\d+.\d+)

# DOMAIN:
([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,6}
(\w+://\w{3}.\w+.\w{3})
(\w+://\w{3}.\w+.\w+.\w{3})

# DATE:
(19|20)\d\d([- /.])(0[1-9]|1[012])\2(0[1-9]|[12][0-9]|3[01])
(\d{4}/\d{2}/\d{2})

# TIME:
(\d{2}:\d{2}:\d{2})

# EMAIL:
^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$
(\w+.\w+@\w+.\w{1,3})

# Clear text
[^\w"',:;\.=\-\(\)\'\}~_%\\\$\s\[\]@\?<>€#/]

Optimisation

Au préalable
    Sortir la payload que l'on souhaite parsé hors qradar (l'assistant Qradar est assez pauvre) si la regex est un peu complexe Anonimiser le logs (pas de nom de client, et transformer l'uid) De nombreux sites existent comme regex101.com
    Type de donnée à parser

    Voici des exemples afin d'extraire certain type d'information

      IP : [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3} Suite de nombres : \d+ Suite de caractères simple : \w+ Suite de caractères non simple avec un espace uniquement à la fin : \S+ Suite de caractères séparés par un séparateur unique à la fin comme une virgule [^,]+

      Localiser la valeur

        Si description de la valeur est présente dans le log
        ex : username=xavier action=regex
        regex username=(\w+) S'il y a plusieurs description de valeur identique dans le log et qu’on veut le dernier
        ex : username=xavier action=regex cible username=patrick action=lire

        S’il n’y a pas de description que les champs sont séparés par des virgules
        ex : 20181009,1.1.1.1,14789,xyzp,2.2.2.2,445,exploitms10-017
        Alors chercher une valeur de référence dans le log comme une IP suivi d’une suite de chiffres :
        regex : [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3},\d+,(\w+)

        Diverses expressions
        ^ debut de ligne
        $ fin de ligne
        \d digit
        \D non digit
        \s espace
        \S non espace
        \w word [a-z-A-Z0-9_]
        \W non word
        [ ] choix multiple
        {n} nombre d'occurences
        + 1 ou X fois
        * 0 ou x fois
        ? 0 ou x fois, en mode "lazy"

        Exemple d'impact
        Regex : account="(.*?)" -> 41900 steps -> etalon
        Regex : account="([^"]+?)" -> 39998 steps
        Regex : account="([^"]+)" -> 28856 steps
        Regex : account="([^"]+) -> 27635 steps -> meilleur choix

        Enfin, en cas de problème coté build sur une regex, le noter et le RUN pourra vous aider ou vous pouvez contacter Xavier Thouroude ainsi que Florent Gontharet.

        Rendre "lazy" (= mettre "?" à la suite d'un sélecteur) n'est pas toujours rentable
        Regex:
        action="(.*)" action="(.*?)"

        Debug:
        Beginning match attempt at char 15 Beginning match attempt at char 15
        1 a 1 a
        2 ac 2 ac
        3 act 3 act
        4 acti 4 acti
        5 actio 5 actio
        6 action 6 action
        7 action= 7 action=
        8 action=" 8 action="
        9 action="regex" 9 action=" ok
        10 action="regex" 10 action=" ok
        11 action="regex"backtrack 11 action=" backtrack
        12 action="regex 12 action="r
        13 action="regex 13 action="r
        14 action="regex" 14 action="r backtrack
        Match found in 14 steps 15 action="re
        16 action="re
        17 action="re backtrack
        18 action="reg
        19 action="reg
        20 action="reg backtrack
        21 action="rege
        22 action="rege
        23 action="rege backtrack
        24 action="regex
        25 action="regex
        26 action="regex"
        Match found in 26 steps

        Pour aller plus loin
        www.loggly.com/blog/regexes-the-bad-better-best/
        www.loggly.com/blog/five-invaluable-techniques-to-improve-regex-performance/
        www.expreg.com/optimisation.php
        www.rexegg.com/regex-optimizations.html