Vulnhub — PwnLab(init):VM Writeup

Israel Aráoz Severiche
6 min readMay 28, 2019

--

Maquina poco complicada, desde obtener la low shell hasta escalar privilegios, la clave es enumerar, enumerar todo lo que se pueda.

Si bien buscas, encontrarás. (Platón)

Primero identifique la dirección IP.

netdiscover -i eth0 -r 192.168.32.0/24

bueno después de identificar la dirección IP de la “vistima”

nmap -sC -p- -T5 -oN machine.nmap 192.168.32.136
  • 80/tcp — http:Apache 2.4.10 ((Debian))
  • 111/tcp — rpcbind 2–4 (rpc #100000)
  • 3306/tcp — mysql:Mysql 5.5.47–0+dev8u1
  • 37408/tcp — status:1 (RPC # 100024)

Una vez identificado los servicios, siempre el HTTP es el que mas posibilidades tiene de ser el camino correcto. (métodos habilitados, archivos con información “sensible” olvidados, comentarios en las paginas)

dirb http://192.168.32.136 -X .txt,.php,.html /usr/share/wordlist/dirb/big.txt

Enumerar, enumerar los directorios:

El archivo config.php ya llama mucho la atención por el nombre, por lo general se almacena información relacionada a conexiones de BD y como hay un login, ahi debería estar todo.

Comencé a buscar técnicas relacionadas al Local File Inclusión (LFI) suponiendo que las paginas eran incluidas, por lo que se observó en el código fuente de login.

Después de buscar e intentar diferentes métodos.por la red, encontré una manera que desconocía.

Enlaces con la descripción:

https://websec.wordpress.com/2010/02/22/exploiting-php-file-inclusion-overview/

Este wrapper de php, lo que hace es descargar el recurso solicitado “upload” codificado con base en 64.

base64 codigo php del recurso upload.php

Al decodificarlo ya obtenemos un par de datos interesantes.

Con esta información accedí a la base de datos, y de nuevo, a numerar.

Base de datos llamda Users

La base de datos contiene una tabla llamada users, en la cual se encontró 3 usuarios y sus respectivas contraseñas codificadas en base64.

decodificando cada pass, obtuve los siguientes datos.


echo "Sld6WHVCSKp0eQ==" | base64 -d
JWzXuBJJNy
echo "U0lmZHURW42SQ==" | base64 -d
SIfdsTEN6I
echo "aVN2NVltMkdsbw==" | base64 -d
iSv5Ym2GRo
kent:JWzXuBJJNy
mike:SIfdsTEN6I
kane:iSv5Ym2GRo

Lo primero que intente y como siempre fue, subir una webshell (php), extensión no permitida.

Formulario de subida de archivo

Después de varios intentos, me acorde que podía descargar el código y analizar las restricciones en el formulario.

192.168.32.136/?page=php://filter/convert.base64-encode/resource=upload

Devuelve una chorrera con base: base64 ,lo guarde en un archivo upload.php al cual el hice el decode y obtuve el código fuente, para analizar.

Básicamente habían 3 condiciones:

  • Que la extensión se encuentre en su Whitelist
  • Que el archivo se realmente una imagen (tipo de archivo)
  • Que el formato no sea diferente de image/gif y image/jpeg y image/png

Primer intento verificar el tipo de archivo y agregar código incrustado en la imagen para posteriormente intentar subir el archivo.

La imagen subió y fue almacenada en /upload/ con un nombre resultado de un md5 al nombre original del archivo.

Al final intente y pude subir varios archivos, pero sin lograr la ejecución del código incrustado,después de intentar como un pelotudo (recordé que existían varios archivos php que debía descargar), volví y descargue todo los archivos php

Al revisar el de index.php se presenta una luz tenue, este viene a ser el codigo vulnerable a un LFI

include("lang/$_COOKIE['lang']);
index.php

Prueba de Concepto (PoC), manipulamos directamente el parámetro de la cookie y listo :)

Ahora aquí volvemos a unir los puntos, si ya identificamos el camino hacia la ejecución de código remoto.

Subí nuevamente un archivo “imagen.gif” con código incrustado, el truco lo saque de la siguiente url:

Al subir el archivo, genera un nombre (largo como puteada de tartamudo, en formato md5).

Una vez subido el archivo con el código incrustado , debe ser incluido en el archivo index.php

LFI + RCE

Después de esto, intente una shell reversa, establecía la conexión, pero la misma cerraba de manera inmediata. (Tal vez un timeout o algo así podría dar la solución)

Conexión cerrada (indesperada)

Cambié la forma de conectar, y esta vez si funcionó

Obteniendo acceso a través de una reverse shell

Ahora con una low shell ya vamos por el camino correcto

Enumerando usuarios del sistema, me encontré con estos amigos, que ya los había visto anteriormente, menos a john.

primero con kent.

en el home de kent encontramos un binario con el bit SUID y el SGID activo, ya eso daba una nueva señal.

Esto quiere decir que cualquier usuario podrá ejecutar el binario con los permiso del propietario, en este caso mike

Revisando el binario se observó

cat /home/mike/msg.txt

el binario cat , no toma en cuenta la ruta absoluta desde /bin…

creamos el archivo “cat” en el directorio temp

touch /tmp/cat

todos los permisos al archivo.

Verificamos el path y agregamos el nuevo path del “binario”

Ejecutamos el binario y nos permitió cambiar al usuario mike

Ingresamos al directorio de mike. Haciendo un strings al binario msg2root, este arhivo tiene suid y sgid activos y como propietario root, se observa una llamada a un binario y el resultado se redirige al archivo /root/messages.txt, la llamada en el binario no filtra o limpia el dato de entrada, en este caso podríamos aplicar inyección de binario.

Revisando las cadenas de caracteres en el binario.

para comprobar cree un archivo en el directorio de mike ejecutando el binario msg2root y separando la ejecución de comandos por “;”, archivo fue creado por el propietario root

Con esto procedí a escalar privilegios :)

Saludos!

--

--

Israel Aráoz Severiche
Israel Aráoz Severiche

Written by Israel Aráoz Severiche

{💀Cybersecurity Engineer​​🐞 } / { 🥋​ Purple Belt Brazilian Jiu Jitsu } / {🌐​https://twitter.com/iara0z}

No responses yet