Git Exposed — Um breve overview da vulnerabilidade.

Gabriel Lima
6 min readNov 23, 2022

No momento que atacamos uma aplicação em um pentest black box, bug bounty ou em CTF’s, nós não conseguimos ler o código-fonte do back-end, com o acesso desse código podemos entender melhor como a aplicação se comporta e criar um exploit para a mesma, exemplo disso seria o SQL Injection, se torna muito mais fácil encontrar falhas com uma análise de código.

O código-fonte pode conter informações sensíveis como por exemplo chaves API, comentários dos desenvolvedores (explicando alguma linha de comando), chaves AWS e até mesmo a senha de uma tela administrativa do sistema.

O que é Git?

Git é um sistema de controle de versão de código aberto. Através dele podemos desenvolver projetos sozinhos ou com outras pessoas contribuindo simultaneamente no mesmo, editando e criando arquivos.

O que é a pasta .git?

Dentro desta pasta é armazenado todas as informações do projeto no controle de versão e tudo sobre os commits, endereço de repositório remoto e etc. Outra coisa interessante é o log que armazena o histórico de commits, mostrando as versões anteriores da atual.

Encontrando a falha de Git Exposed

Esta falha acontece quando o .git esta exposto acidentalmente na aplicação por meio do diretório /.git.

Para verificar a existência da falha temos que ir no diretório raiz da aplicação, por exemplo site.com, e adicionar /.git na URL. Nesse momento existem 3 possibilidades que podem acontecer:

  1. Se você receber um erro 404, significa que o diretório .git da aplicação não esta disponível, logo a falha não é existente aqui :/
  2. Se você receber um erro 403, o diretório .git está disponível no servidor, então podemos fazer um fuzzing de diretórios com uma wordlist para esse teste e assim localizar caso a listagem de diretório esteja desligada no servidor.
  3. Se você não tiver nenhum erro e o servidor responder com a arvore de arquivos do diretório .git, você pode navegar diretamente pelo conteúdo das pastas e obter todas as informações que elas contém. Segue uma imagem mostrando como seria a resposta com sucesso:

Pro Trick para Encontrar .git Exposed

Existe uma extensão-web que automatiza esse processo de testes e nos fala se encontrou a falha, esta extensão chama-se DotGit. Com essa extensão basta apenas entrar no site e ela efetuara os testes, vale ressaltar que ela deixa logs em todos sites que você entrar.

Para utilizar ele é simples basta instalar ele no seu navegador Chrome ou em seu Firefox.

Quando ele encontrar um .git exposto ele ira te notificar e deixar a extensão com um numero igual está imagem:

Explorando Git Exposed

Agora que já localizamos a falha temos que explorar ela, para fazer isso podemos baixar todos esses arquivos e analisar em busca de falhas pelo código-fonte ou credencias que um desenvolvedor pode ter comentado e esquecido de remover.

Irei mostrar 2 formas para fazer este download, a primeira será com o git-dumper e a segunda usando o wget.

1-Baixando com o Git-dumper

O git-dumper é utilizado como ferramenta automatizada para baixar o git exposto na web, para instalar ele basta seguir esses passos:

1° Clone o repositório da ferramenta.

git clone https://github.com/arthaud/git-dumper.git

2° Ao termino do passo anterior entre na pasta que foi criada

cd git-dumper

3° Agora baixe os requisitos para a ferramenta funcionar.

sudo pip install -r requirements.txt

4° A sintaxe da ferramenta é a seguinte:

./git-dumper.py http://site.com/.git ~/site

./git-dumper.py: Assim executamos a ferramenta.

http://site.com/.git: Site com a vulnerabilidade, é necessário colocar o /.git no final.

~/site: Aqui é o nome da pasta que vamos criar, neste caso esta salvando na home do usuário “~/”, geralmente salvamos com o nome da maquina ou alvo para não confundir.

2 — Baixando com o WGET

Para fazer o download do git exposto use este comando abaixo:

wget - mirror -I .git site-alvo.com/.git/

wget: É um programa livre que efetua o download de dados da web.

— mirror: Faz com que baixe tudo do git, download recursivo.

-I: Cria um arquivo com tudo que foi baixado.

Após o download ser concluído uma pasta contendo tudo do git será criada, segue imagem abaixo:

Neste momento podemos ver se algum conteúdo pode ser restaurado, mas para isso você precisa entrar na pasta que foi criada, no meu caso eu vou entrar usando “cd site.com”.

Agora dentro da pasta eu usarei o comando para checar o status do git.

git status

Podemos notar que alguns arquivos foram deletados, para recuperar eles podemos usar um dos 2 comandos abaixo:

git checkout -- .  # Ou
git restore .

Aqui temos os arquivos restaurados com sucesso!

Estrutura de Diretórios do .git

O diretório .git é organizado de uma maneira específica, quando você entrar no diretório .git e der um comando “ls”, será possível ver os seguintes diretórios e arquivos:

Aqui temos arquivos interessante do diretório .git para reconstruir e entender o código fonte.

Objects

Este diretório é utilizado para armazenar objetos Git. Ele contém pastas adicionais, cada um com dois caracteres de nome. Estes subdiretórios são nomeados de acordo com os dois primeiros caracteres do hash SHA1 dos objetos git.

Config

Aqui temos o arquivo de configuração Git do projeto.

HEAD

É um arquivo que contém uma referencia ao branch atual.

Lendo os Logs

Para ler os logs basta usar esse comando.

git log

Assim podemos ver o que foi alterado, quando e quem fez a alteração, o resultado será deste tipo.

Lendo os Commits

Para ler individualmente cada commit temos que usar o seguinte comando:

git show <id do commit>

Para ler tudo que contem no .git baixado, eu recomendo que usem esse comando:

git log | grep commit | cut -d " " -f2 | xargs git show

Nesse comando basicamente filtramos o que é commit e mandamos ler todos!

Corrigindo a Falha de Git Exposed

Para corrigir esta vulnerabilidade basta remover a pasta .git do servidor web ou certifique-se de negar TODO acesso a este diretório, para negar acesso basta fazer os seguintes passos:

Apache

No apache podemos corrigir da seguinte maneira, no arquivo de configuração httpd.conf coloque esse trecho de código:

Apache 2.2

<DirectoryMatch "^/.*/\.git/"> Order deny,allow Deny from all</DirectoryMatch>

Apache 2.4

<DirectoryMatch "^/.*/\.git/"> Require all denied </DirectoryMatch>

Nginx

Entre no arquivo de configuração nginx.conf e coloque o seguinte código:

location ~ /.git/ { deny all; }

Lighttpd

Entre no arquivo de configuração lighttpd.conf e coloque o seguinte código:

server.modules + = ("mod_access")

Agora vamos bloquear o acesso ao .git

$ HTTP ["url"] = ~ "^ / \. Git /" { url.access-deny = ("") }

Dicas de CTF’s para Testar seu Aprendizado!

Para testar o aprendizado adquirido neste artigo, trago recomendações de maquinas para jogar!

Primeira maquina chama Git Happens do Tryhackme, ela tem foco total no que aprendemos, a outra maquina se chama DevGuru no VulnHub, ela também tem a falha, entretanto ela é um pouco mais difícil e por ultimo temos a maquina do UHC v16, infelizmente a plataforma é paga no momento.

Conclusão

Por hoje foi isso pessoal! :D Espero que estejam gostando dos artigos que eu tenho postado e que eles tenham agregado em seu conhecimento!

Fontes:

--

--