Solução do CTF Fetch the Flag 2022: git-refs
Iulia Manda
9 de novembro de 2022
0 minutos de leituraObrigado 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.


Descobrimos que é uma solicitação POST para http://git-refs.c.ctf-snyk.io/git com uma lista no corpo:
Interessante! Pelo que sabemos, ls-remote é um comando do Git. Será que podemos passar outros comandos do Git no corpo da solicitação…

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?

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.

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

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:
Hmm, interessante. Vamos testar:

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.



