
Herramienta altamente configurable para verificar la vulnerabilidad de un servidor contra CVE-2023-44487 mediante el envío rápido de tramas HEADERS y RST_STREAM y documentando las respuestas del servidor.
CVE-2023-44487 es un exploit contra el propio protocolo HTTP2. En HTTP2, las solicitudes de datos se inician enviando un frame HEADERS. Tras recibir este frame, un servidor comenzará a procesar tu solicitud, enviando posteriormente frames DATA hasta que todos los datos sean transmitidos. HTTP2 también especifica un frame RST_STREAM, que puede utilizarse para cerrar un stream en cualquier punto. Para prevenir ataques, los servidores suelen limitar la cantidad máxima de streams abiertos concurrentemente (a 100 por defecto). Si los clientes esperan realmente a que todos los recursos se consuman, este límite rara vez se alcanza. El ataque funciona por una razón simple: un cliente puede enviar un frame RST_STREAM en cualquier punto. Un frame RST_STREAM cierra un stream, y los streams cerrados no se cuentan como stream concurrente. Esto significa que un cliente puede enviar solicitudes rápidamente, sin alcanzar nunca este límite, simplemente cerrando una conexión inmediatamente después de enviar una solicitud. El servidor atacado, en algunos casos, aún comenzará a cargar los datos, generando una carga excesiva.
Esta herramienta tiene como objetivo comprobar la vulnerabilidad de un servidor a este ataque. Establece una o más conexiones HTTP2 concurrentes y posteriormente envía los números especificados de frames HEADER, seguidos de frames RST_STREAM.
También proporciona numerosas opciones de configuración adicionales, como el retardo entre frames HEADERS y RST_STREAM, el número de streams a abrir, la cantidad de frames a enviar por stream, etc.
Una vez completado el ataque, imprime un resumen que contiene información sobre el número de frames recibidos, así como el número de errores y frames GOAWAY recibidos. Esto puede ayudarte a identificar si tus servicios son vulnerables a CVE-2023-44487.
Por ahora, esta herramienta se distribuye únicamente como código fuente, lo que significa que se requiere una instalación de Go. La herramienta se puede ejecutar ejecutando . También hay un script de Python que se puede usar para graficar la información de latencia escrita en el archivo .
go run main.go <options>monitor.logAdemás, creé una nueva herramienta en Python para mediciones más precisas y extensas. El archivo runner.py ubicado en la carpeta tooling leerá los valores definidos en tu config.py (consulta config-sample.py para más detalles) y ejecutará todas las pruebas para todos los contenedores Docker definidos. Luego ejecutará la prueba más exitosa (mediana + media de latencia más altas) para todas las rutas definidas en el array paths. Generará gráficos y archivos de registro para cada prueba ejecutada. Esta herramienta aún está en desarrollo. Solo la creé porque me daba pereza ejecutar todas estas pruebas manualmente para nuestro artículo de investigación. No dudes en enviar un PR para limpiarlo o hacerlo realmente utilizable para algo más que nuestro caso de uso.
Actualmente, están implementadas las siguientes opciones de CLI:
| Banderas | Por defecto | Significado |
|---|---|---|
| frames | 1 | el número de frames HEADERS y RST_STREAM a enviar en cualquier stream |
| connections | 1 | el número de conexiones TLS en las que ejecutar el ataque (concurrentemente) |
| consecutiveSends | 1 | número de frames HEADERS a enviar antes de enviar frames RST_STREAM (por flujo) |
| connectAttempts | 1 | número de conexiones consecutivas para ejecutar la prueba (por rutina de conexión) |
| delay | 0 | el tiempo (en ms) a esperar entre enviar frames HEADERS y RST_STREAM |
| ignoreGoAway | false | si es true, los streams GOAWAY no provocarán que la rutina receptora termine. En su lugar, esperará hasta que no se haya recibido ningún frame durante más de 10 segundos. |
| monitor | false | habilitar monitoreo de rendimiento |
| monitorDelay | 100 | el tiempo (en ms) a esperar entre pruebas de latencia de respuesta |
| monitorLog | ./monitor.log | el archivo para escribir los registros de retardo del monitor |
| routines | 1 | el número de streams a atacar |
| skipValidation | true | si es true, el certificado del servidor no se validará (este es el valor predeterminado; no nos importa la seguridad ya que somos los atacantes de todos modos) |
| timeout | 1000 | tiempo de espera para nuevos frames antes de considerar el intento de conexión como inválido y detenerlo |
| url | https://localhost:433/ | la URL contra la que ejecutar el ataque |
La herramienta imprimirá mucha información de depuración, así como un resumen. La información de depuración contiene información sobre la forma en que se estableció la conexión y sobre el progreso actual y el tipo de frames que se están enviando actualmente.
El resumen se verá algo así (dependiendo de tu configuración)
####################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.
Si crees que hay otras estadísticas que deben recopilarse, no dudes en contactarme o crear un issue.
Esta herramienta está diseñada SOLO para fines de investigación. No está destinada a ejecutar ataques contra servidores que no sean de tu propiedad o que no administres. No me responsabilizo por la precisión de las estadísticas proporcionadas, ni por los ataques y sus consecuencias para servidores y servicios.