RootedCon CTF writeup nivel 10

Reto 10

Tras pasar el reto anterior, nos sale por pantalla lo siguiente:

Para poder continuar:

172.23.0.47

Así que hacemos un escaneo a ver qué se esconde tras esa IP:

Y nos encontramos con un HTTPS, así que toca conectarse a ver qué hay en esa web:

Editando el código fuente nos encontramos con una pista:

De forma que si probamos a validarnos como test / test accedemos a otra pantalla:

Analizando con el TamperData podemos ver algunas cosas curiosas:

Tenemos una cookie con 3 valores:

  • PHPSESSID=dg1ofke8qvedlrg0m9g408f5g0
  • tokenid=786aprxg87
  • raw=dGVzdA%3D%3D

Analicemos estos 3 valores:

  • PHPSESSID puede dar lugar a confusión por el nombre de la variable pero el valor que tiene no se corresponde a lo esperado para una variable de sesión, que es un MD5 de 32 bytes. Por tanto ese valor, que por cierto no siempre es el mismo, es bastante sospechoso al tratarse de un ASCII de 30 bytes.
  • tokenid de momento no se lo que es aunque por el nombre, parece tratarse el ID del mensaje que aparece en pantalla. Si lo quito no me aparecen las frases con las conversaciones.
  • raw es el nombre del usuario en Base64, pero aunque lo cambiemos no hace nada diferente.

Una vez validados, por mucho que recarguemos o toquemos las cookies (siempre que no se altere PHPSESSID) lo que nos aparece siempre es:

Estuve buscando información sobre ‘Mongo‘ y me salía un mono. Luego estuve buscando información sobre ‘Mongo chat‘ y me salía una una web de contactos. Así que me quedé algo bloqueado hasta que Pablo, como pista, nos puso una referencia a una de las charlas de la Rooted (como estuve centrado en el CTF, la verdad es que no presté mucha atención a las charlas) acerca de MongoDB. Así que buscando información de nuevo di con esta web:

http://www.idontplaydarts.com/2010/07/mongodb-is-vulnerable-to-sql-injection-in-php-at-least/

en la que explica cómo realizar inyecciones en este sistema:

De forma que, como podemos ver, si no está bien validado, es posible inyectar código y extraer datos.

Tras varias pruebas, al final conseguí inyectar en una de las cookies, concretamente en tokenid:

La cookie original es:

PHPSESSID=28gp5uagb1ou5q55cvbkb25uo7;

tokenid=786aprxg87;

raw=dGVzdA%3D%3D

que sustituimos por:

PHPSESSID=28gp5uagb1ou5q55cvbkb25uo7;

tokenid[$ne]=786aprxg87;

raw=YWRtaW4%3D

Lo que estamos diciéndole es que saque todas las tokenid menos la que hay por defecto. Además, cambiamos el raw escribiendo admin en lugar de test (sino da un error).

Como supuse, tokenid era el identificador del mensaje que aparecía por pantalla, esta vez salió:

Pinchando en el primer enlace vamos a:

https://172.23.0.47/index.php?drink=sunny&quantity=1

Donde aparece algo así:

A medida que vamos recargando, va decrementando el número de sunnys hasta que termina diciendo que hemos bebido demasiadas.

Con el segundo enlace ocurre algo similar pero con coffee:

https://172.23.0.47/index.php?drink=coffee&quantity=1

Si nos pasamos pidiendo cafés, por ejemplo poniendo quantity=999, nos aparece:

Finalmente inyectamos también en la URL, concretamente en la bebida (además de en la cookie):

https://172.23.0.47/index.php?drink[$ne]=coffee&quantity=1

Apareciendo:

Y si insistimos, sale nuestra solución del reto:


Para pasar el reto, introducimos la IP que nos aparece: 172.23.0.234


Un comentario

  1. Q guapo. A veces sigo algunos posts tuyos en elhck.net… me pasare mas seguido por aki 🙂

Deja un comentario