Parte: 0 — Fundamentos y prerrequisitos · Fuente: Friedl, Mastering Regular Expressions (O'Reilly) ⏱️ Duración estimada: 100 min · Nivel: Fundamentos
Dominar las expresiones regulares para extraer, validar y correlacionar información en logs, capturas y volcados de datos. Las regex son omnipresentes en SIEM, IDS, grep y herramientas de análisis; saber escribirlas bien multiplica tu velocidad como analista.
Al finalizar, el alumno podrá:
grep -P, Python (re) y herramientas de análisis.| # | Tema | Por qué importa |
|---|---|---|
| 1 | Literales y metacaracteres | La base de todo patrón |
| 2 | Clases de caracteres | [...], \d, \w, \s |
| 3 | Cuantificadores | *, +, ?, {n,m} |
| 4 | Anclas y límites | ^, $, \b |
| 5 | Grupos y captura | (...), alternancia, no captura |
| 6 | Codicia y pereza | .* vs. .*? |
| 7 | Extracción de IOCs | IPs, hashes, dominios |
| 8 | ReDoS | Regex que se cuelgan |
. * + ? [ ] ( ) ^ $ \). Clave: escapar con \ para tratarlo como literal.[a-f0-9]). Clave: \d = dígito, \w = alfanumérico+_, \s = espacio.*/+ intentan capturar lo máximo. Clave: .*? (perezoso) captura lo mínimo; crucial para no "tragar" de más.(...) guarda lo coincidido para reutilizarlo. Clave: (?:...) agrupa sin capturar.^ (inicio), $ (fin), \b (límite de palabra). Clave: evita coincidencias parciales no deseadas.Practica con grep -P (PCRE), Python re, y un entorno visual como regex101.com (elige el motor PCRE/Python) para ver el árbol de coincidencias. Ten a mano un log real (auth.log, access.log) y una muestra de texto con IOCs para extraer.
HH:MM:SS en un log:bash
grep -oP '\b\d{2}:\d{2}:\d{2}\b' auth.log | head
bash
grep -oP '\b(?:\d{1,3}\.){3}\d{1,3}\b' access.log | sort | uniq -c | sort -nr
python
import re
m = re.search(r'Failed password for (\w+) from ([\d.]+)', linea)
if m: usuario, ip = m.group(1), m.group(2)
bash
grep -oP '\b[a-fA-F0-9]{64}\b' muestra.txt # SHA-256
http(s).<.*> y <.*?> sobre <a><b> y observa la diferencia.Escribe iocextract.py, una herramienta que reciba un archivo de texto y extraiga y clasifique IOCs: IPv4, dominios, URLs, correos y hashes (MD5/SHA-1/SHA-256), imprimiendo un recuento por categoría y la lista deduplicada. Usa grupos con nombre y evita patrones vulnerables a ReDoS.
Criterio de aceptación: sobre una muestra con IOCs conocidos, la herramienta los extrae todos sin falsos positivos evidentes, clasifica correctamente los tres tipos de hash por longitud, y deduplica. El código no contiene cuantificadores anidados peligrosos. Verificable contando manualmente los IOCs de la muestra.
| Síntoma / mensaje | Causa y cómo arreglar |
|---|---|
| El patrón captura de más | Cuantificador codicioso. Usa versión perezosa *? o clases más específicas. |
. no coincide con lo esperado |
. no incluye salto de línea por defecto. Usa flag DOTALL si lo necesitas. |
| Falsos positivos en IPs (999.999.999.999) | El patrón no valida rangos 0-255. Refínalo o valida después con código. |
grep no entiende \d |
grep básico no es PCRE. Usa grep -P o -E con clases POSIX. |
| La regex cuelga el proceso | ReDoS por retroceso. Simplifica y evita (a+)+ sobre entradas largas. |
❓ ¿Debo validar IPs solo con regex? La regex acota candidatos, pero validar rangos 0-255 exactos con regex es engorroso. Es mejor extraer con regex y validar con código (ipaddress en Python).
❓ ¿Por qué mi regex funciona en regex101 pero no en grep? Los motores difieren. grep básico usa BRE/ERE; PCRE (regex101/Python) admite \d, lookarounds, etc. Ajusta al motor real.
❓ ¿Qué es un lookahead/lookbehind? Aserciones que comprueban contexto sin consumirlo ((?=...), (?<=...)). Útiles para extraer algo "seguido de" o "precedido por" sin incluirlo.
❓ ¿Regex sirve para parsear HTML/JSON? Para extracciones puntuales sí, pero para estructuras anidadas usa parsers dedicados. La regex no maneja bien anidamiento arbitrario.
re — https://docs.python.org/3/library/re.htmlClase 018 — Git y control de versiones para profesionales de seguridad
Clase 020 — Sistemas de numeración y encoding: binario, hex, base64 y URL