Cat


Reconnaissance

Realizaremos un reconocimiento con nmap para ver los puertos que están expuestos en la máquina Cat. Este resultado lo almacenaremos en un archivo llamado allPorts.

A través de la herramienta de extractPorts, la utilizaremos para extraer los puertos del archivo que nos generó el primer escaneo a través de Nmap. Esta herramienta nos copiará en la clipboard los puertos encontrados.

Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN y oX para posteriormente trabajar con ellos. En el resultado, comprobamos que se encuentran abierta una página web de Apache y el servicio de SSH.

Transformaremos el archivo generado targetedXML para transformar el XML en un archivo HTML para posteriormente montar un servidor web y visualizarlo.

Accederemos a http://localhost y verificaremos el resultado en un formato más cómodo para su análisis.

Añadiremos la siguiente entrada en nuestro archivo /etc/hosts.

Web Enumeration

Accederemos a http://cat.htb y verificaremos el contenido del sitio web. Entre la información que podemos recopilar comprobamos diferentes páginas dentro del menú principal del sitio web.

Al acceder a la sección de vote.php verificamos que se trata de una página web en PHP de un concurso de gatos, en el cual nos permitían votar. En este caso, se nos indica que el proceso de votación se encuentra actualmente cerrado, por lo cual no podríamos interactuar con estas opciones.

Al acceder a la página de winners.php, verificamos una página web en donde muestran quién ha sido el ganador del concurso. No logramos obtener más información en esta sección.

Verificamos también una página de join.php en la cual nos permite registrarnos como usuarios.

Trataremos de registrarnos con un usuario de prueba para verificar si al acceder, nos proporcionan más acceso a otras secciones o si podemos realizar alguna acción con este usuario.

Verificamos que nos aparece que el registro se ha realizado correctamente. El siguiente paso será iniciar sesión con el usuario recién creado para verificar si tenemos acceso.

Comprobamos que disponemos de acceso a una página llamada contest.php en la cual podemos enviar un formulario con datos para el concurso. Interceptaremos esta solicitud con datos aleatorios y una imagen válida para verificar cómo se envía la solicitud.

Attempting to upload a malicious PHP file

Al enviar la solicitud anterior a través de BurpSuite, verificamos que se envía correctamente el formulario. En la respuesta por parte del servidor, nos muestra un mensaje indicando Cat has ben successfully sent for inspection. Lo cual nos sugiere que alguien por detrás quizás esté inspeccionando estos datos.

Probaremos de modificar la extensión del archivo que enviamos a PHP que es el lenguaje que utiliza la página web, al enviar el formulario, se nos indica que solamente está permitido archivos con extensión JPG, JPEG y PNG.

También probamos de inyectar código JavaScript, en este caso, la aplicación por detrás, sanitiza y bloquea estos caracteres y nos muestra en la respuesta por parte del servidor de que los caracteres introducidos son inválidos.

Downloading Git Folder disclosure (GitHack)

Realizaremos una enumeración de directorios y páginas web a través de dirsearch. En el resultado obtenido, verificamos la existencia de un directorio /.git/.

A través de la herramienta de GitHack, nos descargaremos el repositorio de Git en nuestro equipo.

Verificaremos la estructura de la carpeta que se nos ha descargado. Comprobamos la existencia de diversos archivos PHP que parecen ser relacionados con las páginas existentes en la página web.

Encontramos el archivo contest.php, encargado de procesar las inscripciones al concurso de gatos. Permite a usuarios autenticados enviar nombre, edad, fecha de nacimiento, peso y una imagen, almacenando los datos en la base de datos y guardando la imagen en uploads/.

Intentamos bypassear la restricción de subida de archivos, logrando finalmente subir un archivo PHP malicioso. Sin embargo, no pudimos ejecutar el código porque el archivo se renombraba con uniqid(), lo que impedía determinar su ruta exacta dentro de uploads/.

Encontramos el archivo admin.php, el cual parece ser un panel de administración para gestionar las inscripciones de gatos. Solo permite el acceso al usuario axel, redirigiendo a join.php si no se cumple esta condición.

Este script recupera todos los registros de la tabla cats y los almacena en la variable $cats para su posterior visualización.

