sábado, 27 de agosto de 2016

Completando CTF PwnLab (Walkthrough)



Bueno hace unos días aburrido me puse a bajar este CTF llamado PWNLAB desde la siguiente dirección: https://www.vulnhub.com/entry/pwnlab-init,158. Necesitaran VirtualBOX - OVA para correrlo, sin mas preámbulos, intentare detallar de manera reducida y directa como logre pasarlo. (Algunos tests los saltie para no escribir de mas ya que no me brindaron lo que necesitaba para avanzar y llegar al bendito flag).

~ Comenzando:
En mi caso la ip del servidor victima es 192.168.0.106. Veamos que puertos tiene abierto, utilizando nmap:


Bien como vemos tiene algunos puertos interesantes entre los que se destaca el HTTP y el MYSQL. Podriamos intentar desde el inicio tirarle un BruteForce heavy al login, pero por como venia la prueba quería intentar otras vías de acceso, suponía que tendría que darme algun conocimiento el avanzar a diferencia de algo tan sencillo como bruteforcear jeje.















Bastante sencilla la web, tiene solo tres links, el home, login y el upload. Como dije antes, realice varias pruebas, ninguna satisfactoria, hasta que me puse a mirar bien. Al momento de llamar algunos de esos links por ejemplo HOME, o LOGIN, el path luce de esta manera:


  • http://192.168.0.106/?page=login

Ese ?page=login me recuerda a como explotaba años atrás al famoso LFI / RFI. Con la ayuda de este site y debido a varias pruebas que no resultaron positivas, logre poder idear el método para avanzar. http://phpsecurity.readthedocs.io/en/latest/Injection-Attacks.html.

Se trata de pedir ayuda a los Wrappers o 'envoltorios, empaquetadores' en castellano. PHP acepta una serie de wrappers para distintos protocolos de tipo URL, estos permiten trabajar con funciones del sistema de archivos. Los Wrapper soportan varios filtros que pueden ser aplicados a un determinado recurso que le pasemos, en este caso como dice el site ese, podríamos probar con la función 'convert.base64-encode' y ver que pasa, la estructura quedaría asi y se la paso via BurpSuite en mi caso je. 

  • http://192.168.0.106/?page=php://filter/read=convert.base64-encode/resource=login





















Bien, la respuesta es rápida y con buenos resultados. Si usamos un poco la lógica, la función convert.base64-encode, nos dice que el resultado lo codificara en base64.
Si este resultado lo pasamos al decoder, nos da lo siguiente:


Esta mostrándonos codificado el código fuente de "login.php". Tambien vemos que existe el archivo de configuración llamado "config.php", veamos que contiene:




























Volvemos a tener los mismos resultados, el resultado codificado en base64 y al decodificarlo, surprise!, el acceso al server mysql. "La contraseña fue censurada, no es la verdadera, solo por jodido y para que no sean tan vagos jeje".

Una rápida conexión desde el cliente mysql en la terminal nos confirma el acceso:

















Navegamos por la DB hasta llegar a lo que nos interesa...

  • $ mysql> show databases;
  • $ mysql> use Users;
  • $ mysql> show tables;
  • mysql> select * from users;
Y el resultado:


Nice, los resultados están en base64, seguimos.. opto por loguearme como KENT jeje.
Una vez logueados, estamos listos para poder subir archivos.. pero antes podriamos ver el codigo fuente de "upload.php" verdad?. Una vez mas el wrapper nos ayudara:















Obtenemos respuesta codificada y al pasarlo por el decoder, obtenemos el codigo fuente, lo que resalto a continuacion es interesante, ya que de ello depende como se nos limitara nuestro archivo que subamos via el Upload.php:























Como vemos, se subirá a la carpeta upload/. Y las extensiones están limitadas a jpg, jpeg, gif y png. Bueno, necesitamos buscar la manera, de intentar subir algún archivo 'malicioso', que nos permita tomar control del sistema, y luego de alguna manera poder invocarlo para darnos ese bendito acceso. 

Por mi parte lo que intente hacer fue buscar una shell de conexion inversa, la cual guarde como w0t.gif recordemos que solo 4 extensiones eran posibles y permitiría subir. Tambien pueden crear la shell inversa con metasploit, a libre criterio.

Vamos a Upload y probemos subir la imagen:














"Error 002", wtffffff??.. jeje.

Por lo visto, logra darse cuenta que no es un archivo GIF razo.. podemos bypassear de la siguiente manera, ingresando el encabezado GIF justo antes del comienzo de el codigo PHP de la shell:



















Le damos a upload nuevamente y ahora si logramos bypassearlo, en mi caso se encuentra el archivo en el siguiente path:

  • http://192.168.0.106/upload/acb881cb3656e6bdc56c987e0f051593.gif
