Last updated
Last updated
Cuando obtenemos el .zip
nos lo pasamos al entorno en el que vamos a empezar a hackear la maquina y haremos lo siguiente.
Nos lo descomprimira y despues montamos la maquina de la siguiente forma.
Info:
Por lo que cuando terminemos de hackearla, le damos a Ctrl+C
y nos eliminara la maquina para que no se queden archivos basura.
Info:
Vemos que si entramos a la pagina, veremos una pagina de apache2
normal y si realizamos un poco de fuzzing
no veremos mucho mas, por lo que vamos a probar a meternos en el seiguiente puerto 8089
a ver que encontramos:
Vemos una pagina normal en la que vemos un campo para poder meter un texto, si metemos cualquier texto y le damos a ENTER
, nos va aparecer un Hola
mas el texto insertado, pero si nos fijamso en la URL
vemos que tiene un parametro llamado ?user=
junto con el texto nuestro, por lo que vamos a probar a realizar un XSS
para ver si fuera vulnerable.
Como resultado vemos que funciona y se nos pone el Hola
en color rojo y de tamaño grande.
Pero si probamos a realizar un SSTI
veremos que tambien funciona:
Info:
SSTI ocurre cuando una aplicación web permite al usuario inyectar código malicioso en una plantilla que se procesa en el servidor.
Los motores de plantillas como Jinja2 (en Python), Twig (en PHP) o Freemarker (en Java) procesan expresiones dinámicas en el lado del servidor.
Si los datos del usuario no son correctamente sanitizados, pueden inyectar código arbitrario en el servidor.
get_flashed_messages
En Flask, get_flashed_messages
es una función usada para obtener mensajes almacenados en el sistema de "flash messages". En este contexto, el payload utiliza su atributo __globals__
.
__globals__
En Python, __globals__
es un atributo que referencia el espacio de nombres global de la función. Esto incluye variables, funciones y objetos globales del entorno donde fue definida.
__builtins__
Dentro del espacio de nombres global, __builtins__
da acceso a las funciones y clases nativas de Python, como open
, exec
, y eval
.
Al acceder a __builtins__.open
, obtienes acceso directo a la función open()
de Python, que permite leer o escribir archivos.
open("/etc/passwd").read()
El archivo /etc/passwd
contiene información sobre los usuarios del sistema en sistemas basados en Unix/Linux.
Este comando intenta abrir y leer el contenido de /etc/passwd
.
Este payload funcionará si se cumplen las siguientes condiciones:
Vulnerabilidad SSTI:
La aplicación utiliza un motor de plantillas como Jinja2 y permite al usuario inyectar expresiones dinámicas.
Ejemplo: si un parámetro de usuario se pasa directamente a una plantilla sin ser sanitizado:
python
CopiarEditar
@app.route("/vulnerable") def vulnerable(): user_input = request.args.get("input") return render_template_string(user_input)
Acceso a __globals__
:
En Jinja2, al procesar plantillas, las funciones y variables globales del entorno están disponibles.
Esto incluye acceso a __globals__
y __builtins__
.
Permisos adecuados:
El proceso de la aplicación web debe tener permisos para leer el archivo /etc/passwd
.
Vemos que si funciona por lo que haremos lo siguiente:
Vamos crearnos una reverse shell
de la siguiente forma:
Antes de ejecutarlo nos pondremos a la escucha:
Estando a la escucha, ejecutaremos lo de la pagina web y si volvemos a la escucha veremos lo siguiente:
Si hacemos sudo -l
veremos lo siguiente:
Vemos que podemos ejecutar el binario base64
como el usuario root
, por lo que haremos lo siguiente.
Info:
Vemos que funciono, por lo que nos conectaremos por ssh
mediante su clave privada.
Lo guardamos y establecemos los permisos adecuados para dicho archivo.
Nos pedira la contraseña, por lo que le haremos fuerza bruta:
Info:
Y veremos que nos saco la contraseña, por lo que volveremos a ejecutar el comando.
Metemos como contraseña honda1
.
Info:
Y con esto entrariamos directamente a la maquina como el usuario root
, por lo que ya habriamos terminado la maquina.