In questo post vi ho mostrato un piccolo scrip 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.
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 scrip 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 scrip 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.