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

Implementando uma CI/CD Pipeline: Garantindo a Qualidade e a Segurança do Software

A princípio, no atual cenário de desenvolvimento de software, a velocidade e a qualidade na…
Read more
Segurança de Aplicação

Gerenciamento de Riscos de Segurança: Melhores Práticas e Processos

A princípio, o gerenciamento de riscos de segurança é um processo estratégico que envolve…
Read more
Code FightersSegurança de Aplicação

Como integrar o Semgrep no CI/CD e enviar os resultados para a Conviso Platform

Atualmente, é uma prática muito comum integrar verificações de segurança durante a fase de…
Read more

Deixe um comentário