DFIR en Linux: Triaje en Vivo con UAC y Velociraptor
Como el equipo Basilisk hace triaje en vivo en hosts Linux comprometidos usando UAC y Velociraptor sin destruir evidencia volatil.

Tres de la manana, un Debian 12 expone un cron sospechoso que reescribe /etc/ld.so.preload cada 90 segundos. El reflejo equivocado seria apagar la maquina; el correcto es abrir el runbook de triaje y capturar el estado vivo antes de que el atacante note la luz encendida. En Basilisk este escenario aparece cada mes en laboratorios de simulacion, y la regla es simple: orden de volatilidad primero, hipotesis despues. Memoria, conexiones, procesos, descriptores de archivo abiertos y modulos del kernel son prioridad absoluta, porque un reboot o un kill -9 mal colocado destruye el 80% de lo que importa.
El orden de volatilidad como primera ley
El orden de volatilidad (RFC 3227) ordena la evidencia por que tan rapido se evapora: registros de CPU y cache desaparecen en nanosegundos, la RAM al perder energia, las conexiones de red en segundos, los procesos vivos hasta el proximo reboot, el disco es el mas lento. La consecuencia practica: recolectas de lo volatil a lo persistente, nunca al reves. Un reboot para frenar el cron borra justo las paginas de memoria que contienen el payload desempaquetado y la direccion de C2.
Concretamente: primero ss -tunap para sockets activos, ps auxww y /proc/[pid]/exe para procesos vivos (incluso binarios borrados se reconstruyen desde /proc), lsof -n para descriptores abiertos, cat /proc/modules para modulos de kernel cargados. Cada salida se escribe con timestamp UTC y hostname a un destino de solo lectura, nunca al disco de la victima. Recien cuando el estado volatil esta asegurado pensas en aislamiento.
UAC para el triaje one-shot
Nuestra caja de herramientas estandar empieza con UAC (Unix-like Artifacts Collector) de Tulpa Security y Velociraptor de Rapid7. UAC es perfecto para triaje one-shot offline: subes un tar.gz de ~6MB, ejecutas ./uac -p ir_triage /mnt/evidencia, y en 8 a 15 minutos tienes hashes, dump de /proc, journald, bash_history de todos los usuarios, listado de cron y configuracion de SSH comprimidas.
UAC es deliberadamente liviano en dependencias: shell puro, corre en un host donde no tenes permiso de instalar nada, y respeta el orden de volatilidad en su profile incorporado. La nota operativa clave: corre UAC desde un medio montado read-only y escribe la salida a un destino cifrado separado, para no alterar un solo atime en la victima. Si aun no montaste el lab base, conviene revisar Pentest Web desde Cero: Montando un Lab Seguro con DVWA, Juice Shop y Burp Suite antes de simular incidentes reales.
Captura de memoria con AVML
La captura de memoria sigue siendo el punto mas fragil en Linux. En kernel 6.x, AVML de Microsoft Research es la opcion mas consistente cuando LiME falla al compilar contra cabeceras ausentes. Comando real: avml --compress /evidencia/memdump.lime. Reserva al menos el doble de RAM en disco y nunca escribas en el disco de la victima; usa un NFS read-write montado en /mnt/triage o un USB cifrado con LUKS.
La razon de AVML sobre LiME es practica: LiME es un modulo de kernel compilado contra las cabeceras exactas del kernel que suelen faltar en la victima, mientras AVML es un binario de userspace enlazado estaticamente que lee via /proc/kcore o /dev/crash. Despues del volcado, el analisis va a Volatility 3 con profile autodetectado, y ahi el pipeline conecta con Memory Forensics con Volatility 3: Analizando Dumps en Lab Reproducible. Sin dump de memoria, cualquier rootkit LD_PRELOAD queda como leyenda urbana en el informe.
Analisis en Volatility 3
Con el dump en la mano construis la jerarquia de procesos en Volatility 3 con linux.pstree, listas conexiones de red con linux.sockstat y cazas procesos ocultos o desenganchados del arbol con linux.psscan. El hallazgo clasico en un rootkit LD_PRELOAD es una discrepancia: ps en el sistema vivo muestra menos procesos que linux.psscan en el dump, porque el rootkit manipula la vista de userspace pero no las estructuras del kernel.
Para kernels modernos la tabla de simbolos (ISF, Intermediate Symbol Format) es decisiva; sin simbolos que coincidan Volatility devuelve resultados incompletos. Genera el archivo ISF desde el vmlinux con simbolos de debug de la version exacta del kernel de la victima. Por eso conviene mantener de antemano un repositorio de simbolos para las versiones de kernel de tu flota, para no perder horas consiguiendo simbolos en medio del incidente.
Cazar persistencia: nunca en un solo lugar
La persistencia en Linux casi nunca vive en un solo lugar. En casos recientes de mineros Kinsing encontramos cuatro vectores simultaneos: unit systemd en /etc/systemd/system/.cache.service, entrada en el crontab de root, modificacion de /etc/rc.local y un wrapper en /usr/local/sbin/ssh con SUID. UAC los recoge con el profile ir_triage, pero conviene correr manualmente find / -newermt '2026-06-01' -type f -mtime -8 2>/dev/null para cerrar huecos.
No olvides los rincones discretos: ~/.bashrc y /etc/profile.d/, un authorized_keys con una clave colada, reglas udev, modulos PAM y jobs cron-at. Un solo vector que se te pase devuelve el host al atacante en horas. Para correlacionar con tecnicas Windows equivalentes, el equipo consulta Persistencia en Windows: 10 Tecnicas Documentadas y sus Contramedidas, porque los atacantes oportunistas reutilizan patrones entre plataformas.
Velociraptor: de un host a una flota
Velociraptor cambia el juego cuando salimos de un host hacia una flota. Levantamos un servidor en t3.medium, generamos clientes Linux con velociraptor config client, los distribuimos via Ansible y en 20 minutos tenemos visibilidad. Las hunts mas utiles en nuestro playbook son Linux.Network.NetstatEnriched para sesiones activas, Linux.Sys.SUID para binarios sospechosos y una regla Yara compilada con firmas de Pupy, Sliver y Merlin.
El poder de VQL es que formulas una hipotesis como query y la disparas de forma sincronica contra 120 hosts: mostrame todo proceso cuyo binario este en /tmp o /dev/shm y tenga una conexion saliente. Cuando el IOC pega, exportamos collection zip firmado y vamos a analisis estatico en sandbox aislada, como se describe en Analisis de Malware en Lab Aislado: Setup Seguro con FlareVM y REMnux. El secreto es nunca saltarse el hashing SHA-256 antes de mover artefactos.
Super-timeline con plaso
Una vez asegurada la evidencia volatil, una super-timeline convierte artefactos dispersos en una narrativa. Con log2timeline.py (plaso) parseas timestamps del filesystem, journald, bash_history, logs de cron y accesos del webserver en una unica vista ordenada por tiempo, y filtras a la ventana del incidente con psort.py. De un vistazo ves que el login SSH a las 02:14 UTC precedio al curl del payload a las 02:15 y la escritura de la unit systemd a las 02:16.
El error mas comun es mezclar zonas horarias: trabaja siempre en UTC y anota el offset del host, si no armas una cadena causal que se desvia por horas. Vigila el timestomping (mtime reseteado con touch -t); el ctime, mas dificil de falsificar para un atacante, revela la hora real de modificacion y expone la manipulacion.
Cadena de custodia y hashing
Cada artefacto recibe un hash SHA-256 al momento de la coleccion, y ese hash se recalcula y compara al recibirlo en la estacion de analisis. Si no coinciden, la evidencia no vale para ningun uso formal. Documentamos cada decision en chain of custody con timestamp UTC, hash y operador, porque incluso en lab la disciplina genera musculo para el caso real.
En la practica eso significa un cuaderno append-only (idealmente en un sistema separado) que registra cada comando, cada copia y cada decision de aislamiento con timestamp. Quien aprende esta disciplina recien en el incidente real pierde media noche reconstruyendo lo que el mismo hizo. Automatiza el logging tanto como puedas para que no se olvide bajo presion.
Despues del triaje: deteccion y hardening
El threat hunting post-triaje cierra el ciclo. Convertimos las detecciones en reglas Sigma y las empujamos a Elastic, transformando el incidente en capacidad defensiva permanente, flujo detallado en Threat Hunting con Sigma y Elastic: Del Indicador a la Regla de Deteccion. Un solo hallazgo de ld.so.preload se vuelve una deteccion en toda la flota que marca el proximo intento en segundos.
Para hosts que sobreviven al incidente, aplicamos hardening siguiendo Hardening de Linux Server: CIS Benchmark Aplicado sin Romper Produccion y revisamos SSH conforme Hardening de SSH 2026: Algoritmos, Certificados y Bastion Hosts antes de devolverlos a produccion simulada. Un host restaurado sin cerrar el vector de acceso inicial se vuelve a comprometer en dias, casi siempre por la misma campana automatizada que encontro el primer acceso.
Checklist para el triaje en vivo
Antes de tocar nada: (1) toolkit read-only montado, destino de salida cifrado y separado; (2) estado volatil capturado (sockets, procesos, modulos, /proc) con timestamps UTC; (3) dump de memoria via AVML con al menos 2x RAM de espacio reservado; (4) UAC ir_triage mas un barrido manual con find de archivos frescos; (5) las cuatro clases de persistencia (systemd, cron, rc.local/profile, SUID/authorized_keys) revisadas; (6) cada artefacto hasheado y registrado en el log de custodia; (7) aislamiento recien despues de completar la coleccion; (8) deteccion reproducida como regla Sigma.
FAQ
Debo sacar la maquina de la red de inmediato? Depende de que estas protegiendo. Con exfiltracion de datos activa, si, pero idealmente via una regla de firewall aguas arriba en vez de tirar el cable en el host, para que el estado de memoria y la conexion de C2 sobrevivan para la captura. Una desconexion dura puede disparar cifrado en curso o un dead-man switch.
Alcanza la forensia de disco sin dump de memoria? No, no contra malware residente en memoria ni rootkits LD_PRELOAD. Mucho tooling moderno apenas toca el disco. Sin dump de memoria ves la mitad de la historia y escribis suposiciones en el informe.
UAC o Velociraptor: cual primero? Para un host unico y aislado, UAC es mas rapido de montar y no necesita servidor. Apenas tenes mas que un punado de hosts o hunts repetidas, Velociraptor gana por orquestacion central y VQL. En la practica combinamos ambos: Velociraptor para el barrido de toda la flota, UAC para coleccion profunda en los hosts marcados como comprometidos. No es uno u otro, es una secuencia.
Takeaway practico: arma hoy un pendrive LUKS con UAC, AVML y cliente Velociraptor preconfigurado contra tu servidor de hunt. Pruebalo en una VM Debian limpia, cronometra, ajusta el profile y versiona el tar.gz en tu repositorio interno. Cuando el pager suene a las 3 de la manana no querras estar leyendo documentacion, querras estar recolectando evidencia. El triaje en vivo no es arte, es checklist disciplinado ejecutado bajo presion.


