Magazine Informatica

ddosinfo: script per la creazione automatica di ACL Cisco contro gli attacchi DDoS

Creato il 31 agosto 2012 da Nightfly

In questo post vi ho mostrato un piccolo script per l'individuazione della nazionalità relativa agli IP sorgenti di un attacco DDoS. Avevo già preannunciato alcune modifiche, ovvero la generazione automatica delle ACL Cisco e l'aggiunta di un menù interattivo. Bhè, così è stato.

acl, cisco, acl standard, acl estese, acl nominali, bash, ddos, whois, IP, netblock

Per prima cosa installiamo il tool ipcalc, che ci servirà per calcolare le wildmask da impostare sulle ACL:

nightfly@nightbox:~$ sudo apt-get install ipcalc

Successivamente creiamo un file testuale vuoto su cui incolleremo il contenuto dello script e rendiamolo eseguibile:

nightfly@nightbox:~$ touch ddosinfo

nightfly@nightbox:~$ chmod +x ddosinfo

Non ci resta che copiarci dentro le seguenti direttive:

#!/bin/bash
touch ipinfo
touch target
touch parsed
touch acl
touch target_pari
touch target_dispari
touch target_parsed
while read line
do
   whois -F $line >> ipinfo
done < tlog
while read line
do
   locin=`echo $line | grep "*in"`
   loccy=`echo $line | grep "*cy"`
   if [[ -n "$locin" || -n "$loccy" ]]; then
      echo "$locin$loccy"  >> target
   fi
done < ipinfo
cat target | awk 'NR%2==1' >> target_dispari
cat target | awk 'NR%2==0' >> target_pari
paste target_dispari target_pari | grep -v "IT" >> target_parsed
while read line
do
   block=`echo $line | grep "*in" | sed s/*in://g`
   if [ -n "$block" ]; then
         wild1=`ipcalc $block | awk '{ print $1 }' | sed s/deaggregate//g`
      wild2=`ipcalc -b $wild1 | awk 'BEGIN { FS = "Wildcard: " } ; { print $2 }' | tr 'n' ' ' | sed 's/^[ t]*//;s/[ t]*$//;'`
      wild3=`ipcalc -b $wild1 | awk 'BEGIN { FS = "Address: " } ; { print $2 }' | sed 's/^[ t]*//;s/[ t]*$//'`
      echo "$wild3 $wild2" >> parsed
   fi
done < target_parsed
echo "Seleziona il tipo di ACL:"
echo "1 - standard"
echo "2 - estesa"
echo "3 - nominale"
read scelta;
if [ $scelta == 1 ]; then
   while true;
   do
   echo "Inserisci l'identificativo dell'acl (1-99):"
  
   read numero;
  
   if [[ $numero =~ ^([1-9]|[1-9][0-9])$ ]];then
      while true;
      do
         echo "Scegli il protocollo (ip-tcp-udp):"
         read protocollo;
         if [[ $protocollo =~ ^(ip|tcp|udp)$ ]];then
            while true;
            do
               echo "Vuoi attivare il logging? (S/N):"
               read logging;
               if [ $logging == "S" ];then
                  while read line
                  do
                     network=`echo $line | awk 'BEGIN { FS = " " } ; { print $1 }'`
                     wildcard=`echo $line | awk 'BEGIN { FS = " " } ; { print $2 }'`
                     echo "access-list $numero deny $protocollo $network $wildcard any log" >> acl
                  done < parsed
                  break
               else
                  if [ $logging == "N" ];then
                     while read line
               do
               network=`echo $line | awk 'BEGIN { FS = " " } ; { print $1 }'`
                        wildcard=`echo $line | awk 'BEGIN { FS = " " } ; { print $2 }'`
               echo "access-list $numero deny $protocollo $network $wildcard any" >> acl
               done < parsed
                  break
                  fi
               fi
            done
         fi
         break
      done
   break
   fi
   done
fi
if [ $scelta == 2 ]; then
   while true;
   do
   echo "Inserisci l'identificativo dell'acl (100-199 oppure 2000-2699):"
   read numero;
   if [[ $numero =~ ^(1[0-9][0-9]|2[0-6][0-9][0-9])$ ]];then
      while true;
      do
         echo "Scegli il protocollo (ip-tcp-udp):"
         read protocollo;
         if [[ $protocollo =~ ^(ip|tcp|udp)$ ]];then
            while true;
            do
               echo "Vuoi attivare il logging? (S/N):"
               read logging;
               if [ $logging == "S" ];then
                  while read line
                  do
                     network=`echo $line | awk 'BEGIN { FS = " " } ; { print $1 }'`
                     wildcard=`echo $line | awk 'BEGIN { FS = " " } ; { print $2 }'`
                     echo "access-list $numero deny $protocollo $network $wildcard any log" >> acl
                  done < parsed
                  break
               else
                  if [ $logging == "N" ];then
                     while read line
               do
               network=`echo $line | awk 'BEGIN { FS = " " } ; { print $1 }'`
                        wildcard=`echo $line | awk 'BEGIN { FS = " " } ; { print $2 }'`
               echo "access-list $numero deny $protocollo $network $wildcard any" >> acl
               done < parsed
                  break
                  fi
               fi
            done
         fi
         break
      done
   break
   fi
   done
fi
if [ $scelta == 3 ]; then
   while true;
   do
   echo "Inserisci il nome dell'acl:"
   read nome;
   if [[ $nome =~ [[:alpha:]] ]];then
      while true;
      do
         echo "Scegli il protocollo (ip-tcp-udp):"
         read protocollo;
         if [[ $protocollo =~ ^(ip|tcp|udp)$ ]];then
            while true;
            do
               echo "Vuoi attivare il logging? (S/N):"
               read logging;
               if [ $logging == "S" ];then
                  while read line
                  do
                     network=`echo $line | awk 'BEGIN { FS = " " } ; { print $1 }'`
                     wildcard=`echo $line | awk 'BEGIN { FS = " " } ; { print $2 }'`
                     echo "access-list $numero deny $protocollo $network $wildcard any log" >> acl
                  done < parsed
                  break
               else
                  if [ $logging == "N" ];then
                     while read line
               do
               network=`echo $line | awk 'BEGIN { FS = " " } ; { print $1 }'`
                        wildcard=`echo $line | awk 'BEGIN { FS = " " } ; { print $2 }'`
               echo "access-list $numero deny $protocollo $network $wildcard any" >> acl
               done < parsed
                  break
                  fi
               fi
            done
         fi
         break
      done
   break
   fi
   done
fi
rm ipinfo
rm parsed
rm target_*
exit 0;

Tale script consente di scegliere tra 3 tipoligie di ACL (tutte per il protocollo IP), ovvero:

1) standard;

2) estese;

3) nominali.

Le ACL generate verranno salvate all'interno del file acl, mentre gli IP sorgenti da analizzare vanno posizionati nel file tlog. Non vi rimane dunque che copiare il contenuto del file acl ed incollarlo nel firewall/router, sotto il menù di configurazione (config#) e successivamente associare l'access control list appena creata all'interfaccia target.

Avrete certamente notato che il codice non è dei più semplici per via del parsing massiccio che si è reso necessario. Tuttavia non scoraggiatevi, se avete delle domande (ed individuate eventuali falle/miglioramenti) non esitate a contattarmi.

A presto.


Potrebbero interessarti anche :

Ritornare alla prima pagina di Logo Paperblog

Possono interessarti anche questi articoli :