Un cliente nos llamo por un supuesto ataque de denegacion de servicio que sufrieron hace algunos dias. Baiscamente la arquitectura es un RP (ReverseProxy), con mod_security & mod_evasive, un proxy IBM (Webseal), dos servidores de aplicaciones y una base de datos con su correspondiente stand by. Los equipos se encuentran en vlans separadas, las comunicaciones se hacen mediante un FW (Firewall) ASA (Cisco).
Mod_Security & mod_evasive estaban desactivados para el sitio que supuestamente fue atacado.
El FW no estaba logueando paquetes que deja pasar, ni tampoco aquellos que dropea. Esto hizo que el analisis del supuesto ataque DDos no se pudiera comenzar por el FW. Las graficas del iClass del servicio mostraban una saturacion de 24 horas. Estaba saturada tanto la salida como la bajada.
En base a esto comence a analizar los access_logs (posterior a una revission del log de messages y security). El RP contiene mas de 50 vhosts, analizar uno a uno se estaba volviendo un dolor de cabeza interminable.
Se me ocurrio hacer un pequeño (y muy basico), script que me ayudara a analizar rapidamente los logs.
Desarrolle una tool bien básica que nos permite determinar ataques DDos, Ataques DDos mediante botnets, Uer Agents con mayor actividad y cantidad de conexiones activas en un momento determinado para poder detectar un DDos en tiempo real:
1.- La opción uno analiza la cantidad de peticiones de una ip determinada. Esto lo hace leyendo sobre el archivo de logs o el directorio donde se encuentran los archivos.
La primera columna es la cantidad de peticiones, la segunda son las ip’s.
2.- La opción dos permite identificar si hubo algún ataque ocasionado por una botnet. Cuando se ataca con botnets, en los access_logs quedan patrones muy específicos. Por ejemplo: muchísimos gets a un archivo especifico y no a todo el sitio.
3.- La opción tres permite detectar cuales son los user agents con mayor actividad. En algunos casos, cuando se realizan ddoss con tools especificas, estas vienen con sus propios user agents, lo cual hace que sea bastante sencillo detectarlos.
4.- La opción cuatro permite detectar en tiempo real la cantidad de conexiones activas al servidor y sus ip’s de origen. Sirve mas que nada para detectar ataques DDos en tiempo real. Una opción interesante que le agregue es la posibilidad de guardar en un log la cantidad de conexiones activas en un momento determinado para poder analizarlo luego.
Como les comentaba, la herramienta es muy sencilla, basica y hecha en 10 minutos (puede tener errores). Esta hecha en bash, usa netstat, awk y algunos comandos bastante básicos de linux.
#!/bin/bash
#Beta Version developed by s3cur1tyr00t
bold=\`tput bold\`
normal=\`tput sgr0\`
menu="
${bold}
########################################
# 1.- Cantidad de peticiones por IP #
# 2.- URL's con mayor acceso (Botnet?) #
# 3.- User Agents con mayor actividad #
# 4.- Cantidad de conexiones activas #
# 5.- Cerrar #
########################################
${normal}
"
echo "$menu "
read option
case "$option" in
1) echo "Ingreso la opcion ${bold}$option
${normal}Escriba ruta del archivo de logs (ruta del directorio para buscar en todos los archivos): "
read log\_file
tail -n 10000 $log\_file | cut -f 1 -d ' ' | sort | uniq -c | sort -nr | more
;;
2) echo "Ingreso la opcion ${bold}$option
${normal}Escriba ruta del archivo de logs (ruta del directorio para buscar en todos los archivos): "
read log\_file
cut -f 2 -d '"' $log\_file | cut -f 2 -d ' ' | sort | uniq -c | sort -nr | more
;;
3) echo "Ingreso la opcion ${bold}$option
${normal}Escriba ruta del archivo de logs (ruta del directorio para buscar en todos los archivos): "
read log\_file
cut -f 4 -d '"' $log\_file | sort | uniq -c | sort -nr | more
;;
4) echo "Ingreso la opcion ${bold}$option
${normal}Cantidad de conexiones activas: "
netstat -an | grep 'tcp\\|udp' | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n
echo "
${bold}Que desea hacer?${normal}
1.- Guardar Salida en archivo de log
2.- Salir
"
read output
case "$output" in
1) echo "Defina nombre archivo: "
read file\_name
netstat -an | grep 'tcp\\|udp' | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n > $file\_name
;;
2) exit
;;
esac
;;
5) exit
;;
esac
exit
Autor: S3cur1tyR00t