comprobaciones de seguridad en linux
Kit de herramientas de detección, eliminación y endurecimiento de criptomineros para servidores Linux.
Construido a partir de respuesta a incidentes del mundo real: detecta mineros que se ocultan de
ps,top,htopybtopusando técnicas de rootkit.
git clone https://gitlab.com/abdom.seada/security-checks.git
cd security-checks
sudo bash setup.sh
🔀 Rama:
master— Este kit de herramientas reside en la ramamaster. Se pueden agregar otros scripts de seguridad en ramas separadas en el futuro.
⚠️
setup.sh una vez justo después de clonar — saltarse esto es la causa #1 de errores.sudo bash setup.sh
setup.sh maneja todo automáticamente:
| Paso | Qué hace |
|---|---|
| ✅ Permisos | chmod +x en miner-hunter y todos los scripts lib/*.sh |
| ✅ Directorios | Crea /var/log/miner_hunter/ y /var/lib/miner_hunter/ (solo root, 700) |
| ✅ Dependencias | Verifica perf, mpstat, iptables, fail2ban, bc, strings — instala automáticamente las faltantes |
| ✅ Autocomprobación | Ejecuta ./miner-hunter --version para confirmar que todo está correctamente enlazado |
Salida esperada cuando la configuración tiene éxito:
✅ Configuración completa — todas las comprobaciones exitosas.
Próximos pasos:
sudo ./miner-hunter scan # Escaneo seguro de solo lectura
sudo ./miner-hunter full # Escanear → Matar → Endurecer
💡 ¿Por qué es necesario? Linux no ejecutará un archivo a menos que tenga el flag
+x. Git y transferencias SCP eliminan esto.setup.sharregla todos los archivos de una sola vez — incluyendo los móduloslib/de los que depende el script principal.
sudo ./miner-hunter scan # ✅ Seguro — solo lectura, cero cambios
sudo ./miner-hunter full # ⚠️ Pipeline completo: Escanear → Matar → Endurecer
sudo ./miner-hunter scan --dry-run # 👁️ Modo vista previa — muestra lo que sucedería
| Comando | Descripción | ¿Cambia el sistema? |
|---|---|---|
scan | Escaneo completo de detección — procesos ocultos, CPU, red, persistencia | ✅ No |
kill | Matar mineros identificados, bloquear IPs de pool, eliminar artefactos | ⚠️ Sí |
harden | Endurecimiento post-incidente — SSH, firewall, watchdog, línea base de integridad | ⚠️ Sí |
full | Ejecuta escanear → matar → endurecer con avisos de confirmación entre fases | ⚠️ Sí |
report | Mostrar el informe de escaneo más reciente | ✅ No |
| Opción | Descripción |
|---|---|
-d, --dry-run | Previsualizar todas las acciones sin realizar cambios |
-e, --evidence DIR | Guardar evidencia en un directorio personalizado en lugar de /root/miner_evidence_* |
-h, --help | Mostrar ayuda |
-v, --version | Mostrar versión |
Situaciones del mundo real y exactamente qué ejecutar en cada una.
top no muestra nada"Este es el síntoma clásico de un rootkit. El minero se oculta de las herramientas de espacio de usuario pero no puede ocultarse de los contadores de rendimiento del hardware.
# Paso 1: Ejecuta un escaneo seguro primero — confirma lo que hay antes de tocar nada
sudo ./miner-hunter scan
Lo que verás si hay un minero presente:
🚨 [CRÍTICO] Anomalía de CPU: 97% CPU de usuario pero top muestra máximo 2% por proceso
🚨 [CRÍTICO] perf detectó 4 hilos ocultos consumiendo ~94% de CPU total
🚨 [CRÍTICO] Conexión activa a 185.x.x.x:9200 (puerto de minería conocido)
🚨 [CRÍTICO] Hilo falso del kernel PID=3421 NOMBRE=[kworker/0:1] EXE=/tmp/.x/miner
# Paso 2: Mata al minero y bloquea su pool
sudo ./miner-hunter kill
# Paso 3: Endurece el servidor para que no pueda regresar
sudo ./miner-hunter harden
Notaste algo sospechoso — tráfico saliente inusual, una tarea cron que no creaste, un proceso con nombre raro — pero no estás seguro.
# Ejecuta un escaneo completo — completamente seguro, solo lectura, cero cambios
sudo ./miner-hunter scan
# Luego lee el informe estructurado
sudo ./miner-hunter report
El informe en /root/miner_evidence_*/report.txt categoriza cada hallazgo por severidad:
[CRÍTICO] entradas → proceder a kill inmediatamente[ADVERTENCIA] entradas → revisar manualmente antes de actuarEl minero tiene un mecanismo de persistencia — una tarea cron, servicio systemd, entrada PM2, o puerta trasera en perfil de shell que lo revive después de matarlo.
sudo ./miner-hunter scan
Busca estos en la salida:
⚠️ [ADVERTENCIA] Entrada cron sospechosa: * * * * * /tmp/.x/update
🚨 [CRÍTICO] Servicio systemd malicioso: /etc/systemd/system/update-check.service
🚨 [CRÍTICO] Proceso PM2 'app-worker' tiene 8432 reinicios — probablemente bucle de reaparición de minero
🚨 [CRÍTICO] Puerta trasera en perfil de shell detectada en /root/.bashrc
# kill elimina TODOS los artefactos de persistencia — no solo el proceso en ejecución
sudo ./miner-hunter kill
# Luego endurece para instalar el watchdog y ser alertado si algo reaparece
sudo ./miner-hunter harden
💡 Después de
kill, el watchdog cron se ejecuta cada 5 minutos y registra en/var/log/miner_hunter/watchdog_alerts.log— sabrás de inmediato si algo regresa.
Endurecimiento proactivo antes de implementar — sin minero, sin incidente, solo asegurando.
# Ejecuta harden solo — no necesita escaneo ni kill
sudo ./miner-hunter harden
Esto hará:
sshd/usr/bin (checksums MD5 — para que puedas detectar binarios alterados después)Después de kill, el paso de verificación reporta que el minero podría seguir ejecutándose:
⚠️ EL MINERO PUEDE HABER REAPARECIDO
CPU: 89% | Conexiones mineras: 1
Los bloqueos de firewall están en su lugar — el minero no puede alcanzar el pool
Considera un REINICIO o REINSTALACIÓN DEL SISTEMA OPERATIVO
# 1. Los bloqueos de firewall ya están en su lugar — el minero NO PUEDE alcanzar su pool
# Confirma que los bloqueos están activos:
iptables -L OUTPUT -n | grep DROP
# 2. Ejecuta un segundo escaneo para ver qué sobrevivió
sudo ./miner-hunter scan
# 3. Verifica si hay un rootkit de módulo del kernel ocultando el proceso
lsmod | grep -iE 'diamorphine|reptile|kovid|rootkit'
# 4. Valor de tainted distinto de cero = módulos del kernel fuera de árbol cargados (indicador de rootkit)
cat /proc/sys/kernel/tainted
Si el valor de tainted del kernel es distinto de cero o aparece un módulo rootkit conocido — el minero tiene control a nivel de kernel. El camino más seguro en este punto es una reinstalación completa del sistema operativo desde una instantánea limpia conocida.
Después de harden, el watchdog cron ya está instalado. Aquí te mostramos cómo trabajar con él:
# Ve el registro de alertas en tiempo real
tail -f /var/log/miner_hunter/watchdog_alerts.log
# Confirma que la tarea cron del watchdog está registrada
cat /etc/cron.d/miner-watchdog
# Verifica cambios en binarios de /usr/bin desde que se tomó tu línea base
md5sum --check /var/lib/miner_hunter/usrbin_baseline.md5 --quiet
Cualquier salida del último comando significa que un binario del sistema fue modificado después de tu línea base — investiga inmediatamente.
| Técnica | Lo que detecta |
|---|---|
Comparación /proc vs ps | Procesos invisibles para herramientas de espacio de usuario |
| Secuestro LD_PRELOAD | Bibliotecas compartidas maliciosas que enganchan libc para ocultar procesos |
| Rootkits de módulo del kernel | Diamorphine, Reptile, Kovid y otros rootkits conocidos |
| Hilos falsos del kernel | Mineros disfrazados como [kworker], [kthreadd], [kswapd] |
| Binarios del sistema modificados | ps, top, ls, ss, netstat reemplazados |
| Técnica | Lo que detecta |
|---|---|
Perfilado PMC de hardware con perf | Consumidores de CPU ocultos — los rootkits no pueden falsificar contadores de hardware |
Muestreo delta de /proc | Contabilidad de CPU directa a nivel de kernel por PID |
| Detección de anomalías de CPU | Alto %user de CPU sin proceso visible que lo explique |
| Técnica | Lo que detecta |
|---|---|
Lectura directa de /proc/net/tcp | Conexiones activas — evita ss/netstat enganchados |
| Detección de puertos de minería | Puertos 3333, 4444, 5555, 7777, 9200, 14433, 14444, 45560 |
| Resolución de dominios de minería | Resuelve dominios de pool conocidos y verifica conexiones activas |
| Mapeo Socket-a-PID | Rastrea qué proceso posee cada conexión minera |
| Ubicación | Lo que verifica |
|---|---|
| Cron | /etc/cron*, /var/spool/cron/, todos los crontabs de usuario |
| Systemd | Todos los archivos de unidad y temporizadores para entradas sospechosas |
| Reglas Udev | Ejecución desencadenada por hardware en eventos de dispositivo |
| PM2 | Entradas del administrador de procesos Node.js con conteos de reinicio extremos |
| Perfiles de shell | .bashrc, .bash_profile, /etc/profile, /etc/profile.d/* |
| SSH | Todos los archivos authorized_keys de todos los usuarios |
| Webshells | Archivos PHP dentro de directorios de proyectos Node.js |
| Configuraciones XMRig | config.json en ubicaciones comunes de caída de mineros |
Cuando ejecutas sudo ./miner-hunter kill, esta es la secuencia exacta:
DROP se aplican antes de matar, para que el minero no pueda reconectarse incluso si reapareceSIGKILLperf y verifica /proc/net/tcp para confirmar que la CPU bajó y las conexiones desaparecieron| Acción | Detalle |
|---|---|
| Persistencia del firewall | Servicio systemd para restaurar los bloqueos de minería en iptables en cada reinicio |
| Auditoría SSH | Verifica PermitRootLogin, PasswordAuthentication, MaxAuthTries — imprime valores recomendados |
| Verificación Fail2ban | Verifica que la jaula sshd esté activa e informa IPs bloqueadas actualmente |
| Watchdog de mineros | Tarea cron cada 5 minutos — verifica anomalías de CPU, LD_PRELOAD, puertos de minería, webshells PHP |
Línea base de /usr/bin | Checksums MD5 de todos los binarios en /usr/bin para futura detección de manipulación |
security-checks/ ← raíz del repositorio (rama master)
├── miner-hunter # Punto de entrada — esto es lo que ejecutas
├── setup.sh # ⚙️ Configuración inicial — ejecuta una vez después de clonar
├── lib/
│ ├── common.sh # Utilidades compartidas: registro, colores, ayudantes
│ ├── detect_hidden.sh # Detección de procesos ocultos y rootkits
│ ├── detect_cpu.sh # Perfilado de CPU mediante perf & /proc
│ ├── detect_network.sh # Detección de conexiones a pools de minería
│ ├── detect_persistence.sh # Detección de mecanismos de persistencia
│ ├── kill_miner.sh # Eliminación de procesos y eliminación de artefactos
│ └── harden.sh # Endurecimiento post-incidente
├── README.md
└── LICENSE
| Requisito | Detalle |
|---|---|
| SO | Linux — probado en Ubuntu 24.04 LTS, Debian 13 |
| Privilegios | Debe ejecutarse como root (sudo) |
| Instalado automáticamente por setup.sh | perf, mpstat (sysstat), bc, strings (binutils) |
| Recomendado | fail2ban — se señala si falta, no se instala automáticamente |
| Requerido (no instalado automáticamente) | iptables — debe estar presente para las fases kill/harden |
Cada ejecución produce:
| Salida | Ubicación | Contenido |
|---|---|---|
| Directorio de evidencia | /root/miner_evidence_YYYYMMDD_HHMMSS/ | Binarios capturados, informes perf, configuraciones de mineros |
| Archivo de registro | /var/log/miner_hunter/run_YYYYMMDD_HHMMSS.log | Registro completo con marcas de tiempo de la ejecución |
| Informe | evidence_dir/report.txt | Resumen estructurado de hallazgos con severidades |
| Alertas de watchdog | /var/log/miner_hunter/watchdog_alerts.log | Alertas continuas después de harden |
| Línea base de integridad | /var/lib/miner_hunter/usrbin_baseline.md5 | Checksums de /usr/bin después de harden |
Esta herramienta fue construida durante respuesta a incidentes activa contra un criptominero que:
next para mezclarse con procesos de Next.js en un servidor Node.jskthreadd — un nombre real de hilo del kernel/proc/PID/exe → (deleted))ps, top, htop y btopperfMIT