EasyCTF - TryHackMe
Summary
Para resolver esta máquina, primero encontramos un servidor FTP
que contiene un directorio compartido, cuyo contenido era un archivo que nos comentaba sobre que se había establecido contraseñas débiles e iguales a algunos servicios levantados en la máquina. Luego, utilizando la herramienta wfuzz
y scripts de Nmap encontramos una aplicación CMS Made simple 2.2.8
alojada en el servidor HTTP
. Luego, llegamos a encontrar un exploit para la aplicación, que realizaba SQL injection
, y nos proporcionó las credenciales del administrador de la aplicación web. Además, utilizamos hashcat
como otra opción para crackear el hash MD5 con su salt, que nos daba el exploit
. Luego, nos autenticamos en el formulario de la aplicación web. Donde nos dimos cuenta de que presentaba la vulnerabilidad File Upload
, ya que nos permitió subir un archivo PHTML
que contenía un script PHP
que nos generaba una conexión reverse shell hacia nuestra máquina. Luego, llegamos a acceder a la máquina EasyCTF siendo el usuario www-data. Por lo tanto, decidimos escalar privilegio utilizando el archivo binario pkexec
, que tenía permiso SUID
. Mediante esta manera llegamos a ser el usuario root, y encontramos las dos banderas. Además, otra manera que encontramos para tener acceso a la máquina EasyCTF es aprovechando el servicio SSH
y el uso de la vulnerabilidad de utilizar las mismas credenciales. Donde llegamos a ser el usuario mitch. Por lo tanto, decidimos escalar privilegio aprovechando que podíamos ejecutar comandos teniendo los privilegios del usuario root mediante el archivo binario vim
.
Fase Reconocimiento
Para resolver esta maquina empezaremos utilizando el comando openvpn
con el fin de establecer una conexión VPN con la red virtual dónde está la máquina EasyCTF. Para ello utilizaremos el archivo de configuración, que lo podemos descargar en la plataforma de Tryhackme, que puede incluir información como la dirección del servidor VPN, los certificados y claves de seguridad, la configuración de encriptación, etc.
Luego de que se establece la conexión VPN se crea una interfaz virtual de red en nuestra máquina. Donde se enruta todo el tráfico de red a través de esa interfaz.
Además, la plataforma de Tryhackme nos muestra la dirección de la máquina EasyCTF.
Fase Escaneo y Enumeracion
Luego pasaremos a la fase de Escaneo y Enumeración con el fin de poder escanear los puertos del nodo. Además, obtendremos los servicios que se han levantado en los puertos abiertos, las versiones de los servicios, y el sistema operativo de la máquina EasyCTF.Para ello utilizaremos Nmap
.Donde le pasaremos los siguientes parametros:
- El parametro -sC o –script=”default” para utilizar todos los scripts de la categoría default con el fin de realizar un escaneo y detección de los puertos de manera avanzada.
- Los parametros -O y -sV con el fin de conocer el sistemas operativos del nodo y las versiones de los servicios levantados.
- El parametro -n para evitar la resolución DNS, y el parametro –min-rate para indicarle el número de paquetes por segundo que va utilizar Nmap para el escaneo con el fin de evitar sobrecargar la red con el tráfico generado por Nmap.
- El parametro -p- para realizar un escaneo de los 65535 puertos del nodo y el parametro –open con el fin de que nos muestre información solo de los puertos abiertos.
- El parametro -oN para guardar el resultado del escaneo en un archivo de texto plano
A partir del resultado del escaneo, podemos decir que la máquina EasyCTF tiene habilitado el servicio FTP en el puerto 21.Donde se tiene un programa servidor FTP llamado vsftpd, cuya versión es 3.0.3. Además, podemos observar que utilizando el script ftp-syst.nse de Nmap se logro autenticar exitosamente al servidor FTP con los usuarios ftp y Anonymous.
Ahora vamos a usar el comando ftp
para autenticarnos al servidor FTP con el usuario ftp con el fin de observar los archivos o directorios que está compartiendo el servidor FTP que tiene instalado la máquina EasyCTF.
Llegamos a autenticarnos exitosamente. Además, nos proveen una shell para interactuar con el servidor FTP.
Ahora utilizaremos el comando ls para listar los recursos que está compartiendo el servidor FTP.
Llegamos a encontrar el directorio compartido pub, cuyo contenido viene a ser 2 archivos.Además, podemos observar los permisos que tiene el propietario ftp y los usuarios que pertenecen al grupo ftp.
Ahora listamos el contenido del directorio pub.
Llegamos a encontrar un archivo llamado ForMitch.txt.
Ahora, descargamos este archivo con el comando get.Además, observaremos su contenido con el comando cat.
A partir del contenido del archivo ForMitch.txt, podemos concluir que el administrador del sistema tiende a establecer las mismas credenciales para todas las aplicaciones. Además, las credenciales establecidas por el administrador son débiles.
Además, a partir del nombre del archivo. Podemos suponer que el administrador del sistema se pueda llamar Mitch. Por lo tanto,Mitch puede ser un username. Esto lo vamos a verificar con los datos que vayamos recolectando en los siguientes pasos.
Además,a partir del resultado del escaneo, podemos decir que la máquina EasyCTF tiene habilitado el servicio HTTP
en el puerto 80.Donde se tiene un programa servidor HTTP llamado Apache, cuya versión es 2.4.18.
Ahora utilizaremos la herramienta wfuzz
que realiza fuerza bruta de directorios utilizando un lista de posibles nombre de directorios y archivos con el fin de encontrar directorios o archivos ocultos en el directorio raíz del servidor web. Además, utilizaremos la bandera –hc con el fin de filtrar los recursos que tenga un código de estado HTTP 403 y 404.
Llegamos a encontrar el recurso llamado simple en el directorio raíz del servidor web instalado en la máquina EasyCTF.
Además, utilizare el script http-enum.nse, que también realiza fuerza bruta de directorios con una lista de nombres posibles de directorios y archivos con el fin de encontrar archivos y directorios escondidos.
Llegamos a obtener el archivo robots.txt, que viene a ser utilizado por los desarrolladores de sitios o aplicaciones webs para prohbir que los motores de busqueda muestren ciertos recursos del sitio o aplicacion web en sus resultados de busqueda.
Ahora, accederemos al archivo robots.txt a través del navegador web.
No llegamos a obtener ninguna informacion relevante.
Ahora, accederemos al recurso simple a través del navegador web.
Donde llegamos a observar que el recurso obtenido anteriormente, viene a ser la página de inicio predeterminada del Sistema de Gestión de Contenido CMSMadesimple
, que permite crear y administrar aplicaciones web sin tener conocimientos avanzados en programación web.
Además,llegamos a obtener la versión del CMS que se tiene almacenada en el servidor web de la máquina EasyCTF.
Además,llegamos a encontrar la palabra here, que nos dirige a otro recurso.
Este recurso viene a ser un formulario en el cual debo ingresar las credenciales del administrador del CMS.
Fase Ganar Acceso o Explotacion
Ahora buscaremos un exploit para la versión 2.2.8 de CMS Made simple en la base de datos de Metasploit
a través del comando searchsploit.
Llegamos a encontrar un exploit, que viene a ser un script cuyo código fuente es python, y que se basa en SQL injection. Además, el exploit ha sido probado exitosamente en las versiones menores a 2.2.10 de CMS Made simple.
Ahora le daremos el parametro -m a searchsploit con el fin de que nos haga una copia del exploit en nuestro directorio actual.
Ahora utilizaremos el parametro -h en el script para observar qué parámetros se le tiene que pasar para que funcione correctamente.
Llegamos a notar que los parámetros que debemos pasarle al script vienen a ser:
- EL parametro -u que viene a ser el url donde está almacenada el CMS.
- EL parametro -w que viene a ser el wordlist con el fin de que pueda crackear el hash que vaya a encontrar el script
- El parametro -c para habilitar el crackeo del hash que encuentre.
Vemos que el script llegó a encontrar la salt, que se le agregó a la contraseña antes de que se aplicara un algoritmo o función hash.
- Además, encontró un username, que viene a ser igual a las suposiciones que habíamos hecho en pasos anteriores.
- Además, encontró el email asociado al usuario mitch.
- Además, encontró un hash.
- Por último, llegó a crackear el hash con su salt utilizando el wordlist rockyou.txt, que le pasamos.
De esta manera, el script llegó a encontrar la contraseña secret asociada al usuario mitch.
Otra manera de crackear el hash y el salt encontrado sería utilizando hashcat
, pero primero debemos saber que función o algoritmo hash está utilizando el hash encontrado. Para ello utilizare hash-identifier con el fin de encontrar los posibles algoritmos hash, que está utilizando el hash encontrado.
Llegamos a obtener una posible función hash MD5. Luego utilizamos el siguiente comando. Donde digitamos los siguientes parámetros:
- El archivo ejecutable de Hashcat
- EL parametro -a para especificar el tipo de ataque que se realizará durante el proceso del crackeo del hash.En nuestro caso toma el valor de 0 ya que se va realizar fuerza bruta.
- El parametro -m para especificar el tipo de algoritmo o función de hash que tiene el hash ingresado. En nuestro caso toma el valor de 20 ya que viene a ser MD5 con su salt.
- Luego digitamos el hash, que se va crackear, y su salt separados por un :.
- Luego digitamos el diccionario que se va utilizar para el crackeo del hash.En nuestro caso viene a ser el rockyou.
Observamos que mediante esta manera también llegamos a obtener la contraseña secret del usuario mitch. Ahora con estas credenciales vamos a logearnos en el formulario del CMS.
Logramos autenticarnos exitosamente. Además, observamos que hay una sección llamada File Manager que nos permite cargar archivos al servidor web. Teniendo en cuenta esto vamos a testear si la aplicación web CMS Made simple presenta la vulnerabilidad File Upload, es decir, si es que no realiza una correcta validación de los archivos que se suben al servidor web. Para ello intentaremos subir un archivo PHP cuyo código genera una conexión reverse shell hacia nuestra máquina mediante el puerto 1500.
Nos damos cuenta que al subir el archivo PHP no aparece el archivo en el directorio uploads. La primera hipótesis que podemos hacer es que la aplicación web está filtrando los archivos PHP.
Para verificar esta hipótesis, utilizamos BurpSuite
para capturar la solicitud POST HTML que hacemos al servidor web, para que cargue nuestro archivo PHP. Luego enviaremos la solicitud capturada a la ventana Repeater para poder observar la respuesta HTML que recibimos del servidor web.
Observando la respuesta HTTP del servidor, podemos concluir que el error está en el filename, que viene a ser el nombre de mi archivo. Ahora intentaremos cambiar la extensión, que aparece en el nombre de archivo, por un .PHTML, que viene a ser un archivo que contiene código HTML y PHP, pero en nuestro caso va contener el mismo código PHP que tenía el anterior archivo PHP.
Vemos que con este cambio en la extensión del archivo se nos permite cargar el archivo PHTML
.Por lo tanto, el servidor web filtra los archivos PHP que se suben a través de la aplicación web.
Teniendo en cuenta ello, vamos a subir un archivo PHTML con el mismo contenido del archivo PHP
, que intentamos subir inicialmente.
En esta ocasión, la aplicación web nos dejó subir el archivo phtml, y se encuentra en el directorio Uploads. Por lo tanto, la aplicación web si presenta la vulnerabilidad File Upload ya que no valida adecuadamente los archivos que cargan los usuarios al servidor a través de la aplicación CMS. Ahora daremos clic al archivo phtml para que se ejecute el código que tiene, pero antes habilitamos el puerto 1500 en nuestra máquina para que esté en escucha y esperando la conexión entrante. Para ello utilizamos la herramienta netcat.
Podemos observar que hemos ganado acceso a la máquina EasyCTF, siendo el usuario www-data.Además, el mensaje can’t access tty nos indica que al usuario www-data se le he configurado con una shell nologin, que viene a ser una shell no interactiva, cada vez que inicie sesión en el sistema. Esto lo podemos verificar accediendo al contenido del archivo /etc/passwd.
La desventaja de tener una shell no interactiva viene a ser que no vamos a poder ejecutar varios comandos que requieren de un tty.
Fase Escalada de privilegios
Ahora pasaremos a la fase de escalada de privilegios.Para ello buscaremos archivos binarios con permiso SUID
, que nos va permitir tener los privilegios del propietario, que venga a ser root, del archivo cuando lo ejecutamos.
Nos damos cuenta que el el archivo binario pkexec
tiene permiso SUID. Por lo tanto, a través de este archivo binario ejecutable puede ejecutar comandos teniendo el privilegios del usuario root.
Ahora para explotar este archivo binario vamos a utilizar un script, que utiliza el marco de autorización Polkit
(o PolicyKit) y lo podemos encontrar en el repositorio https://github.com/berdav/CVE-2021-4034
Polkit en sí viene a ser un componente utilizado para controlar los privilegios de todo el sistema en sistemas operativos similares a Unix.Además, proporciona una forma organizada para que los procesos no privilegiados se comuniquen con los privilegiados. Además, es posible usar Polkit para ejecutar comandos con privilegios elevados usando el comando pkexec seguido del comando que se pretende ejecutar (con permiso de root).
Ahora vamos a clonar el repositorio en mi maquina.
Luego vamos a levantar un servidor web en mi maquina.Ademas, lo voy a levantar en el directorio que contiene el directorio CVE-2021-4034 con el fin de poder descargar el directorio CVE-2021-4034 desde la shell nologin que tenemos en la máquina EasyCTF.
Ahora accedemos al directorio CVE-2021-4034.
Donde observamos un archivo llamado Makefile, que contiene un conjunto de instrucciones. Para ejecutar las instrucciones de este archivo utilizó el comando make.
Luego observamos que se me genera un archivo ejecutable CVE-2021-4034, que viene a ser el script que usaremos para explotar el archivo binario pkexec.
Luego ejecutamos el script.
De esta manera llegamos a ser el usuario root. Ahora vamos a buscar las dos banderas que nos solicitan.
De esta manera llegamos a encontrar el contenido de las dos banderas. Otra manera que pudimos haber obtenido acceso a la máquina EasyCTF es utilizando la suposición que hicimos anteriormente(Que es muy probable que el administrador del sistema utilice las mismas credenciales en todo los servicios). Para verificar esto intentaremos establecer una conexión remota con el servidor SSH que tiene la maquina EasyCTF utilizando las credenciales encontradas en la aplicación web CMS Made simple.
También llegamos obtener acceso a la máquina EasyCTF utilizando el servicio SSH
que está levantado en el puerto 2222 de la máquina.
Ahora, otra forma de escalar privilegios serían aprovechando que se tiene el archivo binario sudo.Además, al usuario mitch le han configurado con una shell interactiva(o bash) para cuando inicia sesión el sistema EasyCTF.
Ahora que ya hemos verificado que existe el archivo sudo
. Utilizaremos la bandera -l con el fin de listar los comandos que puede ejecutar el usuario actual con los privilegios del superusuario.
Del resultado del comando, podemos concluir que podemos utilizar el archivo binario vim con el fin de ejecutar comando teniendo los privilegios del superusuario. Ahora, utilizaremos el siguiente comando para que nos genere una shell sh siendo el usuario root.
Esto viene a ser otra forma de llegar a ser el usuario root.