Segurança de Aplicação

Desafio Conviso #1 – Resultados

Finalmente encerrou-se o Desafio Conviso #1 e podemos dizer que a participação ultrapassou nossa expectativa. Então vamos aos resultados e vencedores.

Uma hora após seu lançamento, Rodrigo (ipax) abre o placar com um código um tanto magnífico de aproximadamente 20 KBytes. Porém o primeiro desafiante, Gilson Camelo, chegou para mostrar que entrou no jogo para ganhar, enviando uma solução de 720 caracteres, aproximadamente 25 vezes menor do que a solução de abertura.

Daí em diante, entre dicas e submissões, o desafio passou a ser disputado entre uma meia dúzia de competidores, que a cada envio mostravam que não estavam ali para brincadeira. O gráfico abaixo apresenta o histórico de submissões desses competidores, para que seja possível acompanhar o processo de otimização:

 

 

 

 

As duas últimas submissões estão marcadas com laranja por terem sido enviadas após o prazo estipulado pelas regras. O vencedor seria o competidor Lionan (bla), com uma submissão de 310 caracteres, porém o mesmo entrou em contato e informou que não poderia usufruir da premiação o comitê organizador decidiu aceitar as submissões posteriores. Portanto o vencedor do Desafio Conviso #1 é Ricardo Iramar, com sua submissão de 307 caracteres (enviado após o prazo) que pode ser visto abaixo:

л=(è=~[]).è;ú=++è;ш=++è;ã=++è;ê=++è;и=ã+ê;Ó=ш+и;è=Ó+ш;à=(я=””)+ш;õ=(õ={}+(ю=””))[и]+(Ñ=õ[ш])+(ィ=(л+ю)[ш])+(!è+ю)[ê]+(ß=õ[Ó])+(л=(À=!ю+ю)[ш])+(á=À[ã])+õ[и]+ß+Ñ+л;ィ=л+À[ê]+ß+á+л+ィ;л=á[õ][õ];л(л(ィ+'”‘+(ª=![]+ю)[è-Ó]+ª[ã]+À[ê]+я+ш+Ó+ã+ß+”(‘”+ш+ú+è+Ñ+я+(ê+ш)+ú+à+ú+ê+Ñ+à+и+Ó+à+Ó+Ó+à+и+ш+à+Ó+ê+Ñ+”!’)””)())()

Ricardo, entre em contato através do e-mail abaixo para que possamos instruí-lo acerca da premiação:

base64_decode(“bXZpdGFsaUBjb252aXNvLmNvbS5icgo=”)

Nota: o comitê organizador decidiu fornecer mais um ingresso como premiação do Desafio Conviso #1. Com isso o competidor Gilson Camelo (N1ckyr0m3r0) é o felizardo e, graças a sua solução de 309 caracteres, poderá prestigiar um dos maiores eventos de segurança da América Latina: o Hackers to Hackers Conference. Parabéns Gilson … 🙂

Nossa Solução

Eu havia escrito uma solução para ter uma métrica de o quão poderia ser otimizado. Em uma das referências era utilizado uma técnica que envolvia a exploração de uma falha no navegador, que consistia no vazamento do objeto window quando houvesse uma chamada à função sort() sem parâmetro, permitindo chamar a função alert() com o seguinte modelo:

[][‘sort’]()[‘alert’](‘Go Conviso!’);

Porém como essa falha já foi corrigida, uma alternativa seria seguir uma dica do livro The Browser’s Hacker Handbook, e foi a mesma alternativa do código das soluções propostas. Segue:

If you access the constructor two time from an array object, you get function from there, you pass string of arbitary code to be evaluated

Com isso agora sabemos que é possível executar uma função alert() da seguinte forma, bastando apenas colocá-la como parâmetro do suposto eval:

[][‘constructor’][‘constructor’](‘alert(“Go Conviso!”)’)()

Agora o próximo passo seria obter todos os caracteres alfanuméricos utilizando maneiras alternativas.

Temos algumas palavras chaves do Javascript que podem nos auxiliar, bastando apenas fazer o cast para string e pegar os caracteres necessários. São elas:

!”  // true
!!” // false
[].$ // undefined
{}   // [object Object]

Com essas palavras já seria possível obter a palavra constructor, a palavra alert e parte da mensagem à ser exibida. Então vamos separar os caracteres que necessitamos, e montar nossas palavras:

[ẗ,ŕ,ú,é,,á,Ĺ,ś,,,ñ,,,,í,,,,,ó,Ḃ,,,ć,]=”+!”+!!”+[].$+{}
σ=ć+ó+ñ+ś+ẗ+ŕ+ú+ć+ẗ+ó+ŕ
α=+á+Ĺ+é+ŕ+ẗ

E com isso já podemos ter o nosso eval:

ε=[][σ][σ]

Agora temos que ver quais caracteres alfanumérico da nossa mensagem nos falta (os em negrito e com cor diferente): Go Conviso

A melhor forma de obtermos esses caracteres seria convertendo um valor não alfanumérico para base64, utilizando a função btoa (que já temos os caracteres necessários). Após alguns testes foi possível obter os caracteres utilizando o seguinte trecho de código:

ε(‘β=’+Ḃ+ẗ+ó+á)   // Nosso eval para fazer β=btoa
[ṽ,Ǵ,Ć]=β(‘¼`±’)  // Aqui obtermos os caracteres v, G e B

E agora temos a nossa mensagem completa:

θ=Ǵ+ó+’ ‘+Ć+ó+ñ+ṽ+í+ś+ó+’!’

Feito isso, arrumando aqui, podando ali, mudando aqui, melhorando ali foi possível obter a minha solução para o desafio, que possui 166 caracteres:

([[ẗ,ŕ,ú,é,,á,Ĺ,ś,,,ñ,,,,í,,,,,ó,Ḃ,,,ć]=”+!”+!!”+[].$+{}][σ=ć+ó+ñ+ś+ẗ+ŕ+ú+ć+ẗ+ó+ŕ][σ])(‘α=’+á+Ĺ+é+ŕ+ẗ+’;[ṽ,Ǵ,Ć]=’+Ḃ+ẗ+ó+á+”(‘¼`±’)”)(),α(Ǵ+ó+’ ‘+Ć+ó+ñ+ṽ+í+ś+ó+’!’)

Considerações Finais

Gostaria de parabenizar todos os competidores, em especial ao Ricardo Iramar por ter levado o troféu de campeão. E espero que possamos nos encontrar nos outros desafios que estão pra surgir (em breve).

Go Conviso!

Originalmente postado no Blog da Conviso Application Security – Siga-nos no Twitter @conviso Google+
About author

Articles

Uma equipe de profissionais, altamente conectados com as notícias, técnicas e informações sobre a segurança de aplicações.
Related posts
Segurança de Aplicação

Como Desenvolver Aplicações Com Segurança? Um guia inicial

Por que desenvolver com segurança? Seria muito bom se não precisássemos ter antivírus, que…
Read more
Code FightersMobileSegurança de Aplicação

Pré-testes Android: Conceitos básicos e uma introdução ao tema

Fazer um bom laboratório para testes de segurança em aplicações android pode ser uma tarefa…
Read more
NotíciasSegurança de Aplicação

Treinamento online e gratuito sobre Segurança de Aplicações: Conheça o AppSec Starter

A Conviso disponibilizou em seu canal de YouTube o treinamento AppSec Starter – um treinamento…
Read more

Deixe um comentário