ben10
Atualizado
Atualizado
Categoria: Web Exploitation Dificuldade: Facil (minha opiniao)
Ao acessar o site, vemos uma pagina de login com inputs para acessar logar, criar conta e ir para opcao de "Forgot Password"
O codigo da aplicacao web foi disponibilizado no desafio, bati o olho nas paginas estaticas e nao achei nada muito interessante, mas no codigo do backend que foi feito em Python usando o framework Flask, achei alguns metodos. E entre eles achei o seguinte metodo:
Logo, percebi que esse era o metodo que eu deveria usar para pegar a flag. Se analisarmos o codigo vemos que ele pega os cookies da sessao para pegar o username e faz verificacoes a partir daquele username. Entao basta eu conseguir manipular esse username para conseguir capturar a flag! No codigo diz que para pegar a flag o image_id precisa ser 'ben10' e o username precisa comecar com 'admin'.
Ao procurar o trecho de codigo que consigo manipular esse dado achei o seguinte metodo:
Como podemos ver, esse metodo eh para criar usuarios, voce passa o username e a password e ele insere esse usuario no banco de dados para poder fazer login posteriormente. A principio pensei em SQLInjection, porem ele estava usando o "?" na query e passando como parametro, assim o SQLInjection se torna incabivel (caso queria saber como me chame q eu explico ;) ).
Continuando... O problema aqui esta no seguinte trecho:
Onde nos proibe de criar um usuario que inicie com admin, porem eh essencial para conseguirmos capturar a flag no metodo 'image/image_id' mostrado anteriormente.
Logo, a unica opcao que nos resta eh manipular o session cookie que eh verificado no metodo que retorna a flag, ou seja, precisamos criar um usuario normal (ex: brg:brg) e apos fazer login com esse usuario, manipular o seu cookie, aqui esta uma imagem do meu navegador com o cookie apos eu logar como brg:brg
O meu cookie eh
Posso simplesmente decodificar o Base64, mas optei por usar o jwt.io:
Com isso consigo ver que existe o valor do meu username, mas para manipula-lo eu preciso re-assinar o JWT novamente para funcionar. Achei isso no StackOverflow mostrando como usar a ferramenta flask-unsign do python, que basicamente faz um brute force para tentar achar a chave que foi usada para assinar aquele JWT.
Pesquisando uma boa lista para poder rodar o brute force, achei essa no github com uma quantidade consideravel de strings.
Enfim, rodei o seguinte comando:
e com isso consegui descobrir que a chave usada eh:
Agora acabou, so preciso mudar o Json e assina-lo com a chave secreta descoberta, usei o seguinte comando:
e pronto!
peguei o JWT retornado e substitui na sessao do meu navegador, e acessei o seguinte metodo 'image/ben10' e la estava a flag