AratuCTF Writeup (Web challs only)
Introdução
O AratuCTF criado pelo pessoal da comunidade Boitatech ficou no ar durante os dias 10-11 de setembro de 2022.
Esse blog post é um writeup simples de todas as challs web com exceção da Pop It e da No Longer Poppin (fuck php pop chains).
Whirlwind
Descrição da chall: “um fenômeno meteorológico que se manifesta como uma coluna de ar fez com que essa aplicação ficasse vulnerável”.
Target: https://whirlwind.boita.tech/
Ao acessar https://whirlwind.boita.tech/ o servidor retornar uma mensagem falando que falta um parâmetro GET:
Fazendo brute force de parâmetros com o x8 encontramos um parâmetro válido:
1 |
|
Ao tentarmos mandar algum valor no parâmetro “createuser” percebemos que ele reflete o valor:
Depois de fazer alguns testes de vulnerabilidades baseadas em reflection, descobrimos que o parâmetro é vulnerável a SSTI com a sintax do jinja2:
Explorando a vulnerabilidade conseguimos um RCE e ler a flag:
Payload final: https://whirlwind.boita.tech/?createuser=1{{+%27%27.__class__.__mro__[1].__subclasses__()[232](%27cat+/flag.txt%27,shell=True,stdout=-1).communicate()[0].strip()}}
inclusive_policy
Descrição: “This vulnerability looks cool, but where’s RCE?”
Target: https://inclusive-policy.boita.tech/
Ao acessar a aplicação ela retorna o source code:
Pelo source code podemos facilmente perceber que da pra ler arquivos arbitrários:
O include do php executa código, então só precisamos encontrar algum arquivo que podemos escrever e fazer um ataque de poisoning, porém não consegui encontrar nenhum arquivo nessas condições.
Outra maneira de executar código com include é através dos filtros do php, seguindo as instruções do artigo LFI2RCE via PHP Filters conseguimos executar comandos no host:
Script depois das adaptações:
1 |
|
ToxycUser
Descrição: “The website is under development, some messages of the developers can be interesting vector of attack.”
Target: https://toxycuser.boita.tech/
Source code: https://github.com/boitatech/aratu-downloads-public/raw/master/ToxycUser.zip
Analisando o source code percebemos que o arquivo func.php está vulnerável a function injection:
1 |
|
Mas pra controlar a função a ser executadas precisamos enviar a request do localhost :(
Analisando o index.php percebemos que ele está vulnerável a SSRF:
1 |
|
Agora é só usar o SSRF pra bypassar o if do localhost do func.php e executar funções arbitrárias do php e conseguir um RCE:
Payload final: https://toxycuser.boita.tech/?parametrosupersecretors=localhost/func.php?action=system%26id=cat$IFS/flag_SKzdI
Sandbox Baby
Descrição: “é só um eval, não pode ser tão difícil assim…”
Target: https://sandbox-baby.boita.tech/
Ao acessar o target o servidor retorna o source code da aplicação:
Basicamente precisamos fazer um code injection no parâmetro “username” usando apenas os caracteres permitidos pelo regex, existem várias formas de fazer isso.
Meu payload foi https://sandbox-baby.boita.tech/?username=blaidd${system(array_pop(array_values($_GET)))}&cmd=cat+/this-is-the-ezy-flag-aratu.txt
F4 Tools user/root
Descrição: “F4 Tools é uma plataforma desenvolvida para armazenar tools. Mostre que existem tools que não estão seguras o suficiente…”
Target: https://f4tools.boita.tech/login
Ao acessar a target url você se depara com uma tela de login onde você pode se registrar e fazer login normalmente:
Ao fazer login o servidor retorna essa tela:
Essa tela é um rabbit hole pra te fazer perder tempo, então só ignore…
Se você tentar fazer um brute force de diretórios você não irá encontrar nada, mas se você tentar fazer esse mesmo brute force autenticado usando a wordlist common.txt você irá encontrar as seguintes rotas:
1 |
|
/Menu:
E ao tentar acessar /decoder ou /download:
Se tentarmos fazer um decode no cookie conseguimos perceber que temos o parâmetro “premium”:
1 |
|
Pela minha experiência eu consegui deduzir que era um cookie de sessão do flask (e era mesmo), então eu tentei fazer um brute force do secret que assina a sessão usando flask-unsign:
1 |
|
Uma vez que temos o secret podemos alterar o parâmetro “premium” pra true e assinar o cookie:
1 |
|
Agora podemos acessar /download que irá fazer o download do script que roda na rota /decoder
Lendo o source code facilmente podemos identificar uma issue de command injection:
1 |
|
Agora só explorar o command injection e pegar as flags de user e root (Não ententi pq separam em 2 flags, n precisei escalar privilégio…):
Receipt Manager
Descrição: “A group of strange developers have developed tools for generating fake business invoices. Your accountants did not like this very much and they assigned YOU to compromise their site. They also told you their flag is located on /flag.txt”
Target: https://receipt-manager-1.boita.tech/
Ao acessar a target url você encontra uma tela com um input de texto onde você pode gerar recibos (Esqueci de printar :/), ao clicar no botão a aplicação gerava um pdf no servidor refletindo o valor que foi enviado no input.
Ao analisar os metadados do pdf podemos descobrir como ele é gerado com o Skia, pesquisando por “Skia exploit” no google você descobre que ele é vulnerável a html injection e é possível fazer ataques de SSRF.
Na descrição da chall é dito que a flag está em /flag.txt, então é só usarmos o iframe pra ler a flag: <iframe src=file:///flag.txt>
Sandbox
Descrição: “Sandbox, criamos uma sandbox 100% segura, agora sim, será impossivel você conseguir acesso!”
Target: https://sandbox.boita.tech/
Source code: https://aratu-public-downloads.s3.amazonaws.com/sandbox.zip
A sandbox é basicamente uma versão mais difícil da baby sandbox:
1 |
|
Meu payload da baby sandbox funcionou sem proplemas na sandbox haha, free flag xD.
Eu só precisei mudar pra função include para ler arquivos pq as funções system(), shell_exec() e exec() não funcionaram :(
Lendo .bash_history:
Lendo a flag leakada do .bash_history:
Payload final: https://sandbox.boita.tech/?username=blaidd${include(array_pop(array_values($_GET)))}&file=/root/this_is_the_flag-from-leaked-from-history.txt
End
Parabéns pro pessoal da Boitatech pelo CTF e pelo evento da Semana Aratu, foi muito divertido resolver essas challs e aprendi bastante coisa com as palestras :D
Esse foi o ranking final: