Skip to main content

Solução do CTF Fetch the Flag 2022: git-refs

Escrito por

Iulia Manda

feature ctf git refs

9 de novembro de 2022

0 minutos de leitura

Obrigado por participar do Fetch com a gente! Parabéns aos milhares de jogadores que participaram doFetch the Flag CTF. E um agradecimento especial aos Snykers que criaram, testaram e escreveram sobre os desafios!

Se você participou do evento Fetch the Flag CTF deste ano, talvez tenha tentado resolver o desafio git-refs. Se você não conseguiu terminar ou quer saber mais sobre ele, vamos explorá-lo neste artigo. O nome e a descrição do desafio apontam para o Git, então vamos levar isso em conta durante a investigação. Será que o Git pode nos ajudar a encontrar a flag? Vamos procurar possíveis vetores de ataque na aplicação git-refs.

Desafio

Neste desafio web, recebemos um link para um site onde podemos ver informações sobre repositórios públicos do Git. Podemos usar a busca por texto para listar branches e hashes de commits de um repositório. Não é preciso autenticação para que as solicitações sejam bem-sucedidas, o que torna esse desafio um pouco mais fácil.

Passo a passo

Primeiro, vamos analisar as solicitações feitas.

Ferramenta Git Refs exibindo a URL de um repositório do GitHub, nomes de branches remotas e hashes de commits, ao lado dos detalhes de uma solicitação de rede no navegador.
Ferramenta Git Refs exibindo a URL de um repositório do GitHub, nomes de branches remotas e hashes de commits ao lado do payload de uma solicitação no Chrome DevTools.

Descobrimos que é uma solicitação POST para http://git-refs.c.ctf-snyk.io/git com uma lista no corpo:

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

Interessante! Pelo que sabemos, ls-remote é um comando do Git. Será que podemos passar outros comandos do Git no corpo da solicitação…

Janela do Postman mostrando uma solicitação POST para um endpoint do Git e uma resposta informando que o repositório está na branch master e ainda não tem commits

Parece que agora temos um shell remoto por meio do comando do Git. Vamos ver se conseguimos obter informações sobre o repositório git-refs.

Parece ser um repositório Git vazio. Mas será mesmo? Será que há algo que foi revertido no histórico do Git?

Cliente de API exibindo uma solicitação POST de dados do reflog do Git e um erro 500 informando que a branch master não tem commits.

O reflog também não parece muito útil. Parece um repositório local recém-inicializado, já que nada foi enviado para o repositório remoto.

Na verdade, será que podemos usar essas descobertas para obter informações sobre arquivos do sistema? Talvez possamos procurar um flag.txt ou algo parecido.

Janela do Postman mostrando uma solicitação POST para uma URL do Git, com um corpo JSON e uma resposta 200 OK exibindo a saída do status do Git.

Consultando o manual do Git, percebemos que o comando --work-tree pode ser útil para explorar o sistema de arquivos.

Requisição do Postman consultando referências do Git com work-tree e status, retornando uma lista do status do Git com diretórios do sistema não rastreados.

Boa! Usamos o Git para listar o diretório ‘/’ no sistema remoto.

Mas não tivemos sorte por esse caminho, principalmente porque todas as tentativas de ler o conteúdo dos arquivos falharam (ou seja, tentamos usar git add e depois git diff, mas provavelmente não era possível adicionar ou registrar nada por causa do .gitignore. Não temos certeza, pois também não conseguimos ver o conteúdo do .gitignore).

Vamos continuar lendo para descobrir o que mais podemos fazer com git.

Mudando de estratégia

A próxima ideia foi verificar a configuração do repositório. Ao analisar as opções de git config, encontramos uma que pareceu interessante:

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

Hmm, interessante. Vamos testar:

Janela do Postman mostrando uma solicitação POST para um endpoint git-refs com entrada JSON e uma resposta do pacote contendo uma flag e uma configuração do Git.

E aí está a flag. :)

Conclusão

Vamos resumir o que usamos para resolver este desafio:

  • Analisar as solicitações de rede feitas pela aplicação web: conferir a URL, o corpo da solicitação e o status

  • Identificar um possível vetor de ataque, descobrindo como obter acesso a um shell remoto com base nas informações disponíveis

  • Consultar o manual do Git (ou confiar na memória, depende :) ) para descobrir o que poderíamos usar para nos aproximar da flag

A injeção de comandos ainda é bastante comum, por isso sanitizar as entradas continua sendo indispensável nas aplicações atuais. Esperamos que você tenha curtido este desafio e aprendido algo pelo caminho.

Quer saber como encontramos todas as outras flags? Confira nossa página de soluções do Fetch the Flag para ver como fizemos.

Leia mais

illustration hero ai
Blog

PHP corrige duas vulnerabilidades críticas de RCE sem autenticação (CVE-2026-109618, CVE-2026-109619): atualize agora

Duas falhas críticas no ciclo de requisições do PHP podem permitir execução remota de código sem autenticação. Atualize para uma versão corrigida ou instale um backport do fornecedor para versões mais antigas.

blog feature ai lilac
Blog

Transforme seu backlog de vulnerabilidades em pull requests com remediação agentiva

O Evo Remediation Agent está em Open Preview e traz a resolução automatizada de dependências para o Evo Agentic AppSec. Agora, as equipes de AppSec podem executar campanhas contínuas de remediação

AI Background min crop
Blog

A IA está acionando todos os riscos que você aceitou: sete insights do painel de segurança de IA sem filtros

A IA está tornando os ataques mais baratos e rápidos, expondo riscos que as organizações já carregam. Quatro líderes de segurança explicam por que a defesa na velocidade das máquinas e a correção mais rápida são essenciais.