Posibles vulnerabilidades

  1. Falta de roles o privilegios adecuados

    • Restringe el acceso solo por el nombre de usuario, sin comprobar permisos reales.

    • Si logramos secuestrar la sesión (session hijacking), podríamos acceder sin necesidad de credenciales válidas.

  2. Exposición de datos

    • Si este archivo no tiene controles adicionales en su frontend, podría filtrar información sensible sobre los gatos registrados y sus dueños.

En este caso, sería interesante revisar si podemos secuestrar la sesión de axel o encontrar otro punto de entrada para acceder al contenido de admin.php.

Encontramos el archivo config.php, que maneja la conexión a la base de datos SQLite usando el archivo /databases/cat.db. Este script utiliza PDO para gestionar la conexión y está configurado para lanzar excepciones en caso de error. Es incluido en otros archivos para permitir el acceso a la base de datos.

En nuestra revisión del sistema, encontramos el archivo join.php, que gestiona el proceso de registro e inicio de sesión de los usuarios. Al analizarlo, identificamos varias vulnerabilidades críticas que podrían comprometer la seguridad de la aplicación.

Vulnerabilidades encontradas:

  1. Falta de validación de entradas (XSS)

  • En este archivo, las entradas de usuario como username, email, y password no son validadas ni saneadas adecuadamente. Esto permite que un atacante inyecte scripts maliciosos en estos campos, lo que podría dar lugar a un ataque XSS (Cross-Site Scripting). Si un atacante puede manipular los valores de estos campos, podría robar información sensible de otros usuarios o ejecutar código malicioso en su navegador.

  1. Exposición de credenciales a través de URL (GET)

  • Los datos sensibles como username, email, y password se envían a través de la URL usando el método GET. Esto es muy riesgoso, ya que los parámetros enviados por GET quedan registrados en los logs del servidor, en el historial del navegador y en la caché. Un atacante podría acceder a estos datos si tienen acceso a alguno de estos registros, exponiendo las credenciales de los usuarios.

  1. Cifrado débil de contraseñas (md5)

  • El archivo utiliza md5() para cifrar las contraseñas antes de almacenarlas. Este algoritmo es obsoleto y vulnerable a ataques de colisión y de fuerza bruta. Un atacante podría descifrar fácilmente las contraseñas almacenadas en la base de datos.

Initial Foothold

Hasta ahora, hemos recopilado información clave sobre el sistema. Hemos observado que al registrarse, no se realiza una correcta sanitización de los datos de entrada, lo que podría derivar en ataques de XSS (Cross-Site Scripting). Esto abre la puerta a posibles ataques como el robo de cookies o la ejecución de código malicioso en el navegador de otro usuario.

Además, al enviar el formulario, se presenta un mensaje que nos hace sospechar que alguien podría estar revisando las entradas del formulario. Esto, sumado a la información obtenida de los archivos de configuración, revela que existe una sección accesible únicamente para el usuario axel. Esto nos da una pista valiosa sobre el flujo de la aplicación y el manejo de usuarios.

Con esta información en mente, el siguiente paso será intentar determinar si la opción HttpOnly está configurada como false en las cookies. Si este es el caso, podríamos intentar realizar un cookie hijacking de la cookie del usuario axel, ya que parece ser la persona que revisa el formulario. De ser así, podríamos capturar su sesión y obtener acceso a su cuenta.

Nuestro objetivo será inyectar código JavaScript malicioso en el campo username del formulario. De este modo, cuando un usuario, posiblemente axel, vea nuestro formulario, el código inyectado se ejecutará en su navegador. Si la cookie no está marcada como HttpOnly, podremos interceptarla y enviarla a un servidor externo, permitiéndonos robar la sesión del usuario.

Este sería el siguiente paso en nuestra explotación del sistema.

Verificaremos si el atributo de HttpOnly se encuentra en False. Comprobamos que el sitio web dispone de esta mala configuración, lo cual la hace susceptible al Cookie Hijacking (robo de cookies de sesión).

El siguiente objetivo será inyectar un payload malicioso en JavaScriptpara robar la cookie de sesión del usuario. Nos registraremos con el siguiente script que enviará la cookie a nuestro servidor web de atacante que abriremos más adelante.

