Encontrei um artigo interessante postado por um usuário no Medium, ele começa analisando a quantidade de números que seriam necessários para digitar o código de segurança correto que é enviado para você (por celular ou email) quando solicita que "esqueceu" a senha de sua conta do Facebook.
Este código contém 6 dígitos, o que dá o volar de 10⁶ (1.000.000) combinações possíveis com os números de 0 a 9. O autor do artigo nota que a página mbasic.facebook.com possui menos segurança, ou seja o código gerado sempre é o mesmo para cada solicitação de esqueceu a senha depois de um certo número de solicitações. Resumindo se 1 milhão de pessoas fizer uma solicitação de esqueceu a senha em um curto período de tempo e ninguém usar o código para redefinir a senha, então a pessoa de número 1.000.001 que requisitar o código irá obter o código que alguém das um milhão recebeu e esse código será o código correto.
Assim há duas opções:
1- O Facebook irá duplicar o código para múltiplos usuários se o número de requisições for maior que um milhão.
2- Cada usuário recebe um código único e Facebook usa alguma forma divina para lidar com o caso em que 1 milhão de usuários solicitar um código, brinca o autor do texto original.
Ele então utilizou de 2 milhões de emails, na esperança da opção 1, receber códigos duplicados. Isso seria uma aplicação simples do "Princípio das casas dos pombos" (se n pombos devem ser postos em m casas, e se n > m, então pelo menos uma casa irá conter mais de um pombo - Wikipédia).
Sendo assim, basta escolher um código aleatório que siga esta regra: Inteiros menos de 100.000 têm uma menor probabilidade de ocorrência do que inteiros entre intervalos de 300.000 e 699.999 ou 800.000 e 999.999, que têm maior probabilidade de ocorrência. Mesmo assim essa regra não vale ouro, mas serve para os testes. Portanto, agora que você escolheu uma senha aleatória, utiliza-se de força bruta contra o lote de 2 milhões para verificar de qual ID (número de usuário) é associado com o código de acesso aleatório!
O bug é difícil de entender e sua execução difícil por ser em larga escala.
Como você envia 2 milhões de e-mails de redefinição de senha rapidamente, sem ser bloqueado?
Para enviar e-mails, você primeiramente precisa obter acesso a 2 milhões de nomes de usuários do Facebook. Hora do Web scraping (é uma técnica utilizando um software para extrair informações a partir de sites).
Ponto 1: Facebook IDs são geralmente de 15 dígitos, então o autor começou com 100.000.000.000.000 e então começou a fazer consultas no Facebook Graph API para verificar quais IDs eram válidas.
Tudo que você tem que fazer depois de ter certeza que o ID é válido é visitar o seguinte link: www.facebook.com/[ID AQUI] e então a url muda automaticamente de ID de usuário para nome de usuário. Assim o autor do artigo compilou todos esses dados em JSON que você pode encontrar aqui:
Link para 2 milhões de nomes de usuários do Facebook: https://drive.google.com/open?id=0B8yZwAxAk9KZTjhvbTdYZVNoY2s
Ponto 2: Afim de evitar que seu IP seja bloqueado devido aos inúmeros pedidos de 'esqueceu a senha', existem vários serviços online para burlar isso. No caso do autor do artigo, todo o tráfego de rede passou por um servidor proxy que ouviu as solicitações HTTP e arbitrariamente atribuiu um endereço IP para cada solicitação.
Ponto 3: é necessário simular o comportamento do usuário ao solicitar uma senha. Então utiliza-se o PhantomJS (Headless browser) e depois com um script multithreaded em Java, solicita o código de acesso para todos os usuários do arquivo JSON. Também é necessário cancelar todas as cadeias de User Agent para um navegador Chrome a partir http://www.useragentstring.com/pages/useragentstring.php?name=Chrome atribuindo ao exemplo PhantomJS.
Ponto 4: Tem uma versão gratuita do Google Compute Engine para hospedar os scripts em uma máquina virtual. Foi utilizado 8 VMs (12 cores/20 GB RAM cada) de 4 regiões diferentes e instanciado 180 PhantomJS instâncias por VM para a plena utilização da CPU.
Parte fácil, fazer brute force para adivinhar o código de segurança, são 2 milhões de IDs.
Então foi adivinhado o código de acesso de 6 dígitos (passcode 338625) usando a regra acima mencionada e o ataque de força bruta em todos os usuários no seguinte URL adicionando a ID após o "u" e o código de segurança depois de "n": www.beta.facebook.com/recover/password?u=…&n…
E como você pode visualizar na imagem acima, funcionou!
Próximo passo?
Ir novamente até www.beta.facebook.com/recover/password?u=[ID aqui]&n=[Código aqui] e então cair na página de redefinir senha.
Agora você tem acesso completo à conta de um usuário aleatório.
I may or may not post all the source code to my Github @endeavors — still deciding.Segundo o autor do artigo, talvez ele irá disponibilizar todo o código utilizado em sua página do Github.
Fonte: https://medium.com/@gurkiratsingh/how-i-could-have-hacked-multiple-facebook-accounts-d9d335188d9b
COMENTÁRIOS