Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Hackeando a votação do BBB com Python

Hackeando a votação do BBB com Python

:)

Diógenes Fernandes

May 30, 2020
Tweet

More Decks by Diógenes Fernandes

Other Decks in Programming

Transcript

  1. Hackeando a votação Hackeando a votação do Big Brother Brasil

    do Big Brother Brasil / Diógenes Fernandes @diofeher
  2. $whoami $whoami Jogo na equipe desde Fev/2018 Eng. de Segurança

    na Posto sobre programação / segurança no FireShell MessageBird Youtube
  3. Login no Selenium Login no Selenium const login = async

    (page, email, password) => { page.goto(links.globoLoginURL, { waitUntil: "networkidle2" }); await page.waitForSelector('#login'); await page.type('#login', email); await page.type('#password', password); await page.click('[class="button ng-scope"]'); }
  4. Baixando as imagens de captcha Baixando as imagens de captcha

    (hook) (hook) if (hookUrl.startsWith(links.captchaURL)) { const res = await response.json(); const { symbol: icon, image } = res.data; fs.writeFile( `./src/images/${icon}.png`, image, "base64", (err) => {}); await votar(page, icon); }
  5. Chamando o script em python Chamando o script em python

    childProcess.execSync( `python ./src/compare_images.py "${iconText}"` )
  6. Match Match matcher = cv2.xfeatures2d.SIFT_create(nfeatures=100) kp1, des1 = matcher.detectAndCompute(img1,None) kp2,

    des2 = matcher.detectAndCompute(img2,None) bf = cv2.BFMatcher() matches = bf.match(des1, des2) matches = sorted(matches, key=lambda val: val.distance) score = sum([i.distance for i in matches])
  7. Problemas? Problemas? O que acontece se as classes CSS ou

    o HTML mudam? E se eu quiser escalar? (Muitas instâncias do Chromium ao mesmo tempo) Bugs estranhos no DOM - Puppeteer
  8. Requisição ao servidor de votação Requisição ao servidor de votação

    POOL = '9489daaa-15ee-4a2e-8e8d-22391a58e23c' ROYALE_URL = 'royale.globo.com' response = self.session.post( f'https://{ROYALE_URL}/polls/{POOL}/session', params=params, headers=headers ) response_data = response.json() self.symbol = response_data['data']['symbol'] self.captchaSessionToken = response_data['sessionToken']
  9. Requisição ao servidor de captcha Requisição ao servidor de captcha

    response = self.session.post( 'https://captcha.globo.com/api/challenge/generate', params=params, headers=headers ) response_data = response.json() self.symbol = response_data['data']['symbol'] self.captchaSessionToken = response_data['sessionToken']
  10. Proof of Work (Prova de Trabalho) Proof of Work (Prova

    de Trabalho) break_pow('FIKHSU3LH2JSJK7VJHTVHVZDQM;5', 5) == 379107
  11. Proof of Work (Prova de Trabalho) Proof of Work (Prova

    de Trabalho) def break_pow(hashcash, zeroes): match = "0" * int(zeroes) count = 0 while True: count += 1 h = hashlib.sha1(f'{hashcash}{count}'.encode('utf-8')) if h.hexdigest().startswith(match): return count
  12. Concorrência - Manager Concorrência - Manager class AccountManager(object): self.accounts =

    accs self.q = Queue(maxsize=MAX_CONNS) def run(self): t1 = Thread( target=consumer, args=(self.q, self.accounts, self.participant) ); t1.start(); for _, creds in self.accounts.items(): t2 = Thread( target=producer, args=(self.q, creds, self.participant) ) t2.start()
  13. Concorrência - Produtor Concorrência - Produtor def producer(out_q, data, participant):

    username = data['username'] password = data['password'] semaphore.acquire() try: bot = UserBot(username, password, participant) bot.run() except Exception as e: print(f"{Fore.RED} Teve erro em {username}. {e} Testando com
  14. Concorrência - Consumidor Concorrência - Consumidor def consumer(in_q, accounts, participant):

    while True: username = in_q.get() accounts[username]['timestamp'] = datetime.datetime.now() for username, creds in accounts.items(): diff = datetime.datetime.now() - creds['timestamp'] if diff.seconds > RETRY_TIME: Thread( target=producer, args=(in_q, creds, participant) ).start()
  15. Desvantagens? Desvantagens? Engenharia Reversa de todo o código front-end Qualquer

    pequena mudança na arquitetura quebra o código Instalação complicada Trabalhoso de distribuir (build do instalador Windows) Alcance pequeno por ser mais técnico