Skip to content

Instantly share code, notes, and snippets.

@qgustavor
Last active February 19, 2025 15:39
Show Gist options
  • Save qgustavor/d69da4f577a13743725a505dc1cb4bb8 to your computer and use it in GitHub Desktop.
Save qgustavor/d69da4f577a13743725a505dc1cb4bb8 to your computer and use it in GitHub Desktop.
Quebra o "captcha" da Secretaria de Segurança Pública do Governo de Goiás (SSP-GO)
// ==UserScript==
// @name Quebra o "captcha" da Secretaria de Segurança Pública do Governo de Goiás (SSP-GO)
// @namespace Violentmonkey Scripts
// @match https://raivirtual.ssp.go.gov.br/*
// @grant none
// @version 1.0
// @author qgustavor
// @description Quebra o "captcha" da Secretaria de Segurança Pública do Governo de Goiás (SSP-GO)
// ==/UserScript==
setInterval(() => {
// Pelo nome do elemento, eles usavam o Recaptcha, mas tiveram de parar de usar desde que ficou pago
const captchaEl = document.querySelector('#g-recaptcha-response')
if (!captchaEl || captchaEl.value) return
// Aí eles inventaram um captcha fraco que qualquer um consegue quebrar usando um pouco de processamento de imagem
// só que para a versão "acessível" eles, ao invés de gerar um MP3 no servidor, mandaram a resposta do captcha
// para a página criptografada usando AES e fizeram o navegador ler a resposta.
// Logo tudo o que é necessário para quebrar o captcha é decriptografar a resposta:
captchaEl.value = CryptoJS.AES.decrypt({
ciphertext: CryptoJS.enc.Base64.parse(document.querySelector('.img-captcha').src.split(';')[1])
}, CryptoJS.enc.Utf8.parse('123AB567TW012345'), {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
}).toString(CryptoJS.enc.Utf8)
// Fazendo os usuários desse site - os cidadãos do estado de Goiás - perderem tempo com um captcha idiota
// que não serve para nada e que pode ser quebrado com uma máquina mais rápido do que por uma pessoa.
// Sério, eles poderiam ter usado essa oportunidade para fazer um captcha que usa crowdsourcing para resolver
// problemas do estado de Goiás (algo que tenho experiência), não um captcha desses que só serve para tentar
// segurar bots mas que é mal implementado de tal forma que só segura script kiddies.
// Usaram ofuscação no JavaScript, como se isso segurasse alguma coisa: o que não falta na internet são técnicas
// para contornar ofuscação. Até mesmo botar um debugger em um loop para encher o saco de quem está usando um
// debugger (que foi a forma que peguei o código) é fácinho de contornar, só desativar o "pause on debugger statement"!
// Se o pessoal da SSP-GO ver esse código e quiser entrar em contato, beleza. Eu posso dar um monte de sugestões
// sobre como lidar com robôs, desde opções que não envolvem captchas (que uso em meus sites com sucesso), opções
// simples e baratas para o Recaptcha, além de sugestões de captchas que podem usar o tempo dos cidadãos de Goiás
// para projetos de crowdsourcing que resolvem problemas do próprio governo. Meu Signal está disponível no meu site.
}, 1000)
// O setInterval é para evitar usar um mutation observer, e como o é um intervalo rápido de processar, não é
// um código tão ruim quanto parece.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment