RootMe - TryHackMe
Summary
En este caso debemos encontrar dos banderas que están ubicadas en la maquina RootMe. Donde realizaremos un escaneo de puertos con Nmap y sus scripts. Llegando a encontrar un programa servidor HTTP levantado en el puerto 80. Además, se encontró una aplicación web alojada en el servidor web. Luego, utilizamos la herramienta wfuzz y scripts de Nmap para descubrir Content de la aplicación web utilizando fuerza bruta de directorios. Llegando a encontrar un directory list llamado uploads. Además, encontramos una pagina web que nos permite subir archivos al servidor web, que se almacenaran el directory list uploads. Luego, explotamos la vulnerabilidad File Upload presente en la aplicación web mediante la pagina web que encontramos. Llegando obtener acceso a la maquina RootMe. Luego, realizamos una escalada de privilegios para ser el usuario root aprovechando que el archivo binario python tiene el permiso SUID.
Fase Reconocimiento
Para resolver este ejercicio empezaremos utilizando el comando openvpn
con el fin de establecer una conexión VPN con la red virtual dónde está la máquina RootMe. 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 RootMe.
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 RootMe.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
Los resultados que obtuvimos del escaneo vienen a ser:
- Que programa servidor
HTTP
se está corriendo en la máquina RootMe.Además, la versión del programa servidor HTTP. - El sistema operativo de la máquina RootMe.
- Que programa servidor
SSH
se está corriendo en la máquina RootMe.Además, la versión del programa servidor SSH.
Ahora ingresamos a la página de inicio de la aplicación web a través de nuestro navegador web.
Ahora ejecutaremos los scripts de Nmap de la categoría vuln con el fin de conocer las vulnerabilidades de los servicios que están levantados en los puertos abiertos.
Podemos notar que utilizando el script http-enum.nse, que realiza un 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 algunos archivos escondidos, que están almacenados en el directorio raíz de la aplicación web.
Ahora accederemos al recurso css a través de mi navegador web para observar su contenido.
Podemos observar que viene a ser un directory list cuyo contenido no contiene ninguna información relevante.
Ahora accederemos al recurso js a través de mi navegador web para observar su contenido.
Podemos observar que viene a ser un directory list cuyo contenido no contiene ninguna información relevante.
Ahora accederemos al recurso uploads a través de mi navegador web para observar su contenido.
Podemos observar que viene a ser un directory list que no contiene ningún archivo o directorio, pero el nombre de este recurso nos da a sospechar que en este recurso se almacena los archivos que se pueden cargar desde alguna página web del sitio web.
Ahora utilizaremos la herramienta wfuzz
, que viene a ser una forma automatizada de descubrir CONTENT en un sitio o aplicación web mediante fuerza bruta de directorios utilizando una lista de posibles nombres de directorios y archivos. Además, utilizaremos el parametro –hc con el fin de filtrar los recursos que tenga un código de estado HTTP 403 y 404.
Con la ejecución de esta herramienta llegamos a obtener un nuevo recurso llamado panel, que tiene un código de estado HTTP 301, que nos indica que el recurso ha sido movido permanentemente a una nueva ubicación.
Ahora accederemos al recurso panel a través de mi navegador web para observar su contenido.
Obtenemos una página web que nos permite cargar archivos al servidor web.
Fase Ganar Acceso o Explotacion
Ahora verificaremos si la aplicación web presenta la vulnerabilidad File Upload
. Para ello intentaremos subir un archivo PHP
cuyo código genera una conexión reverse shell hacia nuestra máquina mediante el puerto 1500.
Al parecer la aplicación web está filtrando los archivos PHP.
Ahora intentaremos subir un archivo 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.
En esta ocasión, la aplicación web nos dejó subir el archivo phtml. Por lo tanto, la aplicación web si presenta la vulnerabilidad File Upload
ya que no filtra o valida adecuadamente los archivos que suben los usuarios.
Ahora accederemos al directory list uploads con el fin de saber si se cargó nuestro archivo phtml en esa ruta.
Llegamos a verificar que se ha subido nuestro archivo phtml en esta ruta.
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.Además, utilizamos el comando rlwrap para que la shell generada en nuestra máquina presenta funcionalidades como el autocompletado de comandos, historial de comandos, etc.
Ahora daremos clic para que se ejecute el código del archivo phtml, y nos genere la conexión reverse shell hacia nuestra máquina.
De esta manera llegamos obtener acceso a la máquina RootMe.
Ahora utilizaremos el comando find con el fin de encontrar la primera bandera, que está contenido en el archivo user.txt. Por lo tanto, buscaremos en el directorio /, archivos que tengan de nombre user.txt.
De esta manera encontramos la primera bandera. Luego con el comando cat observamos su contenido.
Fase Escalada de Privilegios
Lo más probable es que la segunda bandera esté en el directorio del usuario root. Por lo tanto, debemos buscar una forma de escalar privilegios.Para ello buscaremos archivos binarios ejecutables con permiso SUID
, que nos permite tener los permisos del propietario del archivo cuando lo ejecutamos.
Para la búsqueda de estos archivos utilizaremos el comando find para buscar los archivos desde el directorio /.
Nos damos cuenta que el el archivo binario /usr/bin/python
tiene permiso SUID. Aprovechando esto se puede escalar privilegios con el siguiente comando: /usr/bin/python -c 'import os; os.execl("/bin/sh", "sh", "-p")'
Donde primero utilizamos el argumento -c para ejecutar el código de Python, que proporcionaremos como una cadena de caracteres, directamente desde la interfaz de línea de comandos sin la necesidad de utilizar un script que contenga el código.
Además, este código python primero importa el módulo os, que proporciona funcionalidades relacionadas con el sistema operativo.Después, se utiliza el comando execl,del módulo os, para ejecutar un programa externo especificando su ruta y proporcionando una lista de argumentos para ese programa
En nuestro caso la ruta del programa externo que se ejecutará viene a ser el archivo binario ejecutable /bin/sh que nos proporcionará una shell sh. Además, le pasamos el argumento p para que nos proporciona la shell con privilegios de superusuario
De esta manera llegamos a ser el usuario root.
Después, nos dirigimos al directorio root. Donde listamos sus directorios y archivos. Además, llegamos a encontrar la segunda bandera que está contenida en el archivo root.txt.