Loading
_ DESCIFRANDO CONEXIÓN SEGURA...

Extraer campos de un registro

4 tareas · 45 min · Principiante

Hasta aquí los patrones servían para filtrar líneas. Ahora sirven para partirlas. El proxy de Curtiembres del Atrato escribe una línea por petición, con la hora, la persona, la dirección, el método, el dominio, la ruta, el estado y los bytes todos pegados, y el SIEM no los separó. Con un patrón puedes ponerle nombre a cada trozo —un grupo con nombre— y desde ahí sumar, contar o filtrar como con cualquier campo. Lo haces en SPL con rex y en KQL con extract, y miras lo que casi nadie mira: qué líneas el patrón no supo leer. Todo es lectura de registros ya escritos.

0 de 4 · 0%

Objetivo de la sala

Hasta aquí los patrones servían para filtrar líneas. Ahora sirven para partirlas. El proxy de Curtiembres del Atrato escribe una línea por petición, con la hora, la persona, la dirección, el método, el dominio, la ruta, el estado y los bytes todos pegados, y el SIEM no los separó. Con un patrón puedes ponerle nombre a cada trozo —un grupo con nombre— y desde ahí sumar, contar o filtrar como con cualquier campo. Lo haces en SPL con rex y en KQL con extract, y miras lo que casi nadie mira: qué líneas el patrón no supo leer. Todo es lectura de registros ya escritos.

Un grupo ( … ) guarda lo que casó dentro. Si lleva un nombre, (?<usuario>\S+), ese trozo se convierte en un campo con ese nombre. En SPL, el comando rex aplica un patrón al texto y crea un campo por cada grupo con nombre:

index=proxy | rex "^\S+ \S+ (?<usuario>\S+) (?<ip>\S+) "

Se lee de izquierda a derecha, igual que la línea: dos palabras que se ignoran (la hora y el equipo), una palabra que se guarda como usuario y otra que se guarda como ip. El patrón no sabe lo que es un usuario; solo cuenta palabras separadas por espacios, y por eso depende de que la línea siempre tenga esa forma.

Responde para continuar

En un patrón de rex, ¿qué hace exactamente `(?<ip>\S+)`?

Ver pista de ayuda

El nombre entre < y > solo etiqueta el trozo; lo que casa lo decide \S+.

Con los campos recién extraídos se pregunta lo de siempre. El patrón completo de una línea del proxy tiene nueve piezas; con él se suman los bytes de cada persona.

index=proxy | rex "^\S+ \S+ (?<usuario>\S+) (?<ip>\S+) (?<metodo>[A-Z]+) (?<dominio>\S+) (?<ruta>\S+) (?<estado>\d{3}) (?<bytes>\d+)$" | stats sum(bytes) as total by usuario | sort - total

\d{3} es el código de estado, tres dígitos, y [A-Z]+ es el método en mayúsculas. La persona que más bytes baja en total no tiene por qué ser la que hizo la descarga más grande: pesa la suma de todas sus peticiones.

Responde para continuar

Escribe el usuario que más bytes sumó en total en el proxy.

Ver pista de ayuda

Ejecuta la búsqueda de arriba y lee la primera fila. Después mira la tabla `index=proxy` y compara con quién hizo la petición más grande.

En KQL la pieza es extract(patrón, grupo, texto): devuelve lo que casó el grupo número grupo, contando los paréntesis de izquierda a derecha, o vacío si no casa. Se usa dentro de extend, que añade columnas. Delante del patrón va una @, que significa «cadena literal» y evita duplicar cada barra invertida.

proxy
| extend estado = toint(extract(@" (\d{3}) \d+$", 1, Raw)),
         dominio = extract(@" (\S+\.example\S*) ", 1, Raw)
| where estado >= 400
| summarize veces = count() by dominio, estado
| sort by veces desc

Se queda con las peticiones que terminaron en error de cliente o de servidor y cuenta cuántas hubo por dominio y estado. No hace falta repasar las catorce líneas con la vista.

Responde para continuar

Escribe el dominio que respondió con el estado 403 más veces.

Ver pista de ayuda

Ejecuta `proxy | extend estado = toint(extract(@" (\d{3}) \d+$", 1, Raw)), dominio = extract(@" (\S+\.example\S*) ", 1, Raw) | where estado >= 400 | summarize veces = count() by dominio, estado | sort by veces desc` y lee la fila del 403.

Un patrón escrito para una forma de línea no avisa cuando aparece otra: el campo queda vacío y el análisis sigue sin esa línea. La suma de la tarea 2 no sabe cuánto tráfico quedó fuera. La forma de enterarse es preguntar por los vacíos, con where isnull(estado):

index=proxy | rex "<el mismo patrón>" | where isnull(estado) | table _raw

Un analista que construye una extracción siempre hace esa pregunta antes de confiar en una cifra. Si el patrón pierde líneas, hay que ampliarlo, y una vez ampliado hay que repetir la pregunta.

Responde para continuar

Escribe el método de las líneas del proxy que el patrón de nueve piezas no extrae.

Ver pista de ayuda

Ejecuta `index=proxy | rex "^\S+ \S+ (?<usuario>\S+) (?<ip>\S+) (?<metodo>[A-Z]+) (?<dominio>\S+) (?<ruta>\S+) (?<estado>\d{3}) (?<bytes>\d+)$" | where isnull(estado) | table _raw` y lee el método de las dos líneas.

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