Ir al contenido

EjecuciónRedAntiforense

Artefactos en vivo de /proc: procesos, sockets y borrados

El pseudosistema de archivos /proc en un host Linux en vivo: líneas de comando, entornos, archivos abiertos, mapas de memoria, sockets y binarios borrados.

Ubicación
/proc/<pid>/
Prueba
Qué se está ejecutando ahora mismo, desde qué binario, con qué argumentos, archivos y conexiones de red
Marcas de tiempo
Sin marcas de tiempo de archivo útiles; hora de inicio del proceso en ticks de reloj desde el arranque (/proc/<pid>/stat campo 22)
Acceso
root para ver exe, environ, fd y maps de todos los procesos; los demás usuarios solo ven los suyos
Retención
Volátil: desaparece al terminar el proceso o al reiniciar
Adquisición
UAC, Velociraptor, cp, AVML

Qué es

/proc es un pseudosistema de archivos que el kernel genera bajo demanda. Nada de lo que contiene se guarda en disco: cada lectura pide al kernel el estado actual de un proceso, de una tabla de sockets o de un subsistema del kernel. En un sistema en vivo es la forma más rápida de ver qué se está ejecutando, de dónde procede cada proceso y con qué se comunica, y resiste algunos trucos antiforenses que frustran el análisis de disco, como un binario borrado después de lanzarse.

Como es estado en vivo, /proc está cerca de la cima del orden de volatilidad: recójalo antes de cualquier cosa que modifique el sistema e, idealmente, junto con una imagen de memoria.

Dónde se encuentra

RutaContenido
/proc/<pid>/exeEnlace simbólico al ejecutable; legible (y copiable) aunque el archivo se haya borrado
/proc/<pid>/cmdlineArgumentos, separados por NUL
/proc/<pid>/environEntorno inicial, separado por NUL (root o el mismo usuario)
/proc/<pid>/cwd, /proc/<pid>/rootDirectorio de trabajo actual y directorio raíz (revela un chroot o la raíz de un contenedor)
/proc/<pid>/fd/Un enlace simbólico por descriptor de archivo abierto: archivos, socket:[inode], pipe:[inode], anon_inode:
/proc/<pid>/mapsMapeos de memoria con la ruta del archivo de respaldo, marcados (deleted) cuando el archivo ya no existe
/proc/<pid>/statusNombre, estado, PPid, Uid/Gid (real, efectivo, guardado, fs), capabilities
/proc/<pid>/statRegistro del proceso en una sola línea; campo 22 starttime
/proc/<pid>/commNombre corto (16 bytes máximo), modificable por el propio proceso
/proc/net/tcp, tcp6, udp, udp6, unixTablas de sockets con direcciones en hexadecimal y números de inodo de los sockets
/proc/modulesMódulos del kernel cargados (los mismos datos que lsmod)
/proc/mountsMontajes actuales del espacio de nombres de montaje del proceso lector
/proc/sys/kernel/taintedIndicadores de contaminación (taint) del kernel

Las rutas son idénticas en todas las distribuciones. En sistemas con /proc montado con hidepid=, los usuarios sin privilegios no pueden ver los procesos de otros usuarios.

