Skip to main content

Solución de Fetch the Flag CTF 2022: git-refs

Escrito por

Iulia Manda

feature ctf git refs

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.

Herramienta Git Refs que muestra la URL de un repositorio de GitHub, nombres de ramas remotas y hashes de confirmación, junto con los detalles de las solicitudes de red del navegador.
Herramienta Git Refs que muestra la URL de un repositorio de GitHub, nombres de ramas remotas y hashes de commits junto a la carga útil de una solicitud en Chrome DevTools.

Vemos que es una solicitud POST a http://git-refs.c.ctf-snyk.io/git con una lista en el cuerpo:

["ls-remote", "https://github.com/snyk/nuget-semver"]

¡Interesante! Creemos que ls-remote es un comando de Git. Nos preguntamos si podemos pasar otros comandos de Git en el cuerpo…

Ventana de Postman que muestra una solicitud POST a un endpoint de Git y un texto de respuesta que indica que el repositorio está en la rama master y aún no tiene commits

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?

Cliente de API que muestra una solicitud POST para obtener datos de Git reflog y un error 500 que indica que la rama master no tiene commits.

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.

Ventana de Postman que muestra una solicitud POST a una URL de Git, con un cuerpo JSON y una respuesta 200 OK que muestra la salida del estado de Git.

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

Solicitud de Postman que consulta referencias de Git con work-tree y status, y devuelve una lista de estado de Git con directorios del sistema sin seguimiento.

¡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:

-e, --edit           Opens an editor to modify the specified config file; either --system, --global, or repository (default).

Mmm, interesante. Probémosla:

Ventana de Postman que muestra una solicitud POST a un endpoint de git-refs con datos JSON y una respuesta del paquete que contiene una flag y una configuración de Git.

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.

Leer más

illustration hero ai
Blog

PHP corrige dos vulnerabilidades críticas de RCE sin autenticación (CVE-2026-109618, CVE-2026-109619): actualiza ahora

Dos fallas críticas en el ciclo de solicitudes de PHP pueden permitir la ejecución remota de código sin autenticación. Actualiza a una versión corregida o instala una corrección retroportada por un proveedor para las versiones anteriores.

blog feature ai lilac
Blog

Convierte tu backlog de vulnerabilidades en pull requests con la remediación agéntica

Evo Remediation Agent ya está disponible en Open Preview e incorpora la resolución automatizada de dependencias a Evo Agentic AppSec. Ahora, los equipos de AppSec pueden ejecutar campañas de remediación continuas

AI Background min crop
Blog

La IA activa todos los riesgos que has aceptado: siete ideas del panel de seguridad de IA sin filtros

La IA hace que los ataques sean más baratos y rápidos, y deja al descubierto riesgos que las organizaciones ya enfrentan. Cuatro líderes de seguridad explican por qué la defensa a velocidad de máquina y la corrección más rápida son esenciales.