Comprobamos que se ha registrado correctamente el usuario, no hemos tenido problemas debido a la configuración de la página web que no sanitizaba correctamente estos campos, accederemos con el usuario recién creado.

Por un lado, no levantaremos un servidor web en nuestro equipo por el puerto 80.

Enviaremos nuevamente un formulario con datos aleatorios.

Se enviará correctamente el formulario, el siguiente paso será verificar en nuestro servidor web si logramos obtener la cookie de sesión del usuario que esté revisando nuestro formulario (en caso de que lo hubiera).

Al esperar un tiempo, verificamos que al parecer sí había un usuario revisando nuestro formulario. Esto fue posible debido que en el username inyectamos el payload XSS para el Cookie Hijacking porque no estaba sanitizando correctamente y el sitio web tenia el HttpOnly en False.

Modificamos nuestra cookie de sesión actual y la cambiaremos por la recién robada.

Executing SQL Injection Blind

Obtenemos una nueva pestaña admin.php en la cual nos aparecen los formularios que han sido enviados. Nos ofrecen 3 opciones, visualizar el formulario, aceptarlo y rechazarlo.

Si bien recordamos, esta página de admin.php la habíamos enumerado anteriormente en el /.git/que encontramos. Esta página solamente tenía acceso el usuario axel, lo cual nos confirma que dado que disponemos del acceso a esta página, la cookie de sesión pertenece a dicho usuario.

En los archivos que encontramos dentro de /.git/, nos encontramos con el archivo "view_cat.php", que parece ser la opción para visualizar un formulario con la información de un gato registrado.

Este archivo está configurado de tal manera que solo el usuario axel puede acceder a él. Una vez autenticado, el script obtiene el parámetro cat_id desde la URL y lo usa en una consulta SQL para recuperar los datos del gato y su dueño desde la base de datos.

En los archivos que encontramos dentro de /.git/, hallamos el archivo "accept_cat.php", que parece ser el encargado de aceptar gatos en el sistema.

Este archivo está configurado de tal manera que solo el usuario axel puede acceder a él. Si se envía una solicitud POST con un catId y un catName, el script inserta el nombre del gato en la tabla accepted_cats y luego elimina el registro correspondiente de la tabla cats.

Posibles vulnerabilidades encontradas

  • Inyección SQL (SQLi): La consulta INSERT INTO accepted_cats (name) VALUES ('$cat_name') no usa sentencias preparadas, lo que permite inyectar SQL a través del catName. Esto podría llevar a la ejecución de comandos arbitrarios en la base de datos.

  • Falta de validación y sanitización: No hay ningún control sobre los valores recibidos en catId y catName, lo que podría permitir XSS almacenado si los datos son reflejados en otra parte del sistema.

En los archivos que recuperamos de /.git/, encontramos "delete_cat.php", un script encargado de eliminar registros de gatos del sistema.

Funcionamiento del archivo

  • Solo el usuario axel puede acceder a esta funcionalidad.

  • Si se recibe una solicitud POST con un catId, se busca la foto asociada en la base de datos.

  • Si el registro existe, se elimina tanto de la base de datos como del sistema de archivos mediante unlink().

Posibles vulnerabilidades

  • Falta de validación en catId: Aunque el parámetro es tratado como un número entero (PDO::PARAM_INT), no hay validaciones adicionales para evitar el envío de datos manipulados.

  • Posible Insecure Direct Object References (IDOR): Si conseguimos acceso a una cuenta con permisos suficientes, podríamos eliminar gatos sin restricciones.

  • Falta de control en unlink(): Si photo_path contiene una ruta manipulada, podría eliminar archivos fuera del directorio esperado (Path Traversal).

Por lo tanto, teniendo en cuenta la configuración de las opciones de la página web, el siguiente objetivo será intentar realizar inyecciones SQLi para obtener los datos de la BBDD.

Para ello, intereceptaremos con BurpSuite la solicitud al darle a la opción de Accept que en un principio según revisamos en el código parecía vulnerable a inyecciones SQL.

Haremos click derecho y nos copiaremos la solicitud en un archivo.

Verificaremos que disponemos de un archivo llamado request el cual contiene la petición interceptada con BurpSuite.

