Attacco HTTP Flood: Capirlo per difendersi
Disclaimer
I passaggi di seguito illustrati, sono stati redatti a solo scopo dimostrativo e sfruttano vulnerabilità note.
Bertoldi Cybersecurity e i suoi collaboratori non hanno alcuna responsabilità per gli utilizzi impropri di questa guida.
Introduzione
L’attacco si basa sull’inondazione del web server con richieste lecite, con lo scopo di tenerlo in una situazione di saturazione/crash per aver superato i limiti massimi di richieste consentiti da parte di:
NGINX
APACHE
DATABASE
CPU/RAM/DISCO
Attacco
Quando viene eseguita dal nostro browser una richiesta verso una pagina, il server che la ospita la processerà.
Anche se l’utente fermerà o cancellerà la richiesta, il server continuerà ad elaborarla. Se ricarichiamo la pagina, un altra richiesta verrà processata, in parallelo con la prima richiesta. Sfrutteremo quindi questa possibilità simulando la pressione del tasto F5 un numero di volte elevatissimo. Una volta raggiunto il limite di richieste sopportabili per un sito web quest’ultimo andrà in crash. In questo esempio vedremo come effettuare l’attacco utilizzando il nostro pc ma solitamente, attacchi di questo tipo vengono distribuiti fra più macchine per aumentarne la portata.
Quando ricarichiamo una pagina dal browser, viene richiesta, al server che la ospita, una copia nuova della pagina e di tutti i suoi componenti (CSS, Javascript, Immagini, ecc.. ) a meno che quest’ultimi non vengano salvati nella cache del browser. Per evitare che i contenuti vengano caricati dalla cache del browser (poiché abbasserebbero il numero delle richieste al server) andremo anche a simulare le richieste mediante la pressione dei tasti SHIFT+F5, che su Google Chrome ricaricano la pagina richiedendola direttamente dal server evitando i contenuti in cache.
Strumenti usati per l’attacco:
-
AutoIt per l’esecuzione dello script
-
SciTE Lite per la creazione dello script (incluso nel pacchetto Full di AutoIt)
Una volta installato AutoIT apriamo l’editor SciTE Lite e scriviamo il seguente codice:
Sleep(5000) Send("{F5 100000}")
Quindi salviamo il file in formato .au3 per eseguirlo.
Come funziona ?
Il comando Sleep(5000) ci dà un lasso di tempo di 5 secondi dopo aver aperto lo script durante il quale ci dovremmo posizionare su una pagina del sito che vogliamo attaccare. A quel punto il comando Send(“{F5 100000}”) ricaricherà per 100000 volte la pagina scelta.
Solo su Google Chrome: sostituendo il comando Send(“{F5 100000}”) con Send(“+{F5 100000}”) verrà ricaricata la pagina escludendo il contenuto presente nella cache del browser.
Come usarlo ?
Si consiglia innanzitutto di mascherare il proprio IP reale utilizzando una VPN che non trattenga i log di navigazione.
-
Posizioniamoci con il browser Chrome sulla pagina del sito da attaccare (se quest’ultima è dinamica le richieste saranno ancora maggiori)
-
Avviamo lo script appena salvato e torniamo velocemente alla pagina web.
-
Pochi secondi dopo cominceremo a vedere che la pagina viene ricaricata in continuazione.
-
Per terminare lo script apriamo il task manager e chiudiamo il processo di AutoIT (sarà probabilmente quello con maggiore carico sulla CPU)
Remediation
L’hosting Intactweb integra al suo interno tutte le misure di sicurezza necessarie per prevenire questo tipo di attacco e molti altri.
Questo tipo di attacco può essere mitigato ed evitato implementando queste misure di sicurezza :
Implementazione di un sistema di Cache sul CMS
La Cache serve per salvare le pagine (articoli, pagine, inserizioni, ecc..) di un CMS come file statici. Queste pagine statiche vengono poi restituite agli utenti mentre navigano sul nostro sito web riducendo il carico del server. Le pagine statiche generate dalla cache forniscono inoltre un esperienza utente migliore poiché caricano e vengono renderizzate molto velocemente da tutti i browser, consentendo una navigazione migliore dell’utente all’interno del nostro sito web.
La cache migliora inoltre il rank del nostro sito sui motori di ricerca; questo ovviamente dipende anche da altre metriche di SEO, ma fra
i fattori che Google tiene in considerazione, la velocità è fondamentale.
Per implementarla se utilizzate WordPress consigliamo il plugin W3 Total Cache
Implementazione CDN e applicazione Rate Limiting
Senza CDN, tutti i visitatori del nostro sito web dovrebbero richiedere tutte le pagine ad una sola origine, il nostro server. Ovunque essi si trovino, per accedere al sito faranno richieste sempre nello posto. La CDN (Content Delivery Network) serve a creare versioni multiple distribuite a livello globale del nostro sito internet. A questo punto i visitatori possono ottenere i contenuti direttamente dal server a loro più vicino, senza richiederli al nostro server, riducendo i tempi di caricamento e velocizzando le perfomance generali del sito internet.
Tramite la CDN, come contromisura all’attacco HTTP Flood, è possibile applicare il rate limiting per IP, che blocca le richieste provenienti da un determinato indirizzo IP se superano una certa soglia.
Come CDN consigliamo Cloudflare, che offre un piano gratuito per iniziare.
Tuning delle configurazioni sul Web Server
Sul Server web che ospita il nostro sito web è importante configurare in maniera ottimale tutti i componenti che lo fanno funzionare.
In particolare, per prevenire gli attacchi HTTP Flood è necessario applicare le seguenti misure di sicurezza a seconda dei componenti utilizzati:
NGINX
Oltre il rate limiting implementato sulla CDN, è possibile implementare un limite sulla frequenza delle richieste e sul numero delle connessioni verso il nostro sito web provenienti da un singolo IP configurando opportunamente il file nginx.conf (/etc/nginx/nginx.conf). Consulta la documentazione ufficiale per avere più informazioni.
NGINX
Oltre il rate limiting implementato sulla CDN, è possibile implementare un limite sulla frequenza delle richieste e sul numero delle connessioni verso il nostro sito web provenienti da un singolo IP configurando opportunamente il file nginx.conf (/etc/nginx/nginx.conf). Consulta la documentazione ufficiale per avere più informazioni.
PHP
Per aumentare le performance di PHP è possibile abilitare un meccanismo di cache chiamato OPCache, che immagazzina il codice in memoria durante la prima esecuzione, in modo che sia riutilizzato in seguito, senza caricare ulteriormente le risorse Hardware.
Inoltre per una configurazione ottimale di PHP è necessario settare i parametri limite per una corretta ed efficiente gestione degli script php, questi parametri variano a seconda del tipo di applicazione implementata sul nostro web server (Piattaforme Cloud, Siti Internet piuttosto che altre applicazioni self-hosted)
PHP
Per aumentare le performance di PHP è possibile abilitare un meccanismo di cache chiamato OPCache, che immagazzina il codice in memoria durante la prima esecuzione, in modo che sia riutilizzato in seguito, senza caricare ulteriormente le risorse Hardware.
Inoltre per una configurazione ottimale di PHP è necessario settare i parametri limite per una corretta ed efficiente gestione degli script php, questi parametri variano a seconda del tipo di applicazione implementata sul nostro web server (Piattaforme Cloud, Siti Internet piuttosto che altre applicazioni self-hosted)