
Strumento altamente configurabile per verificare la vulnerabilità di un server a CVE-2023-44487 inviando rapidamente frame HEADERS e RST_STREAM e documentando le risposte del server.
CVE-2023-44487 è un exploit contro il protocollo HTTP2 stesso. In HTTP2, le richieste di dati vengono avviate inviando un frame HEADERS. Dopo aver ricevuto questo frame, il server inizierà a elaborare la richiesta, inviano successivamente frame DATA fino a quando tutti i dati non saranno stati trasmessi. HTTP2 specifica anche un frame RST_STREAM, che può essere utilizzato per chiudere uno stream in qualsiasi momento. Per prevenire attacchi, i server di solito limitano il numero massimo di stream aperti contemporaneamente (a 100 di default). Se i client attendono effettivamente il consumo di tutte le risorse, questo limite viene raramente raggiunto. L'attacco funziona per una semplice ragione: un client può inviare un frame RST_STREAM in qualsiasi punto. Un frame RST_STREAM chiude uno stream, e gli stream chiusi non vengono contati come stream concorrenti. Ciò significa che un client può inviare richieste rapidamente, senza mai raggiungere questo limite, semplicemente chiudendo una connessione subito dopo aver inviato una richiesta. Il server attaccato, in alcuni casi, inizierà comunque a caricare i dati, creando un carico eccessivo.
Questo strumento mira a verificare la vulnerabilità di un server a questo attacco. Stabilisce una o più connessioni HTTP2 concorrenti e successivamente invia i numeri specificati di frame HEADER, seguiti da frame RST_STREAM.
Fornisce inoltre numerose altre opzioni di configurazione, come il ritardo tra i frame HEADERS e RST_STREAM, il numero di stream da aprire, il numero di frame da inviare per stream e così via. Al termine dell'attacco, stampa un riepilogo contenente informazioni sul numero di frame ricevuti, nonché sul numero di errori e frame GOAWAY ricevuti. Questo può aiutarti a identificare se i tuoi servizi sono vulnerabili a CVE-2023-44487.
Al momento, questo strumento è distribuito solo come codice sorgente, il che significa che è richiesta l'installazione tramite go install. Lo strumento può essere eseguito lanciando go run main.go <options>
È presente anche uno script python che può essere utilizzato per tracciare le informazioni sulla latenza scritte nel file monitor.log.
Inoltre, ho creato un nuovo tooling Python per misurazioni più accurate ed estese.
Il file runner.py situato nella cartella tooling leggerà i valori definiti nel tuo config.py (vedi config-sample.py per i dettagli) ed eseguirà tutti i test per tutti i container docker definiti.
Eseguirà quindi il test più efficace (mediana + latenza media più alte) per tutti i percorsi definiti nell'array paths. Produrrà grafici e file di log per ogni test eseguito.
Questo tooling è ancora in fase di sviluppo. L'ho creato solo perché ero troppo pigro per eseguire manualmente tutti questi test per il nostro articolo di ricerca.
Sentiti libero di inviare una PR per ripulirlo o per renderlo effettivamente utilizzabile per più del nostro caso d'uso.
Attualmente, sono implementate le seguenti opzioni CLI:
Lo strumento stamperà molte informazioni di debug, oltre a un riepilogo. Le informazioni di debug contengono dettagli sul modo in cui la connessione è stata stabilita, sull'avanzamento corrente e sul tipo di frame attualmente inviati.
Il riepilogo apparirà più o meno così (a seconda della configurazione)
####################SUMMARY####################
Packet types received:
PING: 2
HEADERS: 12
SETTINGS: 0
DATA: 11
GOAWAY: 3
RSTSTREAM: 0
WINDOWUPDATE: 0
UNKNOWN: 0
Attack ending reasons (per receiving thread):
GoAway events: 3
Timeout events: 0
Error events: 0
Summary for connection 2
PING: 1
HEADERS: 9
SETTINGS: 0
DATA: 6
GOAWAY: 1
RSTSTREAM: 0
WINDOWUPDATE: 0
UNKNOWN: 0
Reason for stopping to listen for more packets: GoAway - the server responded as expected.
Summary for connection 1
PING: 1
HEADERS: 3
SETTINGS: 0
DATA: 5
GOAWAY: 1
RSTSTREAM: 0
WINDOWUPDATE: 0
UNKNOWN: 0
Reason for stopping to listen for more packets: GoAway - the server responded as expected.
Summary for connection 0
PING: 0
HEADERS: 0
SETTINGS: 0
DATA: 0
GOAWAY: 1
RSTSTREAM: 0
WINDOWUPDATE: 0
UNKNOWN: 0
Reason for stopping to listen for more packets: GoAway - the server responded as expected.
Se pensi che ci siano altre statistiche da raccogliere, non esitare a contattarmi o ad aprire una issue!
Questo strumento è destinato SOLO a scopi di ricerca. Non è destinato a eseguire attacchi contro server che non possiedi o che non gestisci. Non mi assumo alcuna responsabilità per l'accuratezza delle statistiche fornite, né per gli attacchi e le loro conseguenze su server e servizi.
| Flag | Predefinito | Significato |
|---|
| frames | 1 | il numero di frame HEADERS e RST_STREAM da inviare su qualsiasi stream |
| connections | 1 | il numero di connessioni TLS su cui eseguire l'attacco (in concorrenza) |
| consecutiveSends | 1 | numero di frame HEADERS da inviare prima di inviare i frame RST_STREAM (per flusso) |
| connectAttempts | 1 | numero di connessioni consecutive su cui eseguire il test (per routine di connessione) |
| delay | 0 | il tempo (in ms) di attesa tra l'invio dei frame HEADERS e RST_STREAM |
| ignoreGoAway | false | se true, i flussi GOAWAY non causeranno la terminazione della routine di ricezione. Invece, attenderà fino a quando nessun frame sarà stato ricevuto per più di 10 secondi. |
| monitor | false | abilita il monitoraggio delle prestazioni |
| monitorDelay | 100 | il tempo (in ms) di attesa tra i test della latenza di risposta |
| monitorLog | ./monitor.log | il file in cui scrivere i log del ritardo del monitoraggio |
| routines | 1 | il numero di stream da attaccare |
| skipValidation | true | se true, il certificato del server non verrà validato (questo è il valore predefinito - non ci interessa la sicurezza dato che siamo comunque noi gli attaccanti) |
| timeout | 1000 | tempo di attesa per nuovi frame prima di considerare il tentativo di connessione non valido e fermarlo |
| url | https://localhost:433/ | l'url contro cui eseguire l'attacco |