Análisis de logs y construcción de una línea de tiempo
Toda investigación termina como una línea de tiempo: primer acceso, qué tocaron, cómo se movieron, qué se llevaron. La calidad de esa línea de tiempo depende de marcas de tiempo limpias y buenos pivotes.
Empieza con un tiempo limpio
- Convierte cada marca de tiempo a UTC antes de comparar nada. Las zonas horarias y el horario de verano causan la mayoría de los errores en una línea de tiempo.
- Anota el desfase del reloj (clock skew): un host con el reloj mal desplaza toda su historia. Compara un evento compartido entre fuentes para medir el desfase.
- Registra la fuente, el campo y la resolución de tiempo de cada evento; un log con resolución de solo minutos no puede ordenar eventos dentro del mismo minuto.
- Conserva copias sin procesar y trabaja sobre las copias.
Pivoteo
Una investigación avanza por pivoteo: toma un hecho conocido y pregunta qué más lo comparte. Cada pivote estrecha o amplía el alcance.
- De una IP a todas las cuentas que iniciaron sesión desde ella y todas las solicitudes que hizo.
- De una cuenta a sus sesiones, sus dispositivos, los recursos que tocó y los cambios que hizo.
- De un host a sus procesos padre e hijo, conexiones de red y archivos creados.
- De un hash de archivo a todos los hosts donde apareció.
- Del primer evento malicioso hacia atrás: ¿cómo comenzó el acceso?
Ejemplo: una identidad de nube comprometida
Extrae de CloudTrail, en orden, todo lo que hizo una identidad y busca primeras veces: una nueva dirección de origen, una nueva región, una llamada a una API sensible.
# todas las acciones de la identidad sospechosa, en orden cronológico
jq -r '.Records[]
| select(.userIdentity.arn // "" | test("build-bot"))
| [.eventTime, .eventName, .awsRegion, .sourceIPAddress, (.errorCode // "ok")] | @tsv' \
cloudtrail/*.json | sort
# ¿qué direcciones de origen usó esta identidad?
jq -r '.Records[] | select(.userIdentity.arn // "" | test("build-bot")) | .sourceIPAddress' \
cloudtrail/*.json | sort | uniq -c | sort -rnimport csv, heapq
from datetime import datetime, timezone
def load(path, source, ts_field, fmt):
with open(path, newline="") as f:
for row in csv.DictReader(f):
ts = datetime.strptime(row[ts_field], fmt).replace(tzinfo=timezone.utc)
yield ts, source, row.get("message", "")
streams = [
load("idp.csv", "idp", "time", "%Y-%m-%dT%H:%M:%SZ"),
load("proxy.csv", "proxy", "ts", "%Y-%m-%d %H:%M:%S"),
]
for ts, source, msg in heapq.merge(*(sorted(s) for s in streams)):
print(ts.isoformat(), source, msg) # salida en orden cronológicoConvierte los hallazgos en detecciones
Cuando encuentres una técnica que usó el atacante, escribe una regla para detectarla la próxima vez. Sigma es un formato neutral respecto a proveedores que se convierte a muchos lenguajes de consulta de SIEM.
title: PowerShell iniciado con un comando codificado
status: experimental
logsource:
category: process_creation
product: windows
detection:
selection:
Image|endswith: '\powershell.exe'
CommandLine|contains:
- ' -enc '
- ' -EncodedCommand '
condition: selection
falsepositives:
- Algunas herramientas de administración usan comandos codificados; establece su línea base primero
level: mediumHábitos
- Escribe la línea de tiempo sobre la marcha, con la evidencia de cada línea.
- Separa los hechos de las hipótesis y marca cuál es cuál.
- Busca también la ausencia de logs: un hueco puede ser la limpieza del atacante.
- Mantén una lista de preguntas que aún no puedes responder y de logs que desearías tener; esa lista mejora tu logging.
conexiones en el mapa
- Threat huntingdepende deAnálisis de logs y construcción de una línea de tiempo
- Análisis de logs y construcción de una línea de tiempoacota el alcance deTriaje, acotamiento del alcance y contención
actualizado el 14/10/2026 · fuentes para profundizar · reportar un error
en otros dominios
- Telemetría de borde y de aplicaciónsecopssolo se puede reconstruir lo que se recolectó
Desbloquea
pon a prueba lo que entendiste
Cargando preguntas…