├── README ├── mail_send.sh ├── do_all.sh ├── show_ips.sh ├── get_info.sh └── get_logs.sh /README: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /mail_send.sh: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ajex/AntiDdosAbuse/HEAD/mail_send.sh -------------------------------------------------------------------------------- /do_all.sh: -------------------------------------------------------------------------------- 1 | parse_date="Nov 20" 2 | pref=test20 3 | iptraf_raw_file=/var/log/iptraf/iptraf.log 4 | echo "Грузим айпишники" 5 | ./show_ips.sh $iptraf_raw_file $parse_date > "/var/log/iptraf/ipcnt_$pref.txt" 6 | ./show_ips.sh 7 | echo "Получаем данные из Whois" 8 | ./get_info.sh "/var/log/iptraf/ipcnt_$pref.txt" $iptraf_raw_file > "/var/log/iptraf/log_email$pref.txt" 9 | echo "Извлекаем логи" 10 | ./get_logs.sh "/var/log/iptraf/ipcnt_$pref.txt" $iptraf_raw_file $parse_date $pref 11 | ./mail_send.sh "/var/log/iptraf/log_email$pref.txt" $pref -------------------------------------------------------------------------------- /show_ips.sh: -------------------------------------------------------------------------------- 1 | log_file=$1 2 | parse_date=$2 3 | 4 | #Скрипт для получения списка ип адресов и количества попыток соединения для каждого"; 5 | #Параметры запуска show_ips.sh "iptraf raw log" date'; 6 | #Где iptraf raw log это raw лог , полученный во время аттаки при помощи iptraf"; 7 | #date - интервал выборки, например "Nov 20" 8 | 9 | #Пример: show_ips.sh iptraf_nov20.log "Nov 20" > nov20.txt'; 10 | 11 | if [ ! -f "$log_file" ] 12 | then 13 | # Файл лога iptraf не найден! 14 | exit 15 | fi 16 | 17 | if [ -e "$parse_date" ] 18 | then 19 | # Укажите дату, за которую выбирать логи! 20 | exit 21 | fi 22 | 23 | cat $log_file | grep "$parse_date" | sed 's/:/ /g' | egrep -o 'from ([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}' |awk '{print $2}' | sort | uniq -c | sort -n 24 | -------------------------------------------------------------------------------- /get_info.sh: -------------------------------------------------------------------------------- 1 | ip_list=$1 2 | th_limit="3000" 3 | 4 | #Скрипт для извлечения email для отправки абуз по данным whois 5 | #Параметры запуска get_info.sh "ip list" 6 | # 7 | #Пример: get_logs.sh 20.txt > 20_email.txt 8 | # 9 | 10 | if [ ! -f "$ip_list" ] 11 | then 12 | # Файл со списком ip адресов не найден! 13 | exit 14 | fi 15 | 16 | # Выбираем айпишники, из списка 17 | ips=`cat $ip_list | egrep -o '[[:digit:]]+\s([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}' | sed 's/ /_/g'` 18 | for ip_rec in $ips; do 19 | ip=`echo $ip_rec | sed 's/_/ /g ' | awk '{print $2}'` 20 | cnt=`echo $ip_rec | sed 's/_/ /g ' | awk '{print $1}'` 21 | 22 | # Если кол-во установленных за интервал соединений больше заданной границы, это бот 23 | if [ "$cnt" -ge "$th_limit" ]; then 24 | email=`whois $ip | grep mail | awk '{print tolower($0)}' | egrep -o "\w+([._-]\w)*@\w+([._-]\w)*\.\w{2,4}"` 25 | 26 | # Если запрос не удался и не извлечено ни одного email ,пробуем еще разок 27 | if [ ! -n "$email" ] 28 | then 29 | email=`whois $ip | grep mail | awk '{print tolower($0)}' | egrep -o "\w+([._-]\w)*@\w+([._-]\w)*\.\w{2,4}"` 30 | fi 31 | 32 | # Выводим ip , кол-во попыток соединений за интервал, abuse почтовые адреса 33 | echo $ip $cnt $email 34 | fi 35 | done -------------------------------------------------------------------------------- /get_logs.sh: -------------------------------------------------------------------------------- 1 | ip_list=$1 2 | log_file=$2 3 | parse_date=$3 4 | pref=$4 5 | 6 | 7 | #Скрипт для извлечения логов по ip адресов, с которых велась аттака "; 8 | #Параметры запуска get_logs.sh "ip list" "iptraf raw log date [pref]" '; 9 | #Где ip list это список ip адресов, полученных скриптом show_ips.sh"; 10 | # "iptraf raw log" это raw лог , полученный во время аттаки при помощи iptraf"; 11 | # date - интервал выборки, например "Nov 20" 12 | # pref - префикс, котоырй будет ставиться перед названием файла с логом 13 | 14 | 15 | #Пример: get_logs.sh 20.txt iptraf.log Nov 20"; 16 | 17 | if [ ! -f "$ip_list" ] 18 | then 19 | # Файл со списком ip адресов не найден! 20 | exit 21 | fi 22 | 23 | if [ ! -f "$log_file" ] 24 | then 25 | # Файл лога iptraf не найден! 26 | exit 27 | fi 28 | 29 | if [ -e "$parse_date" ] 30 | then 31 | # Укажите дату, за которую выбирать логи! 32 | exit 33 | fi 34 | 35 | 36 | th_limit="3000" # Нижная граница числа коннектов, по которой мы считаем что запросы аномальные 37 | 38 | ips=`cat $ip_list | egrep -o '[[:digit:]]+\s([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}' | sed 's/ /_/g'` 39 | for ip_rec in $ips; do 40 | ip=`echo $ip_rec | sed 's/_/ /g ' | awk '{print $2}'` 41 | cnt=`echo $ip_rec | sed 's/_/ /g ' | awk '{print $1}'` 42 | 43 | # Если кол-во установленных за интервал соединений больше заданной границы, это бот 44 | if [ "$cnt" -ge "$th_limit" ]; then 45 | echo $ip; 46 | # Выводим 47 | cat $log_file | grep "$parse_date" | grep "from $ip" > $pref$ip.txt 48 | gzip $pref$ip.txt 49 | fi 50 | done --------------------------------------------------------------------------------