NahamCon CTF
Este CTF me chamou atenção pela quantidade de inscritos (3000 equipes) e pelo próprio naham, que é um hacker muito conhecido na comunidade internacional. E com muitos desafios web interessantes.
A competição acabou, mas os desafios continuam disponíveis.
https://ctf.nahamcon.com/challenges
Infelizmente tive pouco tempo e já iniciei somente no sábado à tarde (perdi toda a sexta). Também perdi muito tempo com o phphonebook, que não resolvi (lição aprendida — não gastar todo o tempo só com um maldito desafio).
Este desafio, chamado de Seriously, foi bem interessante e gratificante, porque, apesar de valer poucos pontos, só foi quebrado por 22 equipes. E eu estou na lista!
Iniciando o desafio
Então nós temos 5 “lojas de plantas”, que precisamos hackear pra obter a flag. De primeira achei que seria algum tipo de escalada de privilégios envolvendo lojas diferentes com níveis diferentes de acesso.
Já começamos com duas dicas:
- Uma mensagem dizendo que o checkout está desabilitado devido a problemas de segurança.
- O próprio nome do jogo (“seriously”), como percebi depois.
Tentei todas as lojas pra ver se tinha alguma com checkout aberto, mas não tinha nenhuma (lojas 3 e 4 estavam fora).
Vulnerabilidade Encontrada
A URL /cart (carrinho de compras) usava um cookie também chamado cart pra armazenar os produtos selecionados, codificados em base64:
Base64:
Cookie: cart=eyJpdGVtcyI6eyIwIjp7Im5hbWUiOiJIYXdvcnRoaW9wc2lzIGF0dGVudWF0YSIsInByaWNlIjoxOS45OSwiY291bnQiOjF9LCIyIjp7Im5hbWUiOiJEcmFjYWVuYSB0cmlmYXNjaWF0YSIsInByaWNlIjoxNC45OSwiY291bnQiOjF9fX0K
Decodificado:
{"items":{"0":{"name":"Haworthiopsis attenuata","price":19.99,"count":1},"2":{"name":"Dracaena trifasciata","price":14.99,"count":1}}}
Com um erro 404, descubro que é uma aplicação JavaScript/NodeJS.
E outra coisa interessante: a aplicação fica em /home/user/app.js. A flag provavelmente estaria nesse código ou nessa pasta.
Com isso, existe um ponto de ataque pra testar: Javascript Object Deserialization Vulnerability.
Primera tentativa: Comandos Linux (Shell)
Usando um payload que encontrei online, tentei chamar comandos do SO. O trecho abaixo tem a mesma estrutura do cart, mas mudei o name pra função evil:
O plano é serializar o objeto evil e enviar para o servidor.
Uma coisa importante sobre o () acima: se você colocar os parênteses nesse construtor, ele já vai rodar a função e a versão serializada não vai com a função, mas com o resultado da execução. Por isso, resolvi serializar primeiro e incluir o parêntese depois. O parêntese precisa estar lá pra que a função seja executada automaticamente no alvo.
E testando:
Agora eu tenho um payload. E funciona localmente quando eu simulo a deserialização (ele gera o arquivo nep10.txt). Mas eu não consegui fazer o shell funcionar no servidor (tentei fazer chamadas via curl).
Hackeando com Javascript
Eu não preciso realmente de um shell quando eu posso rodar código Javascript no servidor. Então vamos evoluir o objeto evil.
O plano é enviar o resultado dos comandos para o requestcatcher, que é uma ferramenta gratuita online pra receber/testar requests. Pra isso, criei o a url https://neptunian147.requestcatcher.com pra receber os meus resultados.
O plano inicial é listar os arquivos do diretório /home/user e ver se encontramos a flag.
E depois disso, sucesso! Estamos rodando código no servidor e recebendo os resultados. Flag encontrada no diretório.
Então vamos incluir um trecho de código pra enviar o conteúdo da flag pro requestcatcher, em base64 pra evitar qualquer problema de codificação/protocolo:
E então recebemos:
E decodificando:
$ echo "ZmxhZ3tzZXJpb3VzbHlfZGVzZXJpYWxpemF0aW9uX3dpdGhfcGxhbnRzfQo=" | base64 -d
flag{seriously_deserialization_with_plants}
Owned!
Referências
- Site do CTF: https://ctf.nahamcon.com/ (desafios continuam disponíveis)
- CTF Time: https://ctftime.org/event/1067
- Meu perfil no CTF Time: https://ctftime.org/team/122851
Artigos sobre a técnica utilizada
- https://medium.com/@chaudharyaditya/insecure-deserialization-3035c6b5766e
- https://owasp.org/www-community/vulnerabilities/Deserialization_of_untrusted_data
Payload Final
Código completo do Exploit
Trecho de código do novo objeto evil, pra geração do payload:
Original em inglês: https://github.com/Neptunians/nahamcon-ctf/blob/master/seriously/README.md