Detectando actividad maliciosa en nuestro sistema Linux: ¿Somos parte de una botnet?
Introducción
En la era actual de amenazas cibernéticas cada vez más sofisticadas, uno de los riesgos más preocupantes es que nuestros sistemas sean comprometidos y utilizados como parte de una botnet sin nuestro conocimiento. Estas redes de equipos infectados pueden ser utilizadas para realizar ataques DDoS, minería de criptomonedas, envío de spam, o robo de datos, entre otras actividades maliciosas.
En este artículo del blog Emacs con Esteroides, presentaremos un script en Bash para detectar posibles señales de que nuestro sistema Linux está siendo utilizado como parte de una botnet o está bajo ataque. El script realiza comprobaciones exhaustivas del sistema y genera un informe detallado que podemos analizar para determinar si hay actividad sospechosa.
¿Qué es una botnet?
Una botnet es una red de equipos infectados con malware que son controlados remotamente por un atacante, conocido como "botmaster". Los equipos comprometidos, llamados "zombies" o "bots", ejecutan comandos sin el conocimiento de sus propietarios.
Señales comunes de que un sistema puede formar parte de una botnet:
- Conexiones de red inusuales o no autorizadas
- Procesos desconocidos con alto consumo de recursos
- Tráfico de red anómalo
- Servicios o puertos abiertos inesperados
- Modificaciones en archivos críticos del sistema
- Entradas sospechosas en la tabla de rutas
- Tareas programadas desconocidas
El script de detección de botnets
Nuestro script realiza múltiples comprobaciones para identificar posibles indicios de compromiso:
#!/bin/bash # botnet_detector.sh - Script para detectar posibles indicios de botnet en sistemas Linux # Blog: Emacs con Esteroides # Autor: Emacs con Esteroides # Fecha: 15/04/2025 # Licencia: GPL v3 # Colores para mejor visualización RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[0;33m' BLUE='\033[0;34m' PURPLE='\033[0;35m' CYAN='\033[0;36m' NC='\033[0m' # No Color # Función para imprimir encabezados print_header() { echo -e "\n${BLUE}====================================${NC}" echo -e "${BLUE}$1${NC}" echo -e "${BLUE}====================================${NC}\n" } # Función para imprimir mensajes de alerta print_alert() { echo -e "${RED}[ALERTA] $1${NC}" } # Función para imprimir mensajes de advertencia print_warning() { echo -e "${YELLOW}[ADVERTENCIA] $1${NC}" } # Función para imprimir mensajes informativos print_info() { echo -e "${GREEN}[INFO] $1${NC}" } # Verificar si se está ejecutando como root if [ "$(id -u)" != "0" ]; then echo -e "${RED}Este script debe ejecutarse como root${NC}" exit 1 fi # Crear directorio para informes si no existe REPORT_DIR="/var/log/security_checks" TIMESTAMP=$(date +"%Y%m%d_%H%M%S") REPORT_FILE="${REPORT_DIR}/botnet_check_${TIMESTAMP}.log" if [ ! -d "$REPORT_DIR" ]; then mkdir -p "$REPORT_DIR" fi # Función para registrar en el archivo de informe log() { echo "$1" >> "$REPORT_FILE" echo -e "$1" } # Redireccionar la salida al archivo de registro y a la consola exec > >(tee -a "$REPORT_FILE") 2>&1 print_header "DETECTOR DE BOTNETS Y ACTIVIDAD MALICIOSA" echo "Iniciando análisis: $(date)" echo "Sistema: $(uname -a)" echo "Usuario: $(whoami)" echo "Informe guardado en: $REPORT_FILE" echo # Comprobar herramientas necesarias e instalarlas si faltan check_tools() { print_header "Verificando herramientas necesarias" TOOLS=("lsof" "netstat" "tcpdump" "htop" "iftop" "rkhunter" "chkrootkit" "lynis" "clamav" "sysstat") PACKAGES=("lsof" "net-tools" "tcpdump" "htop" "iftop" "rkhunter" "chkrootkit" "lynis" "clamav" "sysstat") MISSING=() for i in "${!TOOLS[@]}"; do if ! command -v "${TOOLS[$i]}" &> /dev/null; then echo -e "${YELLOW}Herramienta ${TOOLS[$i]} no encontrada${NC}" MISSING+=("${PACKAGES[$i]}") else echo -e "${GREEN}✓ ${TOOLS[$i]} instalado${NC}" fi done if [ ${#MISSING[@]} -gt 0 ]; then echo -e "\n${YELLOW}Instalando herramientas faltantes...${NC}" apt-get update apt-get install -y "${MISSING[@]}" # Verificar si hubo algún error en la instalación if [ $? -ne 0 ]; then echo -e "${RED}Error al instalar algunas herramientas. El script puede no funcionar correctamente.${NC}" else echo -e "${GREEN}Todas las herramientas necesarias han sido instaladas.${NC}" fi else echo -e "${GREEN}Todas las herramientas necesarias están instaladas.${NC}" fi } # 1. Comprobar procesos sospechosos (alto uso de CPU/memoria) check_suspicious_processes() { print_header "Comprobando procesos sospechosos" # Procesos con mayor consumo de CPU echo -e "${CYAN}Procesos con mayor consumo de CPU:${NC}" ps aux --sort=-%cpu | head -11 # Procesos con mayor consumo de memoria echo -e "\n${CYAN}Procesos con mayor consumo de memoria:${NC}" ps aux --sort=-%mem | head -11 # Buscar nombres de procesos sospechosos (mineros comunes, etc.) SUSPICIOUS_PROCESS_NAMES=("miner" "xmr" "monero" "cryptonight" "stratum" "coinhive" "xmrig" "cpuminer" "nanopool" "minergate") echo -e "\n${CYAN}Buscando procesos con nombres sospechosos:${NC}" FOUND=0 for name in "${SUSPICIOUS_PROCESS_NAMES[@]}"; do RESULT=$(pgrep -l -f "$name") if [ -n "$RESULT" ]; then print_alert "Posible proceso de minería detectado: $RESULT" FOUND=1 fi done if [ $FOUND -eq 0 ]; then print_info "No se encontraron procesos con nombres sospechosos." fi # Verificar procesos ocultos (con caracteres especiales o espacios en blanco) echo -e "\n${CYAN}Buscando procesos con nombres ocultos o sospechosos:${NC}" ps aux | grep -E '[ ]{2,}[^ ]+$|[.][^ ]|^ ' # Procesos sin binarios en disco (posible indicación de malware en memoria) echo -e "\n${CYAN}Procesos sin binarios en disco (posible malware en memoria):${NC}" for pid in $(ls /proc/ | grep -E '^[0-9]+$'); do if [ -d "/proc/$pid" ]; then BINARY=$(ls -l /proc/$pid/exe 2>/dev/null | awk '{print $NF}') if [[ "$BINARY" == *"(deleted)"* || -z "$BINARY" ]]; then PROCESS_NAME=$(cat /proc/$pid/comm 2>/dev/null) CMDLINE=$(cat /proc/$pid/cmdline 2>/dev/null | tr '\0' ' ') if [ -n "$PROCESS_NAME" ] && [ "$PROCESS_NAME" != "ps" ] && [ "$PROCESS_NAME" != "grep" ]; then print_warning "Proceso sin binario en disco: PID=$pid NOMBRE=$PROCESS_NAME CMDLINE=$CMDLINE" fi fi fi done } # 2. Comprobar conexiones de red sospechosas check_suspicious_connections() { print_header "Comprobando conexiones de red sospechosas" # Listar todas las conexiones echo -e "${CYAN}Todas las conexiones activas:${NC}" netstat -tunapl # Conexiones establecidas echo -e "\n${CYAN}Conexiones establecidas:${NC}" netstat -tunapl | grep ESTABLISHED # Puertos en escucha echo -e "\n${CYAN}Puertos en escucha:${NC}" netstat -tunapl | grep LISTEN # Puertos comúnmente asociados con botnets y malware SUSPICIOUS_PORTS=(4444 5555 6666 6667 6697 8080 9999 1080 11111 1337 31337 34567 65535) echo -e "\n${CYAN}Buscando puertos sospechosos:${NC}" FOUND=0 for port in "${SUSPICIOUS_PORTS[@]}"; do RESULT=$(netstat -tunapl | grep ":$port ") if [ -n "$RESULT" ]; then print_alert "Puerto sospechoso $port en uso: $RESULT" FOUND=1 fi done if [ $FOUND -eq 0 ]; then print_info "No se encontraron puertos sospechosos comunes en uso." fi # Comprobar conexiones a IPs sospechosas (servidores C&C conocidos) # Esta lista debería ser actualizada periódicamente con IPs conocidas de C&C echo -e "\n${CYAN}Comprobando conexiones a posibles servidores C&C:${NC}" # Ejemplo simple - en una implementación real, esta lista debería ser más extensa # y actualizada desde una fuente confiable SUSPICIOUS_IPS=("185.26.205." "91.121." "212.83." "88.208.") FOUND=0 for ip_pattern in "${SUSPICIOUS_IPS[@]}"; do RESULT=$(netstat -tunapl | grep "$ip_pattern") if [ -n "$RESULT" ]; then print_alert "Conexión a posible servidor C&C detectada: $RESULT" FOUND=1 fi done if [ $FOUND -eq 0 ]; then print_info "No se encontraron conexiones a servidores C&C conocidos." fi # Analizar cantidad de conexiones por IP echo -e "\n${CYAN}IPs con múltiples conexiones (posible comunicación con C&C):${NC}" netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr | head -n 10 # Verificar conexiones salientes inusuales echo -e "\n${CYAN}Conexiones salientes posiblemente sospechosas:${NC}" OUTBOUND=$(netstat -tun | grep -v "127.0.0.1" | grep -v "LISTEN" | grep "ESTABLISHED") echo "$OUTBOUND" # Análisis de tráfico en tiempo real (muestra limitada) echo -e "\n${CYAN}Captura de tráfico en tiempo real (10 segundos):${NC}" timeout 10 tcpdump -nn -c 100 2>/dev/null || print_warning "No se pudo ejecutar tcpdump" } # 3. Comprobar archivos y directorios sospechosos check_suspicious_files() { print_header "Comprobando archivos y directorios sospechosos" # Archivos modificados recientemente echo -e "${CYAN}Archivos del sistema modificados en las últimas 24 horas:${NC}" find /bin /usr/bin /sbin /usr/sbin -type f -mtime -1 -ls | grep -v "\.git" # Buscar archivos setuid/setgid (potencialmente peligrosos) echo -e "\n${CYAN}Archivos con permisos SUID/SGID (verificar si son legítimos):${NC}" find / -type f \( -perm -4000 -o -perm -2000 \) -ls 2>/dev/null | grep -v -E "/snap/|/var/lib/snapd/" # Buscar archivos ejecutables en /tmp y /var/tmp echo -e "\n${CYAN}Archivos ejecutables en directorios temporales:${NC}" find /tmp /var/tmp /dev/shm -type f -perm -100 -ls 2>/dev/null # Buscar scripts de inicio sospechosos echo -e "\n${CYAN}Scripts de inicio potencialmente sospechosos:${NC}" for dir in /etc/init.d /etc/init /etc/rc*.d /etc/systemd/system /usr/lib/systemd/system; do find "$dir" -type f -mtime -7 -ls 2>/dev/null done # Buscar archivos ocultos en el directorio home echo -e "\n${CYAN}Archivos ocultos recientes en directorios home:${NC}" find /home -type f -name ".*" -mtime -7 -ls 2>/dev/null | grep -v -E "\.cache|\.config|\.local|\.dbus|\.mozilla|\.bash_history" # Buscar archivos con nombres sospechosos echo -e "\n${CYAN}Archivos con nombres potencialmente sospechosos:${NC}" find / -type f -name "*backdoor*" -o -name "*rootkit*" -o -name "*trojan*" -o -name "*miner*" -o -name "*xmr*" -o -name "*monero*" 2>/dev/null } # 4. Comprobar tareas programadas check_scheduled_tasks() { print_header "Comprobando tareas programadas" # Crontabs del sistema echo -e "${CYAN}Crontabs del sistema:${NC}" for user in $(cut -f1 -d: /etc/passwd); do crontab -l -u "$user" 2>/dev/null if [ $? -eq 0 ]; then echo -e "Crontab del usuario $user:" crontab -l -u "$user" echo fi done # Otros archivos cron echo -e "\n${CYAN}Otros archivos cron:${NC}" for dir in /etc/cron.d /etc/cron.daily /etc/cron.hourly /etc/cron.monthly /etc/cron.weekly; do echo -e "Contenido de $dir:" ls -la "$dir" 2>/dev/null echo done # Comprobar /etc/crontab echo -e "\n${CYAN}Contenido de /etc/crontab:${NC}" cat /etc/crontab # Comprobar systemd timers echo -e "\n${CYAN}Systemd timers:${NC}" systemctl list-timers --all } # 5. Comprobar usuarios y permisos check_users_and_permissions() { print_header "Comprobando usuarios y permisos" # Listar usuarios echo -e "${CYAN}Lista de usuarios en el sistema:${NC}" cut -d: -f1,3,7 /etc/passwd | sort # Usuarios con UID 0 (root) echo -e "\n${CYAN}Usuarios con privilegios de root (UID 0):${NC}" grep ":0:" /etc/passwd # Usuarios que pueden usar sudo echo -e "\n${CYAN}Usuarios que pueden usar sudo:${NC}" grep -Po '^sudo.+:\K.*$' /etc/group cat /etc/sudoers.d/* /etc/sudoers 2>/dev/null | grep -v "^#" | grep -v "^$" # Últimos inicios de sesión echo -e "\n${CYAN}Últimos inicios de sesión:${NC}" last | head -20 # Sesiones activas echo -e "\n${CYAN}Sesiones activas:${NC}" w who # Comprobar usuarios conectados por SSH echo -e "\n${CYAN}Usuarios conectados por SSH:${NC}" netstat -tnpa | grep "ESTABLISHED.*sshd" # Archivos de autorización SSH echo -e "\n${CYAN}Archivos authorized_keys (verificar claves no autorizadas):${NC}" find /home -name "authorized_keys" -exec ls -la {} \; -exec cat {} \; 2>/dev/null find /root -name "authorized_keys" -exec ls -la {} \; -exec cat {} \; 2>/dev/null } # 6. Comprobar servicios y daemons check_services() { print_header "Comprobando servicios y daemons" # Servicios activos echo -e "${CYAN}Servicios systemd activos:${NC}" systemctl list-units --type=service --state=running # Todos los servicios echo -e "\n${CYAN}Todos los servicios systemd:${NC}" systemctl list-unit-files --type=service # Servicios iniciados recientemente echo -e "\n${CYAN}Servicios iniciados en los últimos 3 días:${NC}" find /etc/systemd/system /usr/lib/systemd/system -type f -name "*.service" -mtime -3 -ls # Servicios no estándar echo -e "\n${CYAN}Servicios potencialmente no estándar:${NC}" systemctl list-units --type=service | grep -v -E "systemd|dbus|getty|ssh|network|ifup|rpc|nfs|syslog|cron|anacron|atd|udev|acpid|rsyslog|logind|getty|apache|nginx|mariadb|mysql|postgresql" } # 7. Realizar escaneos con herramientas de seguridad security_scans() { print_header "Ejecutando escaneos de seguridad" # Ejecutar rkhunter para buscar rootkits if command -v rkhunter &> /dev/null; then echo -e "${CYAN}Ejecutando rkhunter (escaneo de rootkits):${NC}" rkhunter --check --sk || print_warning "rkhunter falló o encontró problemas" else print_warning "rkhunter no está instalado" fi # Ejecutar chkrootkit if command -v chkrootkit &> /dev/null; then echo -e "\n${CYAN}Ejecutando chkrootkit:${NC}" chkrootkit -q || print_warning "chkrootkit falló o encontró problemas" else print_warning "chkrootkit no está instalado" fi # Ejecutar lynis para auditoría de seguridad if command -v lynis &> /dev/null; then echo -e "\n${CYAN}Ejecutando lynis (auditoría básica):${NC}" lynis audit system --quick || print_warning "lynis falló o encontró problemas" else print_warning "lynis no está instalado" fi # Ejecutar ClamAV para buscar malware if command -v clamscan &> /dev/null; then echo -e "\n${CYAN}Ejecutando ClamAV en directorios críticos:${NC}" clamscan --recursive --suppress-ok-results /etc /tmp /var/tmp /home/*/.ssh /root || print_warning "clamscan falló o encontró problemas" else print_warning "ClamAV no está instalado" fi } # 8. Comprobar registros del sistema check_logs() { print_header "Analizando registros del sistema" # Verificar intentos de inicio de sesión fallidos echo -e "${CYAN}Intentos de inicio de sesión fallidos:${NC}" grep "Failed password" /var/log/auth.log* | tail -n 20 # Comprobación de conexiones rechazadas echo -e "\n${CYAN}Conexiones rechazadas:${NC}" grep -i "connection refused\|failed to connect" /var/log/syslog* | tail -n 20 # Mensajes de error críticos echo -e "\n${CYAN}Mensajes de error críticos:${NC}" grep -i "error\|critical\|warning\|fail" /var/log/syslog* | tail -n 50 # Buscar IPs que intentan múltiples inicios de sesión echo -e "\n${CYAN}IPs con múltiples intentos de inicio de sesión:${NC}" grep "Failed password" /var/log/auth.log* | grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}" | sort | uniq -c | sort -nr | head -n 10 } # 9. Comprobar volumen de tráfico de red check_network_traffic() { print_header "Analizando tráfico de red" # Estadísticas de uso de red if command -v vnstat &> /dev/null; then echo -e "${CYAN}Estadísticas de tráfico de red:${NC}" vnstat else echo -e "${CYAN}Estadísticas de interfaces de red:${NC}" ip -s link fi # Mostrar tabla de rutas echo -e "\n${CYAN}Tabla de rutas:${NC}" ip route # Mostrar puertos abiertos echo -e "\n${CYAN}Puertos abiertos:${NC}" ss -tuln # Capturar y analizar una muestra de tráfico echo -e "\n${CYAN}Análisis de muestra de tráfico (5 segundos):${NC}" timeout 5 tcpdump -nn -q -i any 2>/dev/null || print_warning "No se pudo ejecutar tcpdump" } # 10. Comprobación del rendimiento del sistema check_system_performance() { print_header "Analizando rendimiento del sistema" # Uso de CPU y memoria echo -e "${CYAN}Uso de CPU y memoria:${NC}" top -bn 1 | head -20 # Comprobación de la carga del sistema echo -e "\n${CYAN}Carga del sistema:${NC}" uptime # Uso de disco echo -e "\n${CYAN}Uso de disco:${NC}" df -h # Directorios que ocupan más espacio echo -e "\n${CYAN}Directorios que ocupan más espacio:${NC}" du -sh /* 2>/dev/null | sort -hr | head -10 # Comprobar swap echo -e "\n${CYAN}Uso de swap:${NC}" free -h swapon --show # Comprobar si hay procesos zombies echo -e "\n${CYAN}Procesos zombie:${NC}" ps aux | awk '$8=="Z"' } # 11. Generar resumen e informe final generate_summary() { print_header "RESUMEN DE LA DETECCIÓN" # Comprobar indicadores clave de compromiso echo -e "${CYAN}Indicadores clave revisados:${NC}" # 1. Procesos sospechosos SUSPICIOUS_PROCS=$(ps aux | grep -E 'miner|xmr|monero|cryptonight|stratum' | grep -v grep | wc -l) if [ "$SUSPICIOUS_PROCS" -gt 0 ]; then print_alert "⚠️ Se encontraron $SUSPICIOUS_PROCS procesos con nombres sospechosos" else print_info "✓ No se encontraron procesos con nombres asociados a minería/botnet" fi # 2. Puertos sospechosos SUSPICIOUS_PORTS_COUNT=$(netstat -tunapl 2>/dev/null | grep -E ':(4444|5555|6666|6667|8080|9999|1080|1337|31337)' | grep -v "127.0.0.1" | wc -l) if [ "$SUSPICIOUS_PORTS_COUNT" -gt 0 ]; then print_alert "⚠️ Se encontraron $SUSPICIOUS_PORTS_COUNT puertos sospechosos en uso" else print_info "✓ No se encontraron puertos comúnmente asociados con malware" fi # 3. Archivos sospechosos SUSPICIOUS_FILES=$(find /tmp /var/tmp /dev/shm -type f -perm -100 2>/dev/null | wc -l) if [ "$SUSPICIOUS_FILES" -gt 3 ]; then print_warning "⚠️ Se encontraron $SUSPICIOUS_FILES archivos ejecutables en directorios temporales" else print_info "✓ Número normal de ejecutables en directorios temporales" fi # 4. Tareas cron sospechosas SUSPICIOUS_CRON=$(grep -r "curl\|wget\|nc\|netcat\|bash -i\|python -c\|perl -e" /etc/cron* /var/spool/cron/ 2>/dev/null | wc -l) if [ "$SUSPICIOUS_CRON" -gt 0 ]; then print_alert "⚠️ Se encontraron $SUSPICIOUS_CRON tareas cron potencialmente sospechosas" else print_info "✓ No se encontraron tareas cron sospechosas" fi # 5. Usuarios con UID 0 distintos de root ROOT_USERS=$(grep ":0:" /etc/passwd | grep -v "^root:" | wc -l) if [ "$ROOT_USERS" -gt 0 ]; then print_alert "⚠️ Se encontraron $ROOT_USERS usuarios adicionales con privilegios de root (UID 0)" else print_info "✓ Solo el usuario root tiene UID 0" fi # Evaluación final echo -e "\n${BLUE}EVALUACIÓN FINAL:${NC}" TOTAL_ALERTS=$(grep -c "\[ALERTA\]" "$REPORT_FILE") TOTAL_WARNINGS=$(grep -c "\[ADVERTENCIA\]" "$REPORT_FILE") if [ "$TOTAL_ALERTS" -gt 0 ]; then echo -e "${RED}⚠️ Se encontraron $TOTAL_ALERTS alertas y $TOTAL_WARNINGS advertencias que requieren investigación inmediata.${NC}" echo -e "${RED}El sistema podría estar comprometido. Revise el informe completo y tome medidas.${NC}" elif [ "$TOTAL_WARNINGS" -gt 3 ]; then echo -e "${YELLOW}⚠️ Se encontraron $TOTAL_WARNINGS advertencias que requieren atención.${NC}" echo -e "${YELLOW}El sistema podría tener actividad sospechosa. Revise el informe completo.${NC}" else echo -e "${GREEN}✓ No se encontraron indicios claros de compromiso en el sistema.${NC}" echo -e "${GREEN}Continúe monitoreando regularmente.${NC}" fi # Recomendaciones echo -e "\n${CYAN}RECOMENDACIONES:${NC}" echo -e "1. Ejecute este script periódicamente para monitorear cambios" echo -e "2. Configure un sistema de monitoreo de integridad (como AIDE o Tripwire)" echo -e "3. Actualice regularmente el sistema y las aplicaciones" echo -e "4. Configure correctamente el firewall" echo -e "5. Implemente detección de intrusiones con herramientas como Snort o Suricata" echo -e "6. Siga las prácticas recomendadas de seguridad para servidores Linux" echo -e "\n${BLUE}Informe completo guardado en: $REPORT_FILE${NC}" } # Ejecutar todas las comprobaciones main() { check_tools check_suspicious_processes check_suspicious_connections check_suspicious_files check_scheduled_tasks check_users_and_permissions check_services security_scans check_logs check_network_traffic check_system_performance generate_summary print_header "FINALIZADO" echo "Análisis completado: $(date)" echo "Informe guardado en: $REPORT_FILE" } # Ejecutar el script principal main
¿Cómo funciona el script?
El script realiza una serie de verificaciones exhaustivas para detectar posibles signos de compromiso en el sistema:
Descripción de los módulos principales
1. Verificación de procesos sospechosos
Este módulo examina los procesos en ejecución para detectar:
- Procesos con alto consumo de CPU o memoria
- Procesos con nombres asociados a minería de criptomonedas o malware
- Procesos sin archivos binarios en disco (posible indicación de malware en memoria)
- Procesos con nombres ocultos o irreconocibles
2. Análisis de conexiones de red
Esta sección examina las conexiones de red para identificar:
- Puertos conocidos por ser utilizados por botnets y malware
- Conexiones a direcciones IP asociadas con servidores de comando y control (C&C)
- Patrones de tráfico inusuales o sospechosos
- Comunicaciones no autorizadas con el exterior
3. Verificación de archivos y directorios
El script busca:
- Archivos ejecutables en ubicaciones temporales
- Archivos del sistema modificados recientemente
- Archivos con permisos SUID/SGID sospechosos
- Archivos ocultos con nombres o comportamientos inusuales
4. Análisis de tareas programadas
Se examinan:
- Tareas cron para todos los usuarios
- Archivos cron del sistema
- Timers de systemd
- Scripts de inicio modificados recientemente
5. Verificación de usuarios y permisos
El script revisa:
- Usuarios con privilegios elevados (UID 0)
- Usuarios que pueden ejecutar comandos con sudo
- Sesiones SSH activas y recientes
- Claves de autorización SSH no autorizadas
6. Análisis de servicios
Esta sección examina:
- Servicios activos en el sistema
- Servicios configurados para iniciar automáticamente
- Servicios no estándar o sospechosos
- Servicios añadidos o modificados recientemente
7. Escaneos de seguridad
El script utiliza herramientas especializadas:
- RKHunter para detectar rootkits
- ChkRootkit como método adicional de detección
- Lynis para auditoría de seguridad general
- ClamAV para escaneo de malware
8. Análisis de logs
Se analizan los registros del sistema para identificar:
- Intentos de inicio de sesión fallidos
- Conexiones rechazadas
- Mensajes de error críticos
- Patrones de actividad sospechosa
9. Análisis de tráfico de red
El script examina:
- Estadísticas de uso de red
- Tabla de rutas para identificar redirecciones sospechosas
- Puertos abiertos y servicios escuchando
- Muestras de tráfico de red en tiempo real
10. Verificación del rendimiento
Se analiza:
- Uso de CPU y memoria
- Carga del sistema
- Uso de disco
- Procesos zombie y otros indicadores de actividad anómala
Informe y resumen final
Al finalizar todas las verificaciones, el script genera un informe detallado y un resumen que clasifica el estado del sistema en tres categorías:
- Sistema comprometido: Se detectaron alertas graves que indican alta probabilidad de infección.
- Actividad sospechosa: Se encontraron advertencias que requieren investigación adicional.
- Sistema limpio: No se detectaron indicios claros de compromiso.
El informe completo se guarda en el directorio /var/log/security_checks/ con una marca de tiempo para referencia futura y análisis comparativo.
Uso práctico del script
Requisitos previos
Antes de ejecutar el script, asegúrate de tener:
- Un sistema Linux (preferiblemente Ubuntu o una distribución basada en Debian)
- Acceso root o permisos de sudo
- Conexión a Internet (para instalar las herramientas faltantes)
Instalación y ejecución
- Copia el script completo en un archivo llamado
botnet_detector.sh - Dale permisos de ejecución:
chmod +x botnet_detector.sh
- Ejecuta el script como root:
sudo ./botnet_detector.sh
- El script automáticamente instalará las herramientas necesarias si no están presentes.
Automatización
Para monitorear regularmente tu sistema, puedes configurar el script como una tarea programada:
# Editar crontab sudo crontab -e # Añadir una línea para ejecutar el script semanalmente (por ejemplo, cada domingo a las 3:00 AM) 0 3 * * 0 /ruta/al/botnet_detector.sh
El informe se guardará con la fecha y hora de ejecución, permitiéndote comparar resultados a lo largo del tiempo.
Signos comunes de infección por botnet
Además de las verificaciones realizadas por el script, estos son signos adicionales que podrían indicar que tu sistema está comprometido:
Signos a nivel de sistema
- Tiempos de arranque o apagado inusualmente largos
- El sistema se vuelve significativamente más lento sin razón aparente
- Crasheos frecuentes o pantallas azules (en Windows)
- Programas que se cierran o abren solos
- Cambios en la página de inicio del navegador o redirecciones web
Signos a nivel de red
- Uso de red elevado incluso cuando no estás utilizando activamente Internet
- Quejas de tu proveedor de Internet sobre tráfico sospechoso
- Tu dirección IP aparece en listas negras de spam
- Tu router tiene configuraciones que no recuerdas haber cambiado
Signos a nivel de usuario
- Cuentas de correo electrónico enviando spam sin tu conocimiento
- Actividad en tus cuentas que no reconoces
- Nuevos programas o extensiones del navegador que no instalaste
- Antivirus o firewalls desactivados sin tu intervención
Mejores prácticas para prevenir infecciones
La prevención es siempre la mejor estrategia. Estas son algunas recomendaciones para mantener tu sistema seguro:
- Mantén tu sistema actualizado
- Aplica parches de seguridad tan pronto como estén disponibles
- Actualiza regularmente todas las aplicaciones
- Configura un firewall robusto
Utiliza UFW (Uncomplicated Firewall) en Ubuntu:
sudo ufw enable sudo ufw default deny incoming sudo ufw default allow outgoing sudo ufw allow ssh
- Implementa un sistema de detección de intrusiones
- Considera herramientas como Snort, Suricata o OSSEC
- Monitorea la integridad del sistema
Instala AIDE (Advanced Intrusion Detection Environment):
sudo apt install aide sudo aideinit
- Refuerza la seguridad SSH
- Desactiva el login como root
- Utiliza autenticación por clave en lugar de contraseñas
- Cambia el puerto por defecto
- Implementa el principio de mínimo privilegio
- Crea usuarios con los permisos mínimos necesarios
- Utiliza sudo para tareas específicas en lugar de login como root
- Realiza backups regularmente
- Mantén copias de seguridad offline o en ubicaciones aisladas
- Verifica periódicamente que los backups funcionen correctamente
Qué hacer si encuentras un sistema comprometido
Si el script detecta signos de compromiso o tienes razones para creer que tu sistema es parte de una botnet:
- No apagues el sistema inmediatamente
- El análisis forense podría requerir información volátil en memoria
- Aísla el sistema de la red
- Desconecta físicamente el cable de red o desactiva la wifi
- Documenta todo
- Toma notas detalladas de lo que observas
- Guarda los informes generados por el script
- Preserva evidencia
- Crea una imagen forense si es posible
- Guarda logs y archivos relevantes
- Evalúa el impacto
- Determina qué datos o sistemas podrían estar comprometidos
- Verifica cuentas y servicios críticos
- Reconstruye desde cero
- La reinstalación completa es generalmente más segura que intentar limpiar
- Restaura datos desde backups verificados como limpios
- Aprende y mejora
- Analiza cómo ocurrió la intrusión
- Implementa medidas adicionales para prevenir futuros incidentes
Conclusión
La seguridad informática es un proceso continuo, no un estado final. Este script puede ayudarte a detectar posibles compromisos en tu sistema Linux, pero debe ser parte de una estrategia de seguridad más amplia que incluya buenas prácticas preventivas, monitoreo regular, y planes de respuesta a incidentes.
Utilizando Emacs y org-mode, puedes adaptar y mejorar este script según tus necesidades específicas, programar su ejecución regular, y documentar y analizar sus resultados de manera organizada.
Recuerda que ninguna herramienta automatizada puede reemplazar el conocimiento y la vigilancia humana. Mantente informado sobre nuevas amenazas y técnicas de ataque, y adapta tus defensas en consecuencia.
2025-04-15-gu-a-pr-ctica-configuraci-n-de-ufw-en-ubuntu-con-scripts-y-org-mode
2025-04-16–fortaleciendo-la-seguridad-inform-tica-con-snort-y-aide-gu-a-completa