Scenario
Supponiamo che il vostro sito sia diventato oggetto delle attenzioni di un grabber (di cui non si conosce l’indirizzo IP pubblico), che ogni X tempo ne preleva il contenuto forzosamente.
Supponiamo, inoltre, che il suddetto grabber sia abbastanza intelligente da coprire le proprie tracce “spoofando” lo user agent in modo da apparire come un client lecito.
Nel caso in cui non si abbiano a disposizione strumenti di log analysis avanzati quali Splunk, l’unica alternativa per individuare l’IP pubblico del grabber consiste nel crearsi degli strumenti ad-hoc, in grado di fare un conteggio del numero di hit per ciascun IP pubblico che ha contattato il nostro sito.
In soldoni si tratta di un semplice scrip bash, che riporto di seguito.
#!/bin/bash filename1="/var/log/sniffer.log" filename2="/var/log/sources.log" filename3="/var/log/sources_sorted.log" filename4="/var/log/sources_sorted_by_hits.log" if [ -e $filename1 ];then cat /dev/null > $filename1 fi if [ -e $filename2 ];then cat /dev/null > $filename2 fi if [ -e $filename3 ];then cat /dev/null > $filename3 fi if [ -e $filename4 ];then cat /dev/null > $filename4 fi echo "" echo -e "33[32mSniffing traffic... Press CTRL+C to stop" echo -e "33[37m" START=$(date +%s); iftop -i eth0 -n -f 'port (80 or 443)' -t > $filename1 echo "" read -p "Press [Enter] key to continue..." END=$(date +%s); ELAPSED_TIME=$((END-START)) echo -e "33[32mShowing hit number provided in $ELAPSED_TIME seconds, ordered by source..." echo -e "33[37m" cat $filename1 | grep '<=' | awk '{ print $1 }' > $filename2 cat $filename2 | sort -u > $filename3 while read line do hits=`cat $filename2 | grep $line | wc -l` host=`host $line` echo "hits for IP $line ($host): $hits" >> $filename4 done < $filename3 cat $filename4 | sort -k 5 -nr exit 0
Esso si basa principalmente sul software iftop e, una volta lanciato, rimane in ascolto sulle porte di interesse (nel nostro caso la TCP/80 e la TCP/443), per poi stilare una “classifica” di IP pubblici in base al numero di hit che hanno prodotto durante il tempo di osservazione.
Come informazione aggiuntiva, per ogni IP viene ricavato anche il suo FQDN (attraverso il comando host), in modo da individuare ancora più facilmente la provenienza del grabber.
Per maggiore chiarezza, ecco un esempio di output relativo al suddetto script:
hits for IP 87.18.215.154 (154.215.18.87.in-addr.arpa domain name pointer host154-215-dynamic.18-87-r.retail.telecomitalia.it.): 18 hits for IP 84.223.145.17 (17.145.223.84.in-addr.arpa domain name pointer dynamic-adsl-84-223-145-17.clienti.tiscali.it.): 23 hits for IP 84.222.212.172 (172.212.222.84.in-addr.arpa domain name pointer dynamic-adsl-84-222-212-172.clienti.tiscali.it.): 23 hits for IP 79.18.99.217 (217.99.18.79.in-addr.arpa domain name pointer host217-99-dynamic.18-79-r.retail.telecomitalia.it.): 24 hits for IP 2.35.156.49 (49.156.35.2.in-addr.arpa domain name pointer net-2-35-156-49.cust.vodafonedsl.it.): 21 hits for IP 188.87.64.235 (235.64.87.188.in-addr.arpa domain name pointer static-235-64-87-188.ipcom.comunitel.net.): 23 hits for IP 151.45.153.218 (218.153.45.151.in-addr.arpa domain name pointer adsl-ull-218-153.45-151.net24.it.): 14
Inoltre, consultando il file /var/log/sources_sorted_by_hits.log, sarà possibile ricavare la lista degli IP/FQDN ordinati (in modo decrescente) in base al numero delle hit che hanno effettuato.
Una volta individuato l’IP che ci interessa non ci resta che bloccarlo utilizzando, ad esempio, iptables:
iptables -I INPUT -s <ip del grabber> -j DROP
ed abbiamo finito.
Alla prossima.