Regexes
Online help & Tools
- https://www.rexegg.com/regex-quickstart.html
- https://www.regular-expressions.info/
- 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
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
No comments to display
No comments to display