Apuntes sobre HTTP Request Smuggling

Hace poco logré identificar y explotar una vulnerabilidad de tipo HTTP Request Smuggling en mi trabajo como pentester, y estos fueron los apuntes que me ayudaron a explotarla de forma manual:

Estos ataques también son conocidos como:

  • HTTP Hijacking (no confundir con robo de sesión)
  • HTTP Response Splitting (HRS)
  • HTTP Desync Attack

Lo que este ataque logra es “robar un request” o incluir un request adicional por mediante otro válido, desincronizando el HTTP pipelining, para obtener como resultado un “doble-response” en vez de un único response, o derivados como “doble-header” en un único response; utilizando generalmente para su explotación básica:

Referencia sobre conexiones persistentes HTTP y relación con el ataque

Guías básicas de explotación

Datos curiosos pero importantes

Una respuesta sensata al uso de HTTP/0.9
  • Se supone que en la versión HTTP/1.0 no se permiten las conexiones persistentes.
  • Se supone que para la versión HTTP/1.1, todos los requests son considerados como conexiones persistentes.
  • En la vida real, he visto la utilización del valor “keep-alive” para la cabecera “Connection” en ambas versiones de HTTP.
La versión HTTP/2 “es mucho más segura” que todas las anteriores

Tools para identificación y explotación de HTTP Request Smuggling

Después de explotar manualmente mi primer “HTTP Desync Attack”, me fui a buscar herramientas (que no he utilizado, por cierto), pero que me podrían ayudar en procesos basados en volúmen o algo más personalizado, basados en las versiones HTTP/1.0 y HTTP/1.1:

  • https://github.com/defparam/smuggler
  • https://github.com/epsylon/Smuggler
  • https://github.com/kowainik/smuggler
  • https://github.com/Lactea98/smuggler.py
  • https://github.com/gwen001/pentest-tools/blob/master/smuggler.py
  • https://github.com/PortSwigger/http-request-smuggler
  • https://github.com/search?q=smuggler o https://github.com/search?q=smuggling

Tool para ataques HTTP Response Splitting (HRS) basados en la versión HTTP/2 y la explotación de la cabecera Upgrade:

Para una posible PoC con HTTP/2

Una base interesante pero simple para implementar HTTP/2, entender cómo funciona, empezar a buscar ataques que se puedan realizar por medio de este protocolo, e implementarlo con Python:

  • https://stackoverflow.com/questions/38878880/serving-python-flask-rest-api-over-http2
  • https://medium.com/python-pandemonium/how-to-serve-http-2-using-python-5e5bbd1e7ff1
  • https://github.com/jdaroesti/flask-http2-push
  • https://hyper.readthedocs.io/en/latest/
  • Requisito: HTTP/2 necesita cabeceras de compresión HPACK, y soporte para ALPN del sistema operativo