🔒 Registro cerrado · Apertura oficial próximamente · Acceso exclusivo para alumnos activos
Iniciar SesiónContar 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.
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.
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.
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.
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.
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.
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.
Conectando con la base…
Tablas
inicios
- hora
- cuenta
- aplicacion
- ip_origen
- resultado
- motivo
El resultado aparece aquí.
fila(s)
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.