Seguimos.. ahora tenemos que buscar el modo en que el codigo php, el de nuestra shell, se ejecute.. ya investigamos login.php, upload.php y config.php.. nos resta lo fundamental, index.php jej.


  • GET /?page=php://filter/read=convert.base64-encode/resource=index
Nos arroja el resultado codificado en base64, decodificamos y obtenemos algo interesante: 





















Vemos que el parametro "lang" esta seteado como una Cookie. Investiguemos un poco mas:













Bingo!, mediante la Cookie podemos realizar un LFI (Local File Inclusion). Por ende si podemos ver el /etc/passwd, tambien podríamos ejecutar nuestra shell de conexión inversa verdad?. Vamos a intentarlo, primero dejamos un netcat escuchando localmente en el puerto 4444, que este fue el puerto que personalice la shell para que se conecte.


























Como vemos en la parte de abajo en BurpSuit explotamos el LFI y en la parte de arriba en la terminal vemos como el netcat que estaba a la escucha recibe una conexion entrante... jeje.






















Vemos que no tenemos permisos para ingresar a la carpeta de Kane, somos www-data y el comando su kane para cambiar de usuario no funciona. Por lo tanto tenemos que acomodar la shell correctamente, importando bash con un script python.

  • $> python -c 'import pty; pty.spawn("/bin/bash")'

Ahora si tenemos bash y procedemos a loguear con el usuario Kane, utilizamos la password mysql de antes para loguear.


Vemos que no tenemos mucho en la carpeta /home a excepción de un archivo llamado msgmike, el cual tiene un interesante detalle y es que tiene el bit SUID activado bajo el usuario MIKE.

Corremos msgmike:

  • $> ./msgmike

Y nos devuelve el siguiente mensaje de error:

  • cat: /home/mike/msg.txt: No such file or directory

Nos damos cuenta que ejecuta 'cat' pero al parecer no con un path absoluto. Entonces pensamos que podríamos manipularlo y lograr escalar privilegios.
(Referencia a tener en cuenta: http://www.fatetek.net/lessons/lesson10.shtml)

Vemos que tenemos en PATH:


  1. kane@pwnlab:~$ echo $PATH
  2. echo $PATH
  3. /usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games

Bien, lo que hago es exportar en PATH lo siguiente:


  1. kane@pwnlab:~$ export PATH=.
  2. export PATH=.
  3. kane@pwnlab:~$ echo $PATH
  4. echo $PATH
  5. .
Una vez que le pasamos el valor a PATH, procedemos a crear un file llamado CAT, que contendra /bin/sh, el cual al ejecutar ./msgmike, deberiamos escalar privilegios, veamos:
















Como vemos en la imagen, con whoami verificamos que somos Kane, luego creamos el archivo cat y le damos permisos. Al ejecutar msgmike escalamos privilegios a mike, gracias al SUID.

Continuamos... estamos cerca.

Nos vamos hacia nuestro nuevo /home/mike, y verificamos que tenemos otro file, llamado msg2root.. comprobamos de que se trata:


  1. mike@pwnlab:/home/mike$ file msg2root
  2. file msg2root
  3. msg2root: setuid, setgid ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=60bf769f8fbbfd406c047f698b55d2668fae14d3, not stripped
Ok, tenemos otro file con SUID, esta vez de "ROOT". jeje.. Al ejecutarlo, vemos que hace un echo de todo lo que tipeamos:























Al verificar con strings msg2root vemos que lo que hace es lo que esta en evidencia, realiza un stdin y stdout con /bin/echo. Por ende si cortáramos el mensaje, con ";" y escribimos una segunda orden como por ejemplo con el comando "pwd", tendría que funcionar y darnos el path:



Y efectivamente funciono, considerando el bit suid activado, procedo a verificar si esta netcat en el sistema, e intento abrir una nueva shell para escalar privilegios a Root ;D:


Tambien podriamos haber realizado un 'cat' desde msg2root hacia /root/flag.txt, era el modo facil, jeje, pero al saber que estaba netcat, fue un plus.

De esta manera se finaliza con el CTF.

2 comentarios:

  1. En uno de los ultimos pasos pides que comprobemos que tenemos otro file, pero no podemos porque hemos borrado los comandos de la variable PATH. Y luego por arte de magia te cambia el prompr y de tener una simple "$" pasas a tener "mike@pwnlab:/home/mike$". El comando "file" y "strings"no se encuentran en "/bin/sh" y da error. Agradeceria que explicaras los pasos que das.

    ResponderEliminar
  2. Creo entender tu punto, lo que sucede es que una vez que se realiza la escalada de privilegio y estamos en $... lo que hago es importar con python -c la /bin/bash. Por otro lado para poder llegar a file o strings, podes pasarle a $PATH como pasaste el ".", lo siguiente: /usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games

    Que ese es el valor ORIGINAL que tenias antes de cambiarlo. Cualquier duda, consultame. Saludos.

    ResponderEliminar

Deja un comentario..