Skip to content
KitploitKITPLOIT
HerramientasExploitsBlog
Log in
Enviar
HerramientasExploitsBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
Sentinel-Queries — Colección de consultas KQL | Kitploit
Herramientas/GitHubGitHub/reprise99/sentinel-queries
Herramientas DefensivasInteligencia de AmenazasAprendizaje y EducaciónRecursos CuradosDetección de AnomalíasAnálisis de Registros
GitHubreprise99/sentinel-queries

Sentinel-Queries

Colección de consultas KQL

Ver Repositorio
1.6k38216hace 8 mesesRevisado por Kitploit

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

KQL para Microsoft Sentinel

Algunos consejos, trucos y ejemplos para usar KQL con Microsoft Sentinel.

  1. Introducción
  2. La anatomía de una consulta KQL
  3. Los fundamentos
    1. Fundamentos de tiempo
    2. Fundamentos de Where
    3. Fundamentos de Project
    4. Fundamentos de Summarize
    5. Fundamentos de Render
    6. Fundamentos de Parse y Split

Introducción

Kusto Query Language es el lenguaje utilizado en Azure Monitor, Azure Data Explorer y Azure Log Analytics (lo que Microsoft Sentinel utiliza internamente). Siempre he encontrado útil esta visualización sobre KQL -

KQL visualizado

Queremos usar KQL para crear consultas precisas y eficientes que permitan encontrar amenazas, detecciones, patrones y anomalías dentro de nuestro conjunto de datos más amplio.

La anatomía de una consulta KQL

Tomemos la siguiente consulta como ejemplo```kql SigninLogs | where TimeGenerated > ago(14d) | where UserPrincipalName == "[email protected]" | where ResultType == "0" | where AppDisplayName == "Microsoft Teams" | project TimeGenerated, Location, IPAddress, UserAgent

Cuando ejecutamos una consulta como esta, la primera línea le indica a Microsoft Sentinel en qué tabla buscar los datos, así que en este caso queremos buscar en la tabla SigninLogs, que es donde se envían los datos de inicio de sesión de Azure AD. Puede ver una lista de tablas [aquí](https://docs.microsoft.com/en-us/azure/sentinel/data-source-schema-reference).

Microsoft Sentinel ejecutará la consulta de forma secuencial, por lo que procesará cada línea una por una hasta llegar al final, o hasta que haya un error. Así que vamos a desglosar nuestra consulta línea por línea.```kql
SigninLogs

Así que primero hemos elegido nuestra tabla SigninLogs.```kql SigninLogs | where TimeGenerated > ago(14d)

A continuación, le indicamos a Sentinel que revise los últimos 14 días de datos en esta tabla.```kql
SigninLogs
| where TimeGenerated > ago(14d)
| where UserPrincipalName == "[email protected]"

A continuación, le pedimos a Sentinel que solo busque registros donde UserPrincipalName sea igual a "[email protected]"```kql SigninLogs | where TimeGenerated > ago(14d) | where UserPrincipalName == "[email protected]" | where ResultType == "0"

Luego buscamos solo los registros donde ResultType == 0, lo que indica un inicio de sesión exitoso en Azure AD.```kql
SigninLogs
| where TimeGenerated > ago(14d)
| where UserPrincipalName == "[email protected]"
| where ResultType == "0"
| where AppDisplayName == "Microsoft Teams"

A continuación, buscamos únicamente inicios de sesión en Microsoft Teams.```kql SigninLogs | where TimeGenerated > ago(14d) | where UserPrincipalName == "[email protected]" | where ResultType == "0" | where AppDisplayName == "Microsoft Teams" | project TimeGenerated, Location, IPAddress, UserAgent

Nuestra última línea usa el operador `project`, para devolver solo 4 campos de nuestros registros, por lo que solo veremos `TimeGenerated`, `Location`, `IPAddress` y `UserAgent` devueltos de nuestros datos de `SigninLogs`.

Así es como se construyen las consultas, ahora los conceptos básicos.

## Los Fundamentos

### Fundamentos de Tiempo

Microsoft Sentinel y KQL están altamente optimizados para filtros de tiempo, por lo que si conoces el período de tiempo de los datos que deseas buscar, debes filtrar el rango de tiempo de inmediato. Recuperar los últimos 14 días de registros y luego buscar un nombre de usuario como la siguiente consulta -```kql
SigninLogs
| where TimeGenerated > ago(14d)
| where UserPrincipalName == "[email protected]"

