Su ogni webserver pubblicato su internet, dal più piccolo al più gettonato, riceveremo costantemente scansioni alla ricerca di servizi aperti o vulnerabili.
Chiunque abbia mai prestato un minimo di attenzione ai log del proprio webserver, non potrà non aver notato richieste a phpmyadmin o a wp-login, anche se tali servizi in realtà non ci risultano nè esposti nè presenti.
Come da sempre è stato e come sarà (almeno fin quando ipv6 non entrerà a regime, rendendo le scansioni almeno un minimo più difficoltose per via dell'enorme quantità di indirizzi ip allocabili), la tendenza è quella di trovare server che espongano servizi vulnerabili per poi tentare una serie di preset di vulnerabilità note.
Una forma di prevenzione potrebbe essere quella di iniziare a leggere i log e blacklistare chi cerca palesemente servizi che in realtà non esponiamo. Banalmente tramite uno script in bash potremmo mandare in iptable l'ip sorgente (ammesso che questo sia davvero quello dell'attaccante) e magari anche geolocalizzarlo per farci un'idea generica della provenienza:
#!/bin/bash
SCANNER="FOCA\|DirBuster\|Morfeus strikes again"
SERVIZI="awstats.pl\|wrnnro1.html\|DirectDownload.jsp\|caspadmin\|php.exe\|how_to_login.html\wp-login.php\|w00tw00t.at\|phpmyadmin\|blog\|wordpress\|manager\|CFIDE\|admin\|horde\|vtigercrm\|pbx\|freepbx\|Cgi-Bin\|sqlweb\|sqladmin\|phppath\|PMA\|pma\|whois.raw\|sqlmanager\|.passwd\|typo3\|order\|phpMyAdmin\|websql\|phpmy-admin\|php-myadmin\|piranha\|xampp\|php-my-admin"
while true; do
LINE=$( grep "$SCANNER\|$SERVIZI" /var/log/apache2/access_log | grep -v blacklistedip.log | tail -n 1 )
if [ "$LINE" != "" ]; then
IP=$( echo $LINE | awk '{ print $1 }' );
date +%c >> blacklistedip.log;
echo "IP Address: $IP" >> blacklistedip.log;
geoiplookup $IP >> blacklistedip.log;
iptables -A INPUT -s $IP -j DROP;
fi
sleep 30
done
Intendiamoci:
- questo semplice script ha come scopo ultimo quello di dare un'idea: leggere, prestare attenzione e parsare i log. Può essere certamente affinato, migliorato, scritto in linguaggi più efficienti e più veloci. Non è intenzione di questo articolo trattare la sintassi o l'efficienza dello script;
- geoip deve essere scaricato e mantenuto aggiornato con geoip fetch, altrimenti avremo informazioni poco attendibili; al tempo stesso vanno verificati anche i percorsi dei log e se apache è configurato per scrivere anche in error_log;
- è opportuno creare dei meccanismi di whitelist, magari anteponendo in iptables classi e ip trust, onde evitare di essere blacklistati per errore;
- i servizi e gli scanner vanno attentamente rivisti, se utilizziamo awstat, ad esempio, non sarà una buona idea blacklistarlo!
E' bene ricordare, inoltre, che
- Questo tipo di operazione è solo la punta di un iceberg, mettere in sicurezza un webserver è un'operazione ben più articolata. Blacklistare gli scanner parsando i log è un "sofismo" accessorio, non certo alternativo a delle canoniche e tradizionali regole di sicurezza informatica. Se si espone phpmyadmin senza la dovuta attenzione, dedicarsi a parsare i log è l'ultimo dei problemi che l'amministratore di rete si deve porre.
- Altri programmi fanno già questo tipo di analisi, come il noto scanlogd che, unito a fail2ban, potrebbe fornire un'alternativa più userfriendly del crearsi uno script ad hoc.
Discaimer: Ogni articolo di questo blog è stato integralmente scritto dall'autore. Il contenuto è completamente originale e la riproduzione è vietata salvo autorizzazione.