Regexes
Online help & Tools
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
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
regex:cible\s+username=(\w+) - 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 loinwww.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