Qué prueba

  • Qué procesos existen ahora, su árbol padre-hijo, los ID de usuario y grupo y sus argumentos.
  • Qué binario respalda cada proceso, incluso después de borrarse (exe -> /path (deleted)), y permite recuperar ese binario.
  • Ejecución sin archivo: un exe que apunta a /memfd:<name> (deleted) muestra un programa ejecutado desde un archivo anónimo en memoria creado con memfd_create.
  • Qué archivos, sockets y tuberías mantiene abiertos cada proceso; a qué direcciones remotas está conectado (cruzando los números de inodo de /proc/net/* con los enlaces de fd/).
  • Variables de entorno como LD_PRELOAD, HISTFILE o ajustes de proxy pasados a un proceso.
  • Lo que no prueba: nada sobre los procesos que ya terminaron. Un rootkit de kernel también puede filtrar lo que muestra /proc, así que compárelo con el análisis de memoria.

Campos clave

CampoDóndeSignificado
PPidstatusPID del padre
Uid, GidstatusIDs real, efectivo, guardado y de sistema de archivos
CapEffstatusMáscara de capabilities efectivas
starttimestat campo 22Hora de inicio en ticks de reloj desde el arranque
sufijo (deleted)enlaces exe, maps, fd/*El archivo de respaldo se desvinculó
local_address, rem_address, st, uid, inode/proc/net/tcpPares IP:puerto en hexadecimal, estado TCP (0A = LISTEN, 01 = ESTABLISHED), UID propietario, inodo del socket

Marcas de tiempo

Los archivos de /proc muestran la hora en que el kernel creó el inodo para el lector, no el inicio del proceso, así que no use las horas de ls -l. Convierta en su lugar starttime: divídalo por la frecuencia de ticks de reloj (getconf CLK_TCK, normalmente 100) y súmelo a la hora de arranque (btime en /proc/stat, segundos Unix UTC).

pid=1234
st=$(awk '{print $22}' /proc/$pid/stat)          # safe unless comm contains spaces
btime=$(awk '/^btime/{print $2}' /proc/stat)
date -u -d @$(( btime + st / $(getconf CLK_TCK) ))

ps -o lstart= -p <pid> da el mismo valor en hora local.

Retención

Ninguna. Las entradas desaparecen cuando el proceso termina, y todo /proc se reconstruye en el arranque. Capture antes de las acciones de contención, como matar procesos, reiniciar servicios o aislar la red (lo que corta las conexiones).

Adquisición

  • Los artefactos de respuesta en vivo de UAC registran los listados de procesos, los enlaces de /proc/<pid>, los archivos abiertos y /proc/modules; su artefacto live_response/process/deleted.yaml copia el binario de cualquier proceso cuyo ejecutable aparezca como (deleted) (los primeros 20 MB), además de los archivos borrados que esos procesos aún mantienen abiertos.
  • Velociraptor: Linux.Sys.Pslist, Linux.Sys.Maps, Linux.Network.Netstat y similares sobre una flota.
  • Manualmente, con binarios de confianza:
# recover a deleted or memfd binary before the process ends
cp /proc/1234/exe /cases/host01/pid1234.bin && sha256sum /cases/host01/pid1234.bin
tr '\0' ' ' < /proc/1234/cmdline; echo
tr '\0' '\n' < /proc/1234/environ
ls -l /proc/1234/fd /proc/1234/cwd
ls -l /proc/[0-9]*/exe 2>/dev/null | grep -E '\(deleted\)|memfd:'

Tome también una imagen de memoria (ver LiME y AVML): /proc responde a "qué pasa ahora", y la memoria le permite volver a preguntar más tarde.

Análisis

ps -eo pid,ppid,user,lstart,args --forest, ss -tanp, ss -xp y lsof -nP leen /proc por usted. Con una imagen de memoria, Volatility 3 reconstruye la misma visión offline con linux.pslist, linux.pstree, linux.psaux, linux.envars, linux.lsof, linux.proc.Maps y linux.sockstat.

Consejos para la investigación

  • Un proceso cuyo exe es (deleted) o memfd: es un hallazgo prioritario: existen casos legítimos (actualizaciones de paquetes que sustituyen un binario en ejecución), pero revise primero el historial de paquetes.
  • El proceso puede cambiar comm y argv[0]; fíese de exe y de los archivos mapeados.
  • Los procesos con cwd en /tmp, /var/tmp o /dev/shm merecen una revisión.
  • Compare la lista de PID de /proc con la salida de ps y con la memoria: una discrepancia sugiere hooking en espacio de usuario (ld.so.preload) o un rootkit de kernel (módulos del kernel).
  • Un enlace root distinto de / indica un chroot o un contenedor; asócielo al ID del contenedor antes de sacar conclusiones (contenedores).
  • Anote el reloj: las horas de una adquisición en vivo solo tienen sentido si se capturan la hora y la zona horaria del host en el mismo momento.

Ver también