Después de un breve tiempo, hicimos diversas pruebas de inyecciones SQL con SQLMap. Finalmente el último comando utilizado fue el siguinte. Utilizamos esta herramienta dado que las inyecciones eran SQLI Blind y deberíamos hacer fuerza bruta carácter por carácter para averiguar los resultados de la base de datos.

En este caso, la herramienta lo realiza por nosotros, en el resultado obtenido, comprobamos diversos nombres de tablas de la base de datos.

En la siguiente consulta, enumeraremos las columnas presentes de la tabla users que parece ser la que nos podría dar más información sobre usuarios, credenciales etc. Con el resultado obtenido, verificamos la existencia de las columnas username y password.

El siguiente paso, será obtener los datos de las columnas mencionadas, para ello haremos uso de la siguiente consulta con SQLMap. En el resultado obtenido, comprobamos que logramos obtener diversos hashes de diferentes usuarios.

Cracking hashes

Después de un tiempo intentando crackear estos hashes obtenidos, verificamos que logramos obtener la contraseña en texto plano del hash del usuario rosa.

Access via SSH with newly cracked password

Trataremos de acceder al SSHcon este usuario para verificar si podemos acceder al equipo. Comprobamos que hemos podido acceder al equipo sin problemas.

Initial Access

Abusing adm group to see disclosure of sensitive data in logs

Verificando los grupos a los que forma parte la usuaria rosa, verificamos que forma parte del grupo adm.

El grupo adm se utiliza para tareas de monitoreo del sistema. Los miembros de este grupo pueden leer muchos archivos de registro en /var/log y pueden usar xconsole. Históricamente, /var/log solía ser /usr/adm (y más tarde /var/adm), de ahí el nombre del grupo.

Ingresaremos al directorio /var/log y buscaremos aquellos directorios y archivos los cuales formando parte del grupo adm dispongamos acceso para leer los logs.

Accederemos al primer directorio, /var/log/apache2 y comprobaremos que dispone de diversos de acceso y errores.

Al revisar el contenido del archivo access.log filtrando a través de regex(expresiones regulares) por palabras clave como username,password, etc. Verificamos que aparece lo que parece ser las credenciales en texto plano del usuario axel.

Intentaremos pivotar al usuario axel, comprobamos que las credenciales son válidas y hemos obtenido acceso con ese usuario y logramos visualizar la flag de user.txt.

Privilege Escalation

Revisaremos los grupos a los que forma parte el usuario axel, verificamos que no forma parte de un grupo que podamos aprovecharnos para escalar nuestros privilegios. Revisando si disponemos de algún permiso de sudoers comprobamos que no disponemos de ningún privilegio.

Revisando los usuarios del sistema que disponen de bash, comprobamos la existencia de más usuarios entre los cuales aparece uno mencionado como git.

Checking internal ports

Revisando los puertos internos del equipo, comprobamos algunos puertos abiertos que en el escaneo inicial conNmap no pudimos verificar dado que no están expuestos. Entre los puertos encontrados, nos encontramos con el puerto 25 (SMTP) y algún otro que puerto más.

Realizaremos un telnet al SMTP para verificar el acceso y ferificamos que podemos enviar correos correctamente, por lo tanto, comprobamos que el servicio se encuentre funcionando correctamente.

Al revisar los demás puertos, verificamos la existencia del puerto 3000 abierto internamente. Revisando información por Internet, nos encontramos que este puerto es utilizado por Gitea. Al realizar un cURL al puerto 3000 interno del equipo, verificamos que nos devuelve un resultado en el cual mencionan a Gitea.

Gitea permite la creación y gestión de repositorios basados ​​en Git . También hace que la revisión de código sea increíblemente fácil y cómoda, mejorando la calidad del código para los usuarios y las empresas.

Email found with valuable information

Recordando que el servicio SMTP se encuentra expuesto y operativo, pensamos en que quizás habría algún tipo de información en el directorio de correos. Al acceder a /var/mail verificamos que existen diversos correos, entre los cuales el del usuario que disponemos actualmente (axel).

En /var/mail, encontramos un correo dirigido a axel que nos proporciona información clave para nuestra escalada de privilegios.

