Tu proveedor te ha notificado actividad sospechosa. O peor: tu web muestra contenido que no pusiste. Tu VPS ha sido comprometido.
No entres en pánico, pero actúa rápido. Esta guía te lleva paso a paso desde la detección hasta la recuperación completa.
Señales de que tu VPS está comprometido
Señales evidentes
| Señal | Qué indica |
|---|---|
| Web con contenido extraño | Defacement o inyección |
| Emails de spam saliendo | Bot de spam instalado |
| Proveedor te avisa | Actividad maliciosa detectada |
| IP en blacklists | Usado para ataques |
| Archivos .php extraños | Webshell instalado |
Señales sutiles
| Señal | Qué indica |
|---|---|
| CPU alta sin razón | Minero de crypto |
| Tráfico de red inusual | Botnet o exfiltración |
| Usuarios nuevos | Backdoor creado |
| Procesos desconocidos | Malware corriendo |
| Archivos modificados | Sistema comprometido |
| Cron jobs extraños | Persistencia |
Verificación rápida
# Usuarios con shell
cat /etc/passwd | grep -E '/bin/(bash|sh)$'
# Usuarios con UID 0 (root)
awk -F: '$3 == 0 {print $1}' /etc/passwd
# Conexiones activas sospechosas
netstat -tlnp
ss -tlnp
# Procesos consumiendo CPU
top -bn1 | head -20
# Cron jobs de todos los usuarios
for user in $(cut -f1 -d: /etc/passwd); do
crontab -u $user -l 2>/dev/null
done
# Archivos modificados recientemente
find /var/www -mtime -1 -type f
find /tmp -type f -executable
Paso 1: Contener el daño
Decisión crítica: ¿Aislar o apagar?
Aislar (recomendado para análisis):
# Bloquear todo tráfico excepto tu IP
iptables -F
iptables -A INPUT -s TU_IP -j ACCEPT
iptables -A INPUT -j DROP
iptables -A OUTPUT -d TU_IP -j ACCEPT
iptables -A OUTPUT -j DROP
Apagar (si es urgente):
- Desde panel del proveedor
- Evita que siga causando daño
- Pierdes evidencia volátil (RAM, conexiones)
Cambiar credenciales inmediatamente
# Cambiar contraseña de root
passwd root
# Cambiar contraseñas de todos los usuarios
passwd usuario
# Regenerar claves SSH del servidor
rm /etc/ssh/ssh_host_*
ssh-keygen -A
# Revocar claves SSH de usuarios
# Revisar y limpiar:
cat /root/.ssh/authorized_keys
cat /home/*/.ssh/authorized_keys
Notificar al proveedor
Si tu VPS está enviando spam o ataques, notifica al proveedor antes de que te suspendan.
Paso 2: Análisis forense básico
Revisar logs de autenticación
# Logins exitosos
grep "Accepted" /var/log/auth.log | tail -50
# Intentos fallidos
grep "Failed" /var/log/auth.log | tail -50
# Escaladas de privilegios (sudo)
grep "sudo" /var/log/auth.log | tail -50
# Logins por fecha sospechosa
grep "Accepted" /var/log/auth.log | grep "Feb 1"
Buscar usuarios sospechosos
# Usuarios creados recientemente
ls -la /home/
# Usuarios con UID 0 (además de root)
awk -F: '$3 == 0 {print}' /etc/passwd
# Usuarios en grupo sudo
grep sudo /etc/group
# Usuarios con shell válido
grep -E '/bin/(bash|sh|zsh)' /etc/passwd
Buscar procesos maliciosos
# Procesos corriendo
ps auxf
# Procesos con conexiones de red
netstat -tlnp
# Procesos ocultos (comparar)
ps aux | wc -l
ls /proc | grep -E '^[0-9]+$' | wc -l
# Si difieren mucho, hay procesos ocultos
# Buscar mineros de crypto
ps aux | grep -E "(xmrig|minerd|cryptonight|stratum)"
Buscar archivos maliciosos
# Archivos en /tmp ejecutables
find /tmp -type f -executable -ls
# Archivos PHP sospechosos en web
find /var/www -name "*.php" -mtime -7
# Archivos con nombres sospechosos
find / -name "*.php.suspected" 2>/dev/null
find / -name "*.ico" -size +10k 2>/dev/null # ICO grandes = shells
# Webshells comunes
grep -r "eval(" /var/www --include="*.php" | head -20
grep -r "base64_decode" /var/www --include="*.php" | head -20
grep -r "shell_exec" /var/www --include="*.php" | head -20
grep -r "passthru" /var/www --include="*.php" | head -20
Revisar cron jobs y servicios
# Cron del sistema
cat /etc/crontab
ls -la /etc/cron.d/
ls -la /etc/cron.daily/
# Cron de usuarios
for user in $(cut -f1 -d: /etc/passwd); do
echo "=== $user ==="
crontab -u $user -l 2>/dev/null
done
# Servicios systemd sospechosos
systemctl list-units --type=service --state=running
ls -la /etc/systemd/system/
# Buscar servicios nuevos
find /etc/systemd -mtime -7
Verificar archivos de sistema modificados
# Verificar integridad con dpkg (Debian/Ubuntu)
dpkg --verify | grep -v missing
# Archivos SUID/SGID (pueden ser backdoors)
find / -perm -4000 -type f 2>/dev/null
find / -perm -2000 -type f 2>/dev/null
# Comparar con lista conocida
dpkg -S $(find / -perm -4000 -type f 2>/dev/null)
Paso 3: Eliminar el malware
Matar procesos maliciosos
# Identificar PID del proceso sospechoso
ps aux | grep sospechoso
# Matar proceso
kill -9 PID
# Si reaparece, buscar el padre
pstree -p PID
Eliminar archivos maliciosos
# Eliminar webshells encontrados
rm /var/www/site/shell.php
# Eliminar archivos en /tmp
rm -rf /tmp/sospechoso
# Eliminar cron jobs maliciosos
crontab -r -u usuario_sospechoso
Limpiar usuarios backdoor
# Eliminar usuario sospechoso
userdel -r usuario_malicioso
# Limpiar authorized_keys
echo "" > /root/.ssh/authorized_keys
# Añadir solo TU clave
echo "tu_clave_publica" >> /root/.ssh/authorized_keys
Eliminar servicios maliciosos
# Parar y deshabilitar
systemctl stop servicio_malicioso
systemctl disable servicio_malicioso
# Eliminar archivo de servicio
rm /etc/systemd/system/servicio_malicioso.service
systemctl daemon-reload
Paso 4: Determinar el vector de entrada
¿Cómo entraron?
| Vector común | Cómo verificar |
|---|---|
| SSH con contraseña débil | grep "Accepted password" /var/log/auth.log |
| Vulnerabilidad en CMS | Revisar versiones de WordPress, plugins |
| Aplicación vulnerable | Revisar logs de aplicación |
| Credenciales filtradas | Revisar si contraseñas estaban en repos públicos |
| Vulnerabilidad de sistema | Revisar si había actualizaciones pendientes |
Verificar WordPress
# Versión de WordPress
grep "wp_version" /var/www/site/wp-includes/version.php
# Plugins instalados
ls /var/www/site/wp-content/plugins/
# Temas
ls /var/www/site/wp-content/themes/
# Buscar archivos modificados recientemente
find /var/www/site -mtime -3 -type f -name "*.php"
Paso 5: Decidir - Limpiar o reinstalar
Cuándo limpiar
- Sabes exactamente qué fue comprometido
- El malware es simple (webshell, script)
- Tienes tiempo limitado
- Compromiso fue reciente y limitado
Cuándo reinstalar (recomendado)
- No estás 100% seguro de qué tocaron
- Encontraste rootkit o modificaciones de sistema
- El atacante tuvo acceso root
- No puedes determinar el alcance
Proceso de reinstalación segura
- Backup de datos (solo datos, no código)
# Solo base de datos
mysqldump -u root -p --all-databases > /backup/db.sql
# Solo uploads de usuarios
tar -czf /backup/uploads.tar.gz /var/www/site/wp-content/uploads
-
Reinstalar el VPS desde panel del proveedor
-
Configurar con seguridad desde cero
- Restaurar solo datos limpios
# Restaurar base de datos
mysql -u root -p < /backup/db.sql
# Restaurar uploads (escanear antes)
clamscan -r /backup/uploads.tar.gz
tar -xzf /backup/uploads.tar.gz -C /var/www/site/wp-content/
- Instalar CMS/aplicación desde cero (no restaurar código)
Paso 6: Fortalecer la seguridad
Checklist post-incidente
# 1. Actualizar todo
sudo apt update && sudo apt upgrade -y
# 2. Configurar firewall
sudo ufw default deny incoming
sudo ufw allow ssh
sudo ufw allow http
sudo ufw allow https
sudo ufw enable
# 3. Instalar fail2ban
sudo apt install fail2ban -y
sudo systemctl enable fail2ban
# 4. Deshabilitar login root por SSH
# En /etc/ssh/sshd_config:
PermitRootLogin no
PasswordAuthentication no
# 5. Solo claves SSH
# Generar nueva clave en tu máquina
ssh-keygen -t ed25519
# 6. Instalar y configurar antimalware
sudo apt install clamav -y
sudo freshclam
Monitorización continua
# Instalar herramientas de detección
sudo apt install rkhunter chkrootkit -y
# Escanear rootkits
sudo rkhunter --check
sudo chkrootkit
# Configurar escaneos automáticos
# En cron:
0 3 * * * /usr/bin/rkhunter --check --skip-keypress
0 4 * * * /usr/bin/clamscan -r /var/www --quiet --infected
Alertas de cambios
# Instalar AIDE (detección de intrusiones)
sudo apt install aide -y
sudo aideinit
sudo cp /var/lib/aide/aide.db.new /var/lib/aide/aide.db
# Verificar cambios (ejecutar periódicamente)
sudo aide --check
Qué NO hacer
| No hagas esto | Por qué |
|---|---|
| Ignorar el problema | Empeorará, te suspenderán |
| Solo borrar archivos visibles | Puede haber backdoors ocultos |
| Restaurar backup sin verificar | El backup puede estar infectado |
| Usar mismas contraseñas | Ya están comprometidas |
| No investigar el vector | Volverán a entrar |
| Ocultar al proveedor | Te suspenderán igual |
Prevención futura
Medidas esenciales
- Actualizaciones automáticas
sudo apt install unattended-upgrades -y
sudo dpkg-reconfigure unattended-upgrades
- Backups verificados
- Diarios
- Almacenados fuera del VPS
- Probados regularmente
- Monitorización
- Alertas de CPU/RAM inusuales
- Alertas de login
- Escaneos de malware
- Principio de mínimo privilegio
- No usar root para todo
- Usuarios separados por aplicación
- Permisos estrictos
Preguntas frecuentes
¿Debo pagar si me piden rescate (ransomware)?
No. No hay garantía de que recuperes nada. Mejor reinstalar desde backups. Si no tienes backups, aprende la lección y empieza de cero.
¿Cómo sé si el hacker sigue dentro?
Si limpiaste pero ves actividad sospechosa de nuevo, probablemente dejó backdoors. La opción más segura es reinstalar el VPS completamente.
¿Debo denunciar el hackeo?
Depende de tu jurisdicción y del daño. Si hubo robo de datos de clientes, puede ser obligatorio. Consulta con un abogado si es un caso serio.
¿Mis backups están infectados también?
Posiblemente los más recientes sí. Usa backups de antes del compromiso si es posible. Escanea todo antes de restaurar.
¿Cuánto tiempo tarda recuperarse de un hackeo?
Limpieza básica: 2-4 horas. Reinstalación completa con migración: 4-8 horas. Investigación forense completa: días.
Nuestra recomendación
Ante un hackeo:
- No entres en pánico
- Aísla el servidor
- Determina el alcance
- En caso de duda, reinstala
Para prevenir:
- Actualizaciones al día
- Contraseñas fuertes + 2FA
- Backups fuera del servidor
- Monitorización activa
¿Necesitas ayuda con un servidor comprometido? La administración gestionada de Avantys incluye respuesta a incidentes de seguridad y hardening profesional.
Conclusión
Un VPS hackeado es serio, pero recuperable. La clave es actuar rápido, investigar el vector de entrada, y asegurar que no vuelva a pasar.
Si tienes dudas sobre el alcance del compromiso, reinstalar es siempre la opción más segura.
¿Necesitas un VPS seguro desde el inicio? Explora los VPS de Avantys con configuración de seguridad incluida.
¿Quieres que lo hagamos por ti?
En Avantys gestionamos tu web, hosting y crecimiento digital de punta a punta. Tú a lo importante.