Es mucho más eficiente que buscar primero un nombre de usuario y luego buscar el período de tiempo así -```kql SigninLogs | where UserPrincipalName == "[email protected]" | where TimeGenerated > ago(14d)

KQL tiene muchas opciones para consultar períodos de tiempo específicos.```kql
SigninLogs
| where TimeGenerated > ago(14d)

Como en el primer ejemplo, esto buscará los últimos 14 días.```kql SigninLogs | where TimeGenerated > ago(14h)

También puedes hacer horas.```kql
SigninLogs
| where TimeGenerated > ago(14m)

Y minutos.

KQL también permite realizar consultas entre rangos de tiempo -```kql SigninLogs | where TimeGenerated between (ago(14d) .. ago(7d))

Esto encontrará datos de SigninLogs entre hace 14 días y hace 7 días.```kql
SigninLogs
| where TimeGenerated between (ago(14h) .. ago(7h))

Entre hace 14 horas y hace 7 horas.```kql SigninLogs | where TimeGenerated between (ago(14m) .. ago(7m))

Y entre hace 14 minutos y hace 7 minutos.

### Conceptos básicos de Where

Where es un operador que usarás en prácticamente todas las consultas que escribas. Así es como le indicas a Microsoft Sentinel que busque datos específicos. La sintaxis es muy importante con el operador where. Si usamos nuestro mismo ejemplo.```kql
SigninLogs
| where TimeGenerated > ago(14d)
| where UserPrincipalName == "[email protected]"

Esto buscará en nuestra tabla SigninLogs, durante los últimos 14 días, coincidencias exactas donde nuestro UserPrincipalName sea igual a [email protected]. En KQL, == distingue entre mayúsculas y minúsculas, por lo que si buscas [email protected] y el nombre de usuario es en realidad [email protected], no obtendrás ningún resultado. El equivalente que no distingue entre mayúsculas y minúsculas es =```kql SigninLogs | where TimeGenerated > ago(14d) | where UserPrincipalName = "[email protected]"

Esto encontrará cualquier coincidencia para [email protected] independientemente de la distinción entre mayúsculas y minúsculas.

En lugar de 'igual a', también podemos usar 'contiene'.```kql
SigninLogs
| where TimeGenerated > ago(14d)
| where UserPrincipalName contains "reprise_99"

Esto encontrará cualquier entrada de registro donde el UserPrincipalName contenga reprise_99; si tuvieras datos de [email protected] y [email protected], encontraría ambos. El operador contains no distingue entre mayúsculas y minúsculas, pero puedes usar contains_cs para que distinga entre mayúsculas y minúsculas.

Puedes usar startswith o endswith si estás buscando patrones concretos.```kql SigninLogs | where TimeGenerated > ago(14d) | where UserPrincipalName startswith "reprise_99"

SigninLogs | where TimeGenerated > ago(14d) | where UserPrincipalName endswith "testdomain.com"

Tanto startswith como endswith no distinguen entre mayúsculas y minúsculas, pero puedes usar startswith_cs o endswith_cs para que distingan entre mayúsculas y minúsculas.

Si estás buscando palabras completas (de más de cuatro caracteres), en KQL puedes usar el operador has. Usar 'has' es más eficiente que 'contains' ya que los datos están indexados para ti.```kql
SigninLogs
| where TimeGenerated > ago(14d)
| where AppDisplayName has "Teams"

Esto encontrará cualquier SigninLogs donde el nombre para mostrar de la aplicación contenga la palabra Teams, lo que podría incluir "Microsoft Teams" y "Microsoft Teams Web Client", ambos satisfacen la consulta.

Si buscas varias palabras, puedes usar has_any o has_all.```kql SigninLogs | where TimeGenerated > ago(14d) | where AppDisplayName has_any ("Teams","Outlook")

Esto devolverá resultados donde el nombre para mostrar de la aplicación contenga \"Teams\" o \"Outlook\"```kql
SigninLogs
| where TimeGenerated > ago(14d)
| where AppDisplayName has_all ("Teams","Outlook")

Esto devolverá resultados donde el nombre para mostrar de la aplicación tenga "Teams" y "Outlook".

Descargar herramienta