Loading
_ DESCIFRANDO CONEXIÓN SEGURA...

La 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.

0 de 4 · 0%

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»?

Inicia sesión para registrar tus puntos y progreso en el ranking.

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