El primer mensaje menciona que están planeando lanzar nuevos servicios web relacionados con gatos, incluyendo un sitio de cuidado para gatos y otros proyectos. Se le pide a axel que envíe un correo a jobert@localhost con información sobre su repositorio en Gitea, ya que Jobert evaluará si es un proyecto prometedor para su desarrollo. Además, se destaca una nota importante donde se indica que es necesario incluir una descripción clara del proyecto, ya que el repositorio será revisado en su totalidad. Esto sugiere que cualquier archivo dentro del repositorio podría ser analizado, lo que podría darnos una pista sobre cómo interactúan internamente con Gitea o qué configuraciones están utilizando.

El segundo mensaje nos revela que están desarrollando un sistema de gestión de empleados, el cual está alojado en un Gitea privado en http://localhost:3000/administrator/Employee-management/. Además, se proporciona un enlace al README.md del proyecto (http://localhost:3000/administrator/Employee-management/raw/branch/main/README.md), donde podríamos encontrar detalles técnicos, instrucciones o incluso credenciales útiles.

Ahora que tenemos las credenciales de axel, podemos intentar acceder a Gitea, revisar los repositorios y buscar información sensible que nos ayude a escalar privilegios dentro del sistema.

SSH Port Forwarding

Para verificar estos puertos internos, realizaremos SSH Port Forwarding para compartirnos el puerto del SMTP y del Gitea.

Verificaremos que realizando un escaneo de los puertos abiertos de nuestro equipo, verificamos que se ha realizado correctamente el Port Forwarding.

Accesing on Gitea with axel credentials

Accederemos a http://localhost:3000 y comprobaremos que efectivamente se trata del servicio de Gitea.

Probaremos de acceder con las credenciales de axel en el Gitea.

Al acceder al Gitea, verificamos que en Explore < Users, aparecen los usuarios de rosa, axel y administrator.

Accediendo al repositorio de rosa no encontramos ningún repositorio ni información relevante.

Accediendo al repositorio de administrator tampoco logramos encontrar nada relevante.

Tataremos de acceder a http://localhost:3000/administrator/Employee-management/raw/branch/main/README.md que era el archivo que se nos indidcaba en el correo. Al tratar de acceder, verificamos que se nos indica que la página no existe o que pno disponemos del acceso necesario.

