🔒 Registro cerrado · Apertura oficial próximamente · Acceso exclusivo para alumnos activos
Iniciar SesiónLa codicia y los límites del patrón
4 tareas · 40 min · Principiante
Un patrón que funciona con la primera línea de prueba y se rompe con la tercera casi siempre se rompe por lo mismo: toma más de lo que debía. Los cuantificadores son codiciosos por defecto, y en una línea con dos direcciones entre menor y mayor se llevan las dos y lo que hay en medio. Aquí lees el registro del servidor de correo de Curtiembres del Atrato, ves un campo salirse de sus límites, lo corriges de tres maneras y aprendes la frontera de palabra para que una dirección no se confunda con otra que empieza igual. Todo es lectura de registros ya escritos.
Objetivo de la sala
Un patrón que funciona con la primera línea de prueba y se rompe con la tercera casi siempre se rompe por lo mismo: toma más de lo que debía. Los cuantificadores son codiciosos por defecto, y en una línea con dos direcciones entre menor y mayor se llevan las dos y lo que hay en medio. Aquí lees el registro del servidor de correo de Curtiembres del Atrato, ves un campo salirse de sus límites, lo corriges de tres maneras y aprendes la frontera de palabra para que una dirección no se confunda con otra que empieza igual. Todo es lectura de registros ya escritos.Por defecto, * y + son codiciosos: toman la mayor cantidad de texto posible y solo retroceden lo necesario para que el resto del patrón encaje. En una línea con una sola dirección eso pasa desapercibido. En una con dos, no.
El servidor de correo escribe un destino así: to=<[email protected]>, orig_to=<[email protected]>, relay=…. El patrón to=<(?<para>.*)> empieza en el primer < y quiere un > al final. El .* avanza hasta el final de la línea y retrocede hasta el último > que encuentra, no el primero.
Hay dos formas de decirle que pare antes. .*? es la versión perezosa: toma lo mínimo hasta el primer >. La otra es una clase negada, [^>]+: «una o más cosas que no sean >».
Responde para continuar
Sobre la línea `to=<[email protected]>, orig_to=<[email protected]>` aplicas `to=<(?<para>.*)>`. ¿Qué valor queda en para?
Ver pista de ayuda
El asterisco toma lo máximo y retrocede solo lo necesario. ¿Cuál es el último > de la línea?
En el SIEM, el índice mail guarda el registro del servidor de correo. Ejecuta primero el patrón codicioso y luego el corregido; compara las dos columnas.
index=mail | rex "to=<(?<para>.*)>" | where isnotnull(para) | table para
index=mail | rex "to=<(?<para>[^>]+)>" | where isnotnull(para) | table para
Con el segundo, el destinatario queda solo. El alias que lo cambió, orig_to, tiene su propio patrón, y también acaba en >:
index=mail | rex "orig_to=<(?<original>[^>]+)>" | where isnotnull(original) | table original
Un correo que entregó el servidor a un proveedor fue a una dirección que antes fue otra: el alias la sustituyó. Saber cuál era la original dice a quién iba dirigido de verdad.
Responde para continuar
Escribe la dirección original (orig_to) del correo que el servidor entregó al proveedor-uno.example.
Ver pista de ayuda
Ejecuta `index=mail | rex "orig_to=<(?<original>[^>]+)>" | where isnotnull(original) | table original` y cruza con la línea del relay mx.proveedor-uno.example en `index=mail`.
Otro modo de pasarse es casar una dirección que es el comienzo de otras. 10\.67\.20\.1 casa el puesto con esa dirección exacta, pero también 10.67.20.15 y 10.67.20.100, porque todos empiezan igual. El patrón no dice dónde termina.
La frontera \b no consume ningún carácter: marca el sitio donde un lado es de palabra (letra, dígito o guion bajo) y el otro no. Detrás del 1 de …20.1] viene un corchete, que no es de palabra, y por eso \b casa. Detrás del 1 de …20.15] viene un 5, y no casa.
index=mail | regex _raw="client=\S+\[10\.67\.20\.1" | stats count
index=mail | regex _raw="client=\S+\[10\.67\.20\.1\b" | stats count
Responde para continuar
Escribe cuántas líneas casa el patrón del cliente 10.67.20.1 cuando no lleva la frontera \b.
Ver pista de ayuda
Ejecuta la primera de las dos búsquedas, la que no lleva \b al final, y lee el número que cuenta stats.
Delimitar un campo con una clase negada tiene una ventaja sobre el perezoso: el motor tiene mucho menos que probar y que deshacer para ver si el resto encaja. Dice de entrada qué carácter lo detiene. Por eso [^>]+, [^"]+ o \S+ son la primera opción cuando un campo tiene un cierre claro (una comilla, un corchete, un espacio), y .*? queda para cuando no hay un carácter que lo marque.
Responde para continuar
Un campo siempre va entre comillas dobles y nunca contiene comillas dentro. ¿Cómo lo capturas?
Ver pista de ayuda
En la sala anterior, el cierre de un campo era un carácter claro. ¿Qué clase dice «cualquier cosa menos ese carácter»?
Whoami-Labs Pro
Whoami-Labs Pro utiliza cookies
Utilizamos cookies y almacenamiento local para el funcionamiento del sitio, seguridad de sesión y, si lo autorizas, analítica y marketing. Puedes aceptar, rechazar o personalizar. Política de Privacidad
Preferencias
Configuraciones de cookies
Elige qué categorías permitir. Las esenciales siempre están activas. Consulta la Política de Privacidad.
Esenciales
Siempre activas · sesión, CSRF, tema y esta preferencia
Necesarias para iniciar sesión, proteger formularios (CSRF) y recordar tu elección de cookies y tema. Sin ellas la plataforma no funciona de forma segura.
Analíticos
Hoy no activos en la plataforma; listos para cuando se conecten
Nos ayudan a entender uso de cursos y páginas. Si los activas, se usarán cuando conectemos analítica; hasta entonces no se carga ningún tracker.
Marketing
Hoy no activos; campañas futuras solo con tu permiso
Comunicaciones o campañas. No activos hoy en la plataforma; quedarán listos si los conectamos y solo si los permites.