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
Herramientas
Comparar todas las herramientas- psCLI · incluido en Linux
- ssCLI · incluido en Linux
- lsofCLI · incluido en Linux
- VelociraptorPlataforma · código abierto
- Volatility 3CLI · código abierto
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
| Ruta | Contenido |
|---|---|
/proc/<pid>/exe | Enlace simbólico al ejecutable; legible (y copiable) aunque el archivo se haya borrado |
/proc/<pid>/cmdline | Argumentos, separados por NUL |
/proc/<pid>/environ | Entorno inicial, separado por NUL (root o el mismo usuario) |
/proc/<pid>/cwd, /proc/<pid>/root | Directorio 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>/maps | Mapeos de memoria con la ruta del archivo de respaldo, marcados (deleted) cuando el archivo ya no existe |
/proc/<pid>/status | Nombre, estado, PPid, Uid/Gid (real, efectivo, guardado, fs), capabilities |
/proc/<pid>/stat | Registro del proceso en una sola línea; campo 22 starttime |
/proc/<pid>/comm | Nombre corto (16 bytes máximo), modificable por el propio proceso |
/proc/net/tcp, tcp6, udp, udp6, unix | Tablas de sockets con direcciones en hexadecimal y números de inodo de los sockets |
/proc/modules | Módulos del kernel cargados (los mismos datos que lsmod) |
/proc/mounts | Montajes actuales del espacio de nombres de montaje del proceso lector |
/proc/sys/kernel/tainted | Indicadores 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
exeque apunta a/memfd:<name> (deleted)muestra un programa ejecutado desde un archivo anónimo en memoria creado conmemfd_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 defd/). - Variables de entorno como
LD_PRELOAD,HISTFILEo 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
| Campo | Dónde | Significado |
|---|---|---|
PPid | status | PID del padre |
Uid, Gid | status | IDs real, efectivo, guardado y de sistema de archivos |
CapEff | status | Máscara de capabilities efectivas |
starttime | stat campo 22 | Hora 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/tcp | Pares 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 artefactolive_response/process/deleted.yamlcopia 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.Netstaty 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
exees(deleted)omemfd: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
commyargv[0]; fíese deexey de los archivos mapeados. - Los procesos con
cwden /tmp, /var/tmp o /dev/shm merecen una revisión. - Compare la lista de PID de
/proccon la salida depsy 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
rootdistinto 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.