Force

Máquina Force de DockerLabsarrow-up-right

Force

Info

Nombre
DIficultad
Ip
Plataforma

Force

Dificil

172.17.0.2

Reconocimiento

Comenzamos con un escaneo de nmap para ver los puertos abiertos de la máquina:

-p-: Englobar el rango total de puertos (1-65535).

--open: Mostrar solo los puertos que estén abiertos.

--min-rate 5000: Enviar paquetes no mas lento que 5000 paquetes por segundo.

-sS: Indicamos el modo de escaneo TCP SYN scan.

-Pn: No aplicar descubrimiento de hosts.

-n: No aplicar resolución DNS.

-oG: Exportar el escaneo en un formato específico.

Los únicos puertos que vemos abiertos son:

  • 22: Probablemente corriendo el servicio openssh-server

  • 80: Probablemente corriendo el servicio apache2

Por lo que procederemos a realizar un escaneo más profundo

Como podemos ver, era lo que esperábamos, openssh-server y apache2. Además, según el resultado de nmap el título de la página es "Login", por lo que continuaremos directamente desde el navegador.

Una vez entramos a la página, nos sale una alerta con este mensaje:

además, si intentamos iniciar sesión con un usuario que no existe nos pone un mensaje que dice "User does not exist", pero si el usuario existe nos dice "Incorrect password for the user". Esto ya nos revela que el usuario 'admin' si existe, y según la alerta que nos salió, podríamos filtrar en el rockyou para que nos deje una lista con contraseñas que cumplan esas características:

luego, realizamos un ataque de fuerza bruta con hydra para obtener la contraseña del usuario admin:

Luego de esperar unos minutos, obtenemos el siguiente resultado:

Hydra

por lo que ya podremos iniciar sesión.

Reconocimiento web

Una vez dentro, veremos lo siguiente:

App

luego de probar algunos payloads, podemos notar que al agregar una nota pero poniendo una comilla nos da el siguiente mensaje:

viendo esto, ya podemos deducir que se trata de una inyección sql. Por lo que en mi caso, he realizado un script en python para poder explotar esta vulnerabilidad:

file-archive
2KB
archive

Una vez la explotamos, obtendremos el siguiente resultado:

SQLI

Intrusión

Probando las credenciales obtenidas, podemos notar que las siguientes son útiles para ssh:

Una vez nos conectamos, notamos que estamos dentro de un rbash, esto significa que estamos usando una shell como bash solo que esta está limitada, variables de entorno como PATH están bloqueadas, esto significa que si la variable PATH tiene una ruta distinta a la normal solo podremos ejecutar los comandos que estén en la ruta personalizada:

rbash

como vemos en la foto, comandos básicos no están en la ruta de nuestro PATH, por lo que tendremos que buscar una manera para poder escapar de esta rbash.

Para nuestra suerte, la conexión la hacemos mediante ssh, por lo que una manera simple de hacerlo es conectarnos de esta manera:

esto hará que al entrar nos ejecute directamente una bash, por lo que ahora podremos ejecutar el comando chsh para cambiar la shell de nuestro usuario por /bin/bash. Además tendremos que ejecutar los siguientes comandos para que al conectarnos nuevamente por ssh no tengamos problemas con la variable PATH:

Escalada de privilegios

Enumeración

Comenzamos revisando binarios con permisos SUID y encontramos un binario poco común:

lo ejecutamos y vemos que nos pide un input. Si probamos a pasarle 200 letras 'A' (/home/ttttt/bf/vuln $(python2.7 -c 'print "A"*200')) veremos que el programa crashea, esto significa que estamos frente a un buffer overflow.

Buffer Overflow

Para poder analizarlo correctamente, pasaremos el binario a nuestra máquina local. Para hacerlo lo haremos usando netcat y /dev/tcp:

Una vez recibimos el archivo, imitamos los permisos para poder explotarlo correctamente:

Para empezar comenzaremos revisando las protecciones:

vemos que el stack es ejecutable, no tiene canarios y NX no está activado.

Con esta información ya podemos explotar el buffer overflow.

Para empezar necesitamos obtener el offset para que se de el buffer overflow, este lo podemos conseguir usando las herramientas pattern_offset.rb y pattern_create.rb de metasploit. Primero generamos un pattern usando pattern_create.rb:

el resultado obtenido, lo usaremos con gdb para obtener el offset:

obtenemos como resultado el texto 'cA5c', el cual si se lo pasamos a pattern_offset (al inverso) nos dirá el offset exacto:

con el offset listo, nos faltaría buscar un shellcode útil para este caso. Para encontrar el indicado, debemos revisar si el binario usa setuid porque si no lo usa, aunque obtengamos una shell no sería como root y no nos serviría de nada:

al ejecutarlo no nos devuelve nada, lo cual significa que no ejecuta setuid, por lo que tendremos que buscar un shellcode el cual primero ejecute setuid para cambiarlo por el de root y luego una shell. Luego de buscar un poco, encuentro el siguiente shellcode en shell-stormarrow-up-right:

lo que hace exactamente este shellcode es lo siguiente:

además es de 37 bytes, por lo que nos sirve para poder explotar el buffer overflow correctamente.

Desde la máquina víctima, ejecutamos gdb pasandole el binario vulnerable y lo ejecutamos de la siguiente manera:

esto lo que hará será pasarle 39 NOP's, el shellcode y tomaremos el control de el EIP con 4 'B'. Pasaremos 39 NOP's porque nuestro shellcode tine 37 bytes (37 + 39 = 76) y 200 letras 'C' para identificar más fácil donde queda nuestro shellcode y los NOP's:

ESP

sabiendo esto, nosotros deberemos hacer que el EIP apunte a la dirección 0xffffd6c0, esto para que con los NOP's se 'deslice' hacia nuestro shellcode y nos ejecute lo que queremos. Por lo que ya tenemos lo necesario para explotar el buffer overflow y escalar a root, salimos de gdb y ejecutamos lo siguiente:

y en mi caso con esa dirección conseguimos una shell como root:

root

Gracias por leer

Última actualización