Al tratar de acceder al repositorio raíz que encontramos (http://localhost:3000/administrator/Employee-management/), verificamos que tampoco disponemos del acceso correspondiente o que no existe la página web.

Gitea Exploitation - Cross-Site Scripting [XSS] (CVE-2024-6886)

Verificaremos que hemos podido acceder correctamente con las credenciales del usuario axel. Por otro lado, comprobamos la versión del Gitea que se trata de la 1.22.0, con lo cual podremos intentar mirar si existen vulnerabilidades en esta versión.

Realizaremos una búsqueda sencilla con la herramienta de searchsploity verificaremos que existe una vulnerabilidade de XSS para esta versión de Gitea a través del siguiente CVE-2024-6886.

Gitea 1.22.0 tiene una vulnerabilidad de Stored XSS en la descripción de los repositorios, lo que permite inyectar un script malicioso que se ejecutará cuando otro usuario lo visualice.

Dado que en el correo enviado a Axel se menciona que Jobert revisará nuestro repositorio y que debe incluir una descripción, podemos aprovechar esta vulnerabilidad para inyectar un payload XSS. Si Jobert hace clic en la descripción, ejecutará nuestro código malicioso, lo que nos abre la posibilidad de explotar su sesión o realizar otros ataques basados en XSS, como el robo de cookies, ejecución de acciones en su nombre o redirección a sitios maliciosos.

Lo primero que se nos ocurrió es en intentar robar la cookie de sesión de Jobert para tratar de acceder al Gitea con sus credenciales y verificar si hay algún tipo de contenido sensible que pueda tener credenciales, etc.

Revisando la página web de Gitea, verificamos que HttpOnly se encontraba en False, por lo tanto, no podríamos realizar el ataque de Cookie Hijacking debido que JavaScript no puede acceder directamente a la cookie.

Dedido a esto, deberemos de buscar otras vías para realizar el ataque mediante XSS.

Data Exfiltration using XSS

Dado que HttpOnly está en true, no podemos robar la cookie de sesión de Jobert. Sin embargo, hemos identificado que Jobert podría tener acceso al archivo http://localhost:3000/administrator/Employee-management/raw/branch/main/README.md.

Si este archivo está restringido para otros usuarios pero Jobert sí tiene permisos para acceder, podemos aprovechar el XSS para realizar data exfiltration. La clave aquí es que cuando Jobert haga clic en nuestro payload malicioso, su navegador ejecutará la petición al archivo con sus propios permisos y nos enviará su contenido a nuestro servidor externo.

En otras palabras, aunque nosotros no podamos acceder directamente, si Jobert visualiza nuestra carga maliciosa, su navegador actuará como puente y nos filtrará la información sin que él lo note.

Explotación de la vulnerabilidad

El primer paso para realizar la explotación de esta vulnerabilidad de XSS Stored en Gitea es crear un nuevo repositorio.

Crearemos un nuevo repositorio, en este caso con nuestro nombre gzzcoo. Siguiendo el PoC de la vulnerabilidad, deberemos de inyectar nuestro payload dentro de la descripción.

En este caso, como queremos que se realice la exfiltración del archivo README.md para verificar si funciona, inyectamos el siguiente payload que reenviará los datos a nuestro servidor web externo.

El siguiente paso será crear un nuevo archivo en nuestro repositorio.

Crearemos un archivo con el mismo nombre del repositorio, este archivo deberá estar completamente vacío.

Una vez asignado el nombre del archivo, le daremos a la opción de Commit Changes.

Verificaremos que se nos ha creado un nuevo repositorio llamado gzzcoo con una descripción que si nos fijamos haciendo hovering realiza la explotación de XSS.

Por nuestra parte, nos montaremos un servidor web para recibir esta información.

Desde el equipo víctima, enviaremos un mail al usuario jobert@localhost indicándole el enlace al repositorio que contiene el payload malicioso.

Después de un breve tiempo, verificamos que hemos recibido lo que parece ser el archivo README.md. Esto nos confirma que el usuario jobert está ingresando a nuestro repositorio, de la confirmación de la explotación de la vulnerabilidad XSS y de que el usuario dispone de permisos para acceder al archivo que nosotros no disponíamos acceso.

Al tratar de descodificar el contenido recibido, verificamos que es un archivo que no contiene información relevante para escalar privilegios, simplemente se indica que solamente está autorizado el usuario admin.

Dado que estamos explorando la vulnerabilidad de XSS y exfiltración de datos, es importante considerar que el repositorio de Gitea de Employee Management podría contener más archivos que podrían ser útiles para nuestra explotación. Como están desarrollando un sistema de gestión de empleados (según el correo de Rosa), es probable que haya otros archivos en el repositorio de Gitea que contengan información sensible, como configuraciones, contraseñas o incluso detalles de la implementación del sistema.

En base a lo que vimos en el sitio de concurso de gatos en http://cat.htb, donde las páginas estaban hechas con PHP, se nos ocurrió que quizás en la ruta de Gitea de Administrator para Employee Management haya un archivo index.php. Si existe, este archivo podría ser un punto de entrada interesante para continuar con la explotación de la vulnerabilidad.

Si index.php está presente en el repositorio, podría estar configurado para servir páginas dinámicas, contener información de otros archivos, etc. Explotando el XSS, podemos dirigir el navegador de Jobert a una página específica del repositorio, como la de index.php, y desde ahí intentar inyectar código o exfiltrar datos adicionales.

Por lo tanto, el siguiente paso sería verificar si index.php existe en la ruta mencionada, ya que esto nos brindaría más oportunidades para profundizar en la explotación de la vulnerabilidad y obtener información adicional o incluso ejecutar código remoto.

Crearemos un nuevo repositorio que haga la exfiltración del archivo index.php hacía nuestro servidor de atacante.

Nuevamente volveremos a enviar un correo a jobert@localhost para que visualice nuestro repositorio que contiene el payload malicioso.

Verificamos en nuestro servidor web que recibimos nuevamente datos, en este caso, de la página index.php.

Al descodificar el contenido recibido, comprobamos que aparece el usuario admin con sus credenciales en texto plano.

Intentamos verificar si estas credenciales encontradas se reutilizaban para el usuario root y comprobamos que efectivamente ganamos acceso con dicho usuario. También logramos visualizar la flag de root.txt.

Última actualización

¿Te fue útil?