XUT_ / COURSES / PENETRATION TESTER

HTTP Browser Desync Identification

Para un mejor entendimiento de la desincronización de navegador HTTP, usaremos una aplicación vulnerable a CVE-2022-29361. La app servirá una única ruta.

python
from flask import Flaskapp = Flask(__name__)
@app.route("/", methods=["GET", "POST"])
def index():
    return """ CVE-2022-29361
Welcome to the Vulnerable Web Application
"""
if __name__ == "__main__":
    app.run("0.0.0.0", 5000)

El servidor web impactado por este CVE está corriendo Werkzeug v2.1.0, una aplicación versátil WSGI de aplicaciones web. La actualización crucial en el commit 4795b9a7 permite mantener conexiones vivas cuando se configuran las opciones de thread o process.

HTTP Browser Desync Identification

Para ejecutar el ataque, un acercamiento directo es utilizar la función de JavaScript fetch. Esta función permite mantener el ID de conexión a través de peticiones. El ID de conexión se refiere al identificador único asignado a la conexión de red entre el cliente y el servidor. Este identificador ayuda a llevar un rastro de múltiples conexiones y distinguir entre ellas.

Este ID de conexión persistente recae en la habilidad de facilitar la explotación para un atacante que podría exponer información del usuario o tokens de sesión como cookies.

Además, en un ataque cross-site, el navegador comparte cookies de usuario basado en la flag SameSite, pero esta regla de seguridad no se aplica si el dominio actual coincide con el remoto, como en los ataques Browser Desync. En dichos casos, no hay restricción. Puedes hackear tu sesión usando el siguiente payload en la linea de comandos del navegador.

javascript
fetch('http://10.113.177.15:5000/', {    method: 'POST',    body: 'GET /redirect HTTP/1.1\r\nFoo: x',    mode: 'cors',})
  1. http://10.113.177.15:5000/: Esta es la URL a la que la petición HTTP es hecha para el servidor vulnerable. En este caso, es el endpoint de registro en el servidor local.
  2. { method: 'POST' }: El parámetro method especifica el método usado para la petición, aquí es POST.
  3. { body: 'GET /redirect HTTP/1.1\r\nFoo: x' }: En el body, hay una segunda petición que va a ser inyectada en la cola.
  4. { mode: 'cors' }: Esta flag dispara un error al visitar la página 404 y evita el seguimiento de la redirección.

Primero, arrancaremos la máquina virtual, el sitio vulnerable corre en el puerto 5000.

A continuación un ejemplo de ataque:

HTTP Browser Desync Identification

El ataque de desincronización involucra inyectar una petición arbitraria en la cola de peticiones HTTP. Al refrescar la página, redirige al endpoint /redirect, llevando a un error 404, ya que la ruta no está presente.

HTTP Browser Desync Identification