Tabby

Publicado: 21 de Mayo de 2025 Autor: Josรฉ Miguel Romero aKa x3m1Sec Dificultad: โญ Easy

๐Ÿ“ Descripciรณn

Tabby es una mรกquina Linux de dificultad fรกcil que requiere la explotaciรณn de un Local File Inclusion (LFI) para extraer credenciales de Tomcat. La escalada inicial se consigue mediante la subida de un archivo WAR malicioso aprovechando el rol manager-script. La escalada de privilegios se realiza aprovechando la pertenencia al grupo lxd. El reto implica tรฉcnicas de enumeraciรณn web, explotaciรณn de LFI, anรกlisis de archivos de configuraciรณn, crackeo de contraseรฑas y conocimiento sobre contenedores LXD para lograr acceso completo al sistema.

La ruta de explotaciรณn incluye:

  1. Descubrir un LFI en un sitio web

  2. Obtener credenciales de un archivo de configuraciรณn de Tomcat

  3. Desplegar un archivo WAR malicioso utilizando el API de Tomcat

  4. Crackear la contraseรฑa de un archivo ZIP para reutilizarla y obtener acceso de usuario

  5. Escalar privilegios aprovechando la pertenencia al grupo lxd

๐Ÿ”ญ Reconocimiento

Ping para verificaciรณn en base a TTL

๐Ÿ’ก Nota: El TTL cercano a 64 sugiere que probablemente sea una mรกquina Linux.

Escaneo de puertos

Enumeraciรณn de servicios


http://10.10.10.194/

Al enumerar sobre algunas de las secciones de este sitio web encontramos que al acceder a la secciรณn news se estรก aplicando vhosting:

โš ๏ธ Importante: Detectamos durante la fase de enumeraciรณn con nmap que se estรก realizando virtual hosting. Debemos aรฑadir el siguiente vhost a nuestro fichero /etc/hosts

๐ŸŒ Enumeraciรณn Web

80 HTTP

http://megahosting.htb/news.php?file=statement

Encontramos un mensaje de aviso en el que se indica que se ha producido una brecha de seguridad y el sitio ha sido modificado para eliminar la herramienta.

Llama la atenciรณn ese parรกmetro file. Verificamos si es vulnerable a LFI y lo confirmamos con el siguiente payload:

http://megahosting.htb/news.php?file=..//..//..//..//etc/passwd

Fuzzing de directorios

No encontramos nada relevante

8080 HTTP

http://supersecurehotel.htb:8080

Aquรญ vemos bastante informaciรณn que podrรญa combinarse con el LFI que hemos encontrado de cara a obtener un posible vector de ataque.

Accedemos al manager pero las credenciales por defecto no funcionan (habรญa que intentarlo) http://megahosting.htb:8080/manager/html

En la pรกgina anterior leemos que el archivo tomcat-users.xml se encuentra en: /etc/tomcat9/tomcat-users.xml.

Abusamos del LFI para leer este fichero aunque no nos devuelva nada:

http://megahosting.htb/news.php?file=..//..//..//..//etc/tomcat9/tomcat-users.xml

Despuรฉs de bucear un poco en google encontramos que el archivo tomcat-users.xml puede ubicarse tanto en

Usamos el LFI con esta ubicaciรณn y leemos el archivo correctamente obteniendo una contraseรฑa en texto claro:

Con estas credenciales, accedemos correctamente al host manager:

Problemas en manager

Tanto la aplicaciรณn web del administrador como las aplicaciones web del administrador del host tienen enlaces desde la pรกgina predeterminada de Tomcat.

NOTA: Por razones de seguridad, el uso de la aplicaciรณn web del administrador estรก restringido a usuarios con rol โ€œmanager-guiโ€. La aplicaciรณn web host-manager estรก restringida a usuarios con rol โ€œadmin-guiโ€. Los usuarios se definen en /etc/tomcat9/tomcat-users.xml.

El usuario tomcat tiene admin-gui, pero no manager-gui, lo que significa que no puedo acceder a la aplicaciรณn web del administrador:

Pero sรญ podemos acceder al host manager:

http://megahosting.htb:8080/host-manager/html

NO podemos hacer a priori gran cosa, revisando los roles que tiene este usuario, vemos que tambiรฉn tiene uno llamado manager-script:

Foothold

Este es un caso algo distinto al habitual porque nuestro usuario de tomcat solo tiene el manager-script role y no tiene el habitual manager-gui role, sin embargo, podemos usr esto para usar el tomcat /manager/text scripting API. Pero antes, debemos generar una reverse shell dentro un fichero .WAR, para ello podemos usar la herramienta msfvenom:

Podemos ver la lista de comandos aquรญ:

https://tomcat.apache.org/tomcat-9.0-doc/manager-howto.html#Supported_Manager_Commands

Ahora podemos usar el siguiente comando para subirlo. En el path podemos definir lo que queramos:

Parece que funcionรณ. A continuaciรณn iniciamos un listener usando ncy luego dispararlo con curl http://10.10.10.194:8080/test. Recupero una conexiรณn con un shell:

Mejora de la shell

Enumeramos el directorio de usuarios y vemos el directorio de un usuario llamado ash pero no tenemos permisos:

Tampoco funciona reutilizar con este usuario la contraseรฑa $3cureP4s5w0rd123!. Encontramos un archivo .zip en el directorio /var/www/html

Lo transferimos a nuestro host de ataque de la siguiente forma:

En nuestro host de ataque ejecutamos:

En el host comprometido ejecutamos:

Hacemos un md5sum en origen y en destino para verificar la integridad de la transferencia.

Al intentar descomprimirlo nos pide una contraseรฑa, de primeras probamos con la que ya tenรญamos pero nos indica que es incorrecta:

Usamos la herramienta zip2john para extraer un hash que podemos intentar crackear mediante un ataque con diccionario:

Usamos john the ripper y el diccionario rockyou para intentar crackear el el hash:

Obtenemos la contraseรฑa. Descomprimimos de nuevo el .zip usando la contraseรฑa obtenida admin@it

No encontramos nada interesante al descomprimir el archivo, sin embargo, sรญ que descubrimos que la contraseรฑa que hemos obtenido se estรก reutilizando por el usuario ash y obtenemos la primera flag:

๐Ÿ‘‘ Escalada de privilegios

Verificamos si hay algรบn usuario que pueda ejecutar algo como root:

Verificamos los grupos del usuario ash:

El grupo lxd es un grupo privilegiado.

Si intentamos ejecutar lxc, vemos que el binario no estรก aรฑadido al path y nos indica que debemos usar /snap/bin/lxc

Lo aรฑadimos al path

Para llevar a cabo la explotaciรณn y escalada de privilegios, descargamos en primer lugar la imagen de alpine en el host de ataque:

Iniciamos un servidor web con python:

En el host comprometido, descargamos el archivo:

Importamos la imagen

Nos da un error y tras buscar informaciรณn sobre รฉl comprobamos que se estรก ejecutando una instancia de lxc de snap (confinada) y no tiene acceso a lo que hay en el directorio /tmp

La soluciรณn es mover la imagen de alpine a una ruta donde snap tenga acceso y volver a ejecutar

Una vez hecho, si ahora listamos las imรกgenes:

Ahora ejecutamos lo siguiente:

NOTA: si nos da el error: Error: No storage pool found. Please create a new storage pool Ejecutar esto para crear un pool llamado default, usando dir como backend:

Ahora sรญ, de nuevo

Ahora nos movemos al path que habรญamos montado en el contenedor /mnt/root y finalmente al directorio /root y obtenemos la flag:

Last updated