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.
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.