Skip to main content

Solução do CTF Fetch the Flag 2022: File Explorer

Escrito por
feature ctf file explorer

9 de novembro de 2022

0 minutos de leitura

Obrigado 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.

Tela do desafio 304 File Explorer, identificada como node.js e Snyk Open Source, que descreve arquivos ocultos em um aplicativo web

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.

Página do navegador com os textos “Pode invadir, m3”, “encontre a flag” e “Confira nossos arquivos aqui.”

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

Navegador exibindo o índice de um diretório com pastas de CSS, imagens e JavaScript, além de arquivos como about.html, favicon.ico e robots.txt.

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:

O Postman exibe uma solicitação GET bem-sucedida para um site de explorador de arquivos. A resposta diz “Pode hackear m3”, “encontre a flag” e inclui links para arquivos.

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

O Postman exibe uma solicitação GET bem-sucedida a um explorador público de arquivos, listando arquivos CSS, imagens, JavaScript, HTML, favicon e robots.txt.

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.

Postman exibindo uma solicitação GET a um explorador de arquivos público com uma lista de arquivos CSS, imagens, JavaScript, HTML, favicon e robots.txt

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

Requisição GET no Postman usando uma URL codificada exibe uma resposta 200 OK bem-sucedida com a listagem de um diretório de arquivos.

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

O Postman exibe uma solicitação GET bem-sucedida para uma URL do explorador de arquivos, que retorna uma string com uma flag da SNYK.

Encontramos a flag!

Encontrando a flag com o Curl

Terminal exibindo listagens de diretórios com curl para um desafio de explorador de arquivos, seguido por um comando que revela uma flag do CTF da Snyk.

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/

Barra de endereço do navegador exibindo uma URL de explorador de arquivos e a string da flag SNYK.

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.

Marketplace de extensões do Visual Studio Code exibindo a página da extensão Snyk Security, com controles de instalação e detalhes da análise de vulnerabilidades.

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.

O Visual Studio Code mostra o arquivo package.json com um alerta de vulnerabilidade para a dependência st@0.2.4 e duas vulnerabilidades de gravidade média.

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.

O Visual Studio Code exibe um arquivo de servidor Express em JavaScript com um alerta de dependência que aponta duas vulnerabilidades.

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.

Editor de código exibindo uma dependência npm com duas vulnerabilidades e uma ação do Snyk para mostrar 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.

Janela escura do VS Code mostrando um relatório de vulnerabilidade do Snyk OSS sobre uma falha de Directory Traversal no pacote npm st.

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

Página de uma lição do Snyk Learn intitulada “Travessia de diretórios”, que explica a divulgação não intencional de arquivos confidenciais e exibe uma barra lateral com o progresso da lição.

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.