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:
Descubrir un LFI en un sitio web
Obtener credenciales de un archivo de configuraciรณn de Tomcat
Desplegar un archivo WAR malicioso utilizando el API de Tomcat
Crackear la contraseรฑa de un archivo ZIP para reutilizarla y obtener acceso de usuario
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