Solução do CTF Fetch the Flag 2022: File Explorer
9 de novembro de 2022
0 minutos de leituraObrigado por participar do Fetch com a gente! Parabéns aos milhares de participantes que estiveram conosco no Fetch the Flag CTF. E um agradecimento especial aos Snykers que criaram, testaram e documentaram os desafios!
Se você participou do Fetch the Flag 2022 da Snyk e está procurando a resposta do desafio File Explorer, chegou ao lugar certo. Vamos conferir a solução juntos!
Vamos começar pela fase de reconhecimento
Nessa fase do desafio, um invasor identifica um alvo vulnerável e explora como atacá-lo. No nosso caso, recebemos um link para um site e outro para um repositório público no GitHub. Só precisamos de um ponto de entrada para começar.

O que temos?
Primeiro, acessamos o link http://file-explorer.c.ctf-snyk.io/. Somos recebidos por algumas linhas de texto e um convite para conferir os arquivos clicando em um link.

Clicamos no link e acessamos a pasta /public/, onde vemos que temos acesso a alguns arquivos do aplicativo.

Pelo nome e pela descrição do desafio, além do link /public/, podemos deduzir que será necessário fazer um path traversal (acesso a diretórios superiores).
O que é path traversal?
Um ataque de path traversal (também conhecido como directory traversal) busca acessar arquivos e diretórios armazenados fora da pasta prevista. Ao manipular caminhos usando sequências de ponto-ponto-barra (../) e suas variações, ou caminhos absolutos, pode ser possível acessar arquivos e diretórios arbitrários no sistema de arquivos, incluindo o código-fonte do aplicativo, arquivos de configuração e outros arquivos críticos do sistema.
Vulnerabilidades de path traversal podem causar exposição de informações, permitindo que o invasor descubra a estrutura de pastas ou leia o conteúdo de arquivos confidenciais do sistema.
Encontrando a flag com o Postman
Os CTFs são sobre usar todas as ferramentas disponíveis. Então, vamos usar o Postman para fazer o ataque de path traversal. Começamos com uma solicitação GET simples (http://file-explorer.c.ctf-snyk.io) para acessar o site. O resultado é o mesmo que vemos no navegador:

E temos o mesmo resultado quando adicionamos /public ao final da URL nesta solicitação GET (http://file-explorer.c.ctf-snyk.io/public/):

A sequência ponto-ponto-barra (../) redireciona para a página inicial do site. Vamos tentar uma variação da sequência usando codificação de URL.

O que é codificação de URL?
A codificação de URL substitui caracteres ASCII não seguros por "%" seguido de dois dígitos hexadecimais. No nosso caso, vamos usar %2e para representar . e %2f para representar /.
Vamos conferir o resultado desta solicitação GET (http://file-explorer.c.ctf-snyk.io/public/%2e

Encontramos um arquivo de flag. Vamos acessá-lo com esta solicitação GET (http://file-explorer.c.ctf-snyk.io/public/%2e%2e%2f/flag):

Encontramos a flag!
Encontrando a flag com o Curl

Vamos tentar novamente, desta vez usando apenas o curl. Seguiremos a mesma lógica e começaremos fazendo uma solicitação curl às pastas do site com este comando:
curl http://file-explorer.c.ctf-snyk.io/public/
Em seguida, usamos a vulnerabilidade de path traversal e fazemos uma solicitação curl à pasta acima de public com este comando:
curl http://file-explorer.c.ctf-snyk.io/public/%2e%2e%2f/
Por fim, fazemos uma solicitação curl à flag com o seguinte comando:
curl http://file-explorer.c.ctf-snyk.io/public/%2e%2e%2f/flag
Encontrando a flag no navegador
Também podemos fazer isso diretamente no navegador. Digite a URL a seguir no navegador para ver a página que permite acessar a flag:
http://file-explorer.c.ctf-snyk.io/public/%2e%2e%2f/

Encontrando a flag com a extensão de IDE da Snyk
Para isso, começamos clonando o repositório público e abrimos no Visual Studio Code. Instalamos a extensão Snyk Security para IDE pelo marketplace, digitando "Snyk" para encontrá-la. Depois, reinicie a IDE após a instalação e execute npm install.

Na primeira vez que você clicar no ícone do Patch (nosso mascote), na barra lateral esquerda, não verá as vulnerabilidades de segurança de código aberto do projeto até se autenticar. Para isso, basta criar uma conta gratuita da Snyk. Depois da autenticação, você poderá iniciar a primeira verificação!
Você também pode conferir o arquivo package.json, onde vemos algumas vulnerabilidades no pacote st.

st é um módulo para disponibilizar arquivos estáticos em páginas da web e contém uma vulnerabilidade desse tipo. No nosso exemplo, vemos no arquivo app.js que os arquivos são disponibilizados pela rota public.

De volta ao arquivo package.json, passe o cursor sobre o pacote st e clique na lâmpada amarela para ver a vulnerabilidade mais grave.

Você será direcionado à vulnerabilidade de path traversal. Nessa página, você pode saber mais sobre a vulnerabilidade, qual versão a introduz, como corrigi-la e ver uma prova de conceito.

Você também pode saber mais sobre essa vulnerabilidade clicando em Saiba mais sobre esta vulnerabilidade.

Recapitulando o File Explorer
Vamos pensar em quantas linhas de código escrevemos e quantos componentes ou pacotes importamos para a nossa base de código. Não queremos reinventar a roda e perder tempo reescrevendo algo que provavelmente já existe como pacote no nosso ecossistema.
Esse foi o caso neste desafio. Temos um site simples que usa o pacote st para disponibilizar arquivos estáticos. Mas, ao usar uma versão antiga do pacote, introduzimos uma vulnerabilidade no projeto. Isso dá a um possível invasor a oportunidade de encontrar arquivos confidenciais, credenciais ou senhas. Mantenha os componentes dos seus projetos atualizados para reduzir a superfície de ataque!
Espero que você tenha gostado do File Explorer e dos outros desafios do CTF :)
Quer saber como encontramos as outras flags? Confira nossa página de soluções do Fetch the Flag para ver como fizemos.
