Solución de Fetch the Flag CTF 2022: git-refs
Iulia Manda
9 de noviembre de 2022
0 minutos de lectura¡Gracias por jugar Fetch con nosotros! Felicitaciones a los miles de jugadores que participaron enFetch the Flag CTF. Y muchas gracias a los Snykers que crearon, probaron y documentaron los desafíos!
Si participaste en el evento Fetch the Flag CTF de este año, quizá intentaste resolver el desafío git-refs. Si no lo terminaste o simplemente quieres aprender más, lo resolveremos en este blog. El nombre y la descripción del desafío apuntan a Git, así que lo tendremos presente durante la investigación. ¿Podría Git ayudarnos a encontrar la bandera? Veamos qué posibles vectores de ataque hay en la aplicación git-refs.
Desafío
En este desafío web, recibimos un enlace a un sitio donde podemos ver información sobre repositorios públicos de Git. Podemos usar la búsqueda de texto para mostrar las ramas y los hashes de los commits de un repositorio determinado. No se necesita autenticación para que las solicitudes tengan éxito, lo que hará que este desafío sea un poco más fácil.
Recorrido paso a paso
Primero, veamos las solicitudes que se realizan.


Vemos que es una solicitud POST a http://git-refs.c.ctf-snyk.io/git con una lista en el cuerpo:
¡Interesante! Creemos que ls-remote es un comando de Git. Nos preguntamos si podemos pasar otros comandos de Git en el cuerpo…

Parece que ahora tenemos un shell remoto mediante el comando de Git. Veamos si podemos obtener información sobre el repositorio git-refs.
Parece ser un repositorio de Git vacío. ¿Pero lo es realmente? ¿Podríamos encontrar algo que se haya revertido en el historial de Git?

El reflog tampoco parece muy útil. Parece un repositorio local recién inicializado, ya que no se ha enviado nada al repositorio remoto.
En realidad, ¿podríamos aprovechar estos hallazgos para obtener información sobre los archivos del sistema? Quizá podamos buscar un flag.txt o algo parecido.

Según el manual de Git, el comando --work-tree podría servirnos para explorar el sistema de archivos.

¡Bien! Usamos Git para listar «/» en el sistema remoto.
Sin embargo, esta línea de investigación no dio resultado, principalmente porque todos los intentos de leer el contenido de los archivos fallaron (es decir, intentamos ejecutar git add y luego git diff, pero probablemente no se pueda agregar ni confirmar nada debido a .gitignore. No estamos seguros, porque tampoco pudimos ver el contenido de .gitignore).
Sigamos leyendo para ver qué más podemos hacer con git.
Cambiemos de enfoque
Lo siguiente que se nos ocurrió fue revisar la configuración del repositorio. Al revisar las opciones de git config, encontramos una que parecía interesante:
Mmm, interesante. Probémosla:

Y ahí está la bandera. :)
Para terminar
Resumamos lo que usamos para resolver este desafío:
Analizar las solicitudes de red de la aplicación web: revisar la URL, el cuerpo de la solicitud y el estado
Identificar un posible vector de ataque y descubrir cómo obtener acceso a un shell remoto a partir de la información disponible
Leer el manual de Git (o recurrir a la memoria, según el caso :) ) para descubrir qué podíamos usar y acercarnos a la bandera
La inyección de comandos sigue siendo bastante común, por lo que la sanitización de entradas sigue siendo imprescindible en las aplicaciones actuales. Esperamos que hayas disfrutado este desafío y aprendido algo en el camino.
¿Quieres saber cómo encontramos las demás banderas? Visita nuestra página de soluciones de Fetch the Flag para ver cómo lo hicimos.



