Loading
_ DESCIFRANDO CONEXIÓN SEGURA...

Contar y agrupar — summarize, bin y top

5 tareas · 35 min · Principiante

Leer filas sirve mientras son pocas. Con ciento y pico fallos de inicio de sesión en una noche, la pregunta deja de ser «qué dice cada fila» y pasa a ser «cuántas hay de cada cosa». Aquí conviertes la noche del 7 al 8 de octubre de Delta Cargo en unas pocas filas que se leen de un vistazo: contar por dirección de origen, contar cuentas distintas, repartir en tramos de tiempo y quedarte con lo de arriba de la lista. Y compruebas que lo que más ruido hace no es lo más peligroso.

0 de 5 · 0%

Objetivo de la sala

Leer filas sirve mientras son pocas. Con ciento y pico fallos de inicio de sesión en una noche, la pregunta deja de ser «qué dice cada fila» y pasa a ser «cuántas hay de cada cosa». Aquí conviertes la noche del 7 al 8 de octubre de Delta Cargo en unas pocas filas que se leen de un vistazo: contar por dirección de origen, contar cuentas distintas, repartir en tramos de tiempo y quedarte con lo de arriba de la lista. Y compruebas que lo que más ruido hace no es lo más peligroso.

summarize es el paso que más trabajo te ahorra. Toma todas las filas que le llegan, las agrupa por las columnas que pongas detrás de by y calcula algo para cada grupo. inicios | where resultado == "fallido" | summarize intentos = count() by ip_origen devuelve una fila por cada dirección de origen, con el número de fallos de cada una en una columna que has llamado intentos.

Fíjate en lo que desaparece: después de un summarize solo quedan las columnas del by y las que acabas de calcular. La hora, la cuenta o el motivo ya no existen en el resultado, porque cada fila nueva resume a muchas filas viejas que tenían valores distintos. Si necesitas uno de esos datos, tiene que entrar en el by o en un cálculo, como min(hora) para la primera vez que pasó.

Esta tarea se hace en el laboratorio

Una consola para consultar la base de datos, aquí en la página. No instalas nada y no puedes romper nada.

Conectando con la base…

Responde para continuar

Tras `summarize intentos = count() by ip_origen`, quieres seguir filtrando por la columna `cuenta`. ¿Qué pasa?

Ver pista de ayuda

Cada fila del resultado resume muchas filas con cuentas distintas.

count() cuenta filas. dcount(cuenta) cuenta valores distintos de una columna. En una investigación de inicios de sesión, esa diferencia separa dos dibujos que contando filas se confunden. Un servicio con la contraseña caducada puede fallar cien veces contra una cuenta: mucho volumen, una sola cuenta. Alguien que prueba una contraseña común contra toda la plantilla falla, quizá, veinte veces contra veinte cuentas distintas: poco volumen, muchas cuentas. Esa técnica se llama rociado de contraseñas (en MITRE ATT&CK, T1110.003), y está pensada justo para no hacer ruido.

Por eso en un resumen de fallos se piden las dos cosas a la vez: summarize intentos = count(), cuentas = dcount(cuenta) by ip_origen. Un detalle honesto: dcount es una estimación que el motor calcula rápido sobre millones de filas; con números pequeños coincide con la cuenta exacta, y con números enormes puede desviarse un poco.

Esta tarea se hace en el laboratorio

Una consola para consultar la base de datos, aquí en la página. No instalas nada y no puedes romper nada.

Conectando con la base…

Responde para continuar

Una dirección suma 90 fallos contra 2 cuentas; otra, 20 fallos contra 19 cuentas. ¿Cuál se parece más a un rociado de contraseñas?

Ver pista de ayuda

Compara cuántas cuentas distintas toca cada una, no cuántas filas deja.

Agrupar por la hora exacta no sirve de nada: cada evento tiene la suya. bin(hora, 1h) redondea cada hora hacia abajo al comienzo de su tramo, y así summarize intentos = count() by bin(hora, 1h) da una fila por hora con su total. El tamaño del tramo lo eliges tú (10m, 1h, 1d) y es una decisión con consecuencias.

Un tramo grande enseña la forma de la noche: el suelo de fondo que siempre está y las subidas que se salen de él. Un tramo pequeño enseña el ritmo de una sola fuente. Quien prueba contraseñas despacio, tres o cuatro por cada diez minutos, no dispara un bloqueo que cuente fallos por cuenta en poco tiempo; en tramos de diez minutos se le ve el ritmo constante, y en tramos de una hora se le ve el total.

Esta tarea se hace en el laboratorio

Una consola para consultar la base de datos, aquí en la página. No instalas nada y no puedes romper nada.

Conectando con la base…

Responde para continuar

Sospechas que una dirección prueba contraseñas a ritmo lento para no disparar los bloqueos. ¿Qué tramo eliges para ver ese ritmo?

Ver pista de ayuda

El ritmo se ve en tramos pequeños y sobre una sola fuente.

sort by columna ordena el resultado, y en KQL ordena de mayor a menor si no se le dice nada; para el orden contrario se escribe asc. top 5 by columna hace dos cosas de una vez: ordena y se queda con las cinco primeras. Es el paso que se pone al final de un resumen para leer solo lo de arriba.

La trampa está en la columna que eliges para ordenar. top 1 by intentos contesta «quién hace más ruido», que es útil para saber qué arreglar primero en TI. top 1 by cuentas contesta «quién toca más cuentas distintas», que es la pregunta de quien busca un rociado. Las dos consultas son correctas; solo una responde a lo que estás investigando.

Esta tarea se hace en el laboratorio

Una consola para consultar la base de datos, aquí en la página. No instalas nada y no puedes romper nada.

Conectando con la base…

Responde para continuar

Quieres las cinco direcciones que fallaron contra más cuentas distintas. ¿Qué pones al final del resumen?

Ver pista de ayuda

top ordena por la columna que le digas; take no ordena nada.

En la consola está la noche entera de fallos de inicio de sesión. Resume los fallos por dirección de origen calculando a la vez los intentos y las cuentas distintas, y localiza la dirección de fuera de la empresa que falló casi una vez por cuenta: la que dibuja un rociado.

Esta tarea se hace en el laboratorio

Una consola para consultar la base de datos, aquí en la página. No instalas nada y no puedes romper nada.

Conectando con la base…

Responde para continuar

Escribe el número de cuentas distintas contra las que falló la dirección externa que probó casi una vez por cuenta.

Ver pista de ayuda

Ejecuta `inicios | where resultado == "fallido" | summarize intentos = count(), cuentas = dcount(cuenta) by ip_origen` y lee la columna «cuentas», no la de intentos.

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

Conectando con la base…

SIEM · Delta Cargo — inicios de sesión, noche del 7 al 8 de octubre
KQL · consultas previstas

Tablas

inicios

  • hora
  • cuenta
  • aplicacion
  • ip_origen
  • resultado
  • motivo
Ctrl + Enter
Consola de consultas v1.0 · build e42b80

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