Quebrando CAPTCHAs
CAPTCHAs (Completely Automated Public Turing test to tell Computers and Humans Apart“) são testes de Turing automatizados que tentam descobrir se você é um ser humano ou uma máquina. Em síntese os CAPTCHAs são aquelas imagenzinhas embaralhadas que aparecem quando você vai fazer um post em um blog, fazer consulta ou cadastro em alguns sites.
Por que utilizar? Ao utilizar um CAPTCHA em seu site, você evita que programas enviem spams, evita cadastros indevidos e tenta diminuir o uso informações automatizadas em outros sites. Um exemplo de uso é o meu formulário de contato.
Será que o CAPTCHA é realmente uma forma eficaz de descobrir se realmente é um ser humano que está realizando a operação? Se a gente consegue identificar o CAPTCHA, por que uma máquina não conseguiria? Um dos alunos meu perguntou se haveria uma forma de se realizar isso. A escolha foi o CAPTCHA da Receita Federal: http://www.receita.fazenda.gov.br/PessoaJuridica/CNPJ/cnpjreva/Cnpjreva_Solicitacao.asp
Por questões de segurança não irei disponibilizar o código, mas para fins acadêmicos, demonstrarei que é possível ultrapassar a barreira de alguns CAPTCHA. Alguns são fáceis, outros nem tanto.
Por exemplo, vamos ver o CAPTCHA do Facebook:
Esse CAPTCHA é monocromático, o que facilita um pouco e os ruídos existentes são uma bola de fundo e o texto torto. O do Orkut/Google só tem o texto torto:
Vamos ao da Receita Federal:
Esse CAPTCHA é muito mais complicado, há uma imagem de fundo que complica bastante, o texto está torto e são gerados vários tipos de CAPTCHAs diferentes, um com texto pontilhado, outro com um filtro esférico e esse da imagem com o texto torto em dois eixos. Vamos ao mais difícil. Fiz um programinha pra automatizar a tarefa.
O primeiro passo que eu fiz foi obter a imagem do CAPTCHA. Essa etapa é a mais fácil, o código para obter foi o seguinte:
Com essa imagem eu converto para uma BufferedImage e consigo pegar os valores de cada pixel pelo método getRGB(x,y) e posso montar minha matriz. Agora é só relembrar da época da Graduação e Mestrado: Geometria Analítica, Cálculo Numérico, Álgebra Linear, Computação Gráfica, Extração de Características, … No meu Mestrado trabalhei bastante com extração de características de imagens médicas: forma, cor, textura, identificação de cluster, … os conceitos são os mesmo, as características que mudam.
Os passos que executei para o texto torto e fonte forte foram:
- Utilizar um filtro de eliminação de ruídos. Implementei um filtro de mediana.
- Reduzir o espaço de cores da imagem.
- Utilizar uma transformação para “endireitar a imagem”. No caso utilizei duas funções cosseno. y=a*cos(b*x)+c e x=d*cos(e*f)+g. O mais difícil foi identificar os coeficientes. Fui na tentativa e erro. Ainda não está 100%.
- Dividir os caracteres. Poderia ser utilizado um k-means com k=4. Já que sempre são 4 letras.
- Extrair os caracteres e utilizar para treinamento no OCR. Realizar essas etapas com um número bom de letras. Obter o alfabeto todo seria o ideal.
- Aplicar o OCR identificando o texto.
Segue o programinha:
A primeira imagem é a original. A segunda é com o filtro de mediana aplicado. A terceira com a redução do espaço de cores. A quarta é com o “endireitamento” da imagem. E a quinta imagem é com a seleção de caracteres.
Para fontes pontilhadas o filtro de ruídos tem que ser um pouco mais suave. Ele erra bastante, mas também acerta. Cada operação dessa demora poucos milissegundos, como não há limite de tentativas e nem tempo de espera no site da Receita Federal, mesmo com vários erros a velocidade de descoberta do valor do CAPTCHA é muito baixa, poucos segundos. O mais demorado é o treinamento do OCR que é feito uma única vez. Para OCR utilizei a biblioteca JavaOCR.
Para demonstrar o “endireitamento” da imagem, que foi o que mais deu trabalho, pois foi na tentativa e erro, vou exibir uma imagem utilizando somente essa transformação, aí fica fácil entender o motivo das últimas imagens serem maiores. Eu poderia ter identificado pontos da imagem e feito interpolação de pontos para traçar uma curva, mas como é só pra conceito, fiz da forma que achei mais simples.
Criei um filtro de “efeito bandeira”
. Por isso que a imagem fica maior. Portanto, se você quer um sistema seguro, a primeira dica é, coloque um limite máximo de tentativas, obrigue uma espera de alguns minutos para a próxima tentativa e coloque algumas perguntas inteligentes além do CAPTCHA.















Fala Thiago!!
Muito bom velho,, ótimo hack =)
Parabéns pelo hack e pelo artigo.
Abraço,
As regras do registro.br que pedem dados como “Digite as consoantes em azul” não são sem razão portanto.
Dessa forma daria pra ver a pergunta.
if(pergunta.contains(“azul”) {
// Considerar somente os pixels que tem azul e variantes ou remover as outras cores da imagem.
}
Uma pergunta legal seria… “Digite as consoantes que tem a mesma cor que o céu”. Aí a base de perguntas teria que ser bem grande pra dificultar…
Estamos precisando de profissionais com a sua experiencia, se puder contactar pelo email, ficaria grato……luferipe@gmail.com
Show de bola, fodástico!!!
Parabéns!
Esse filtro de “efeito bandeira” mostrou um resultado impressionante… parece trabalhar absurdamente melhor do que as funções cosseno mostradas no inicio do post.
Poderia passar alguma informação adicional sobe esse filtro?
Obrigado, e parabéns pela pesquisa e publicação das informações.
O “efeito bandeira” é justamente a aplicação de um deslocamento dos pixels na horizontal e na vertical utilizando uma função cosseno. Se você olhar na borda da imagem, vai ver que o cosseno está ali, a diferença está que eu desloco primeiro na horizontal e depois na vertical.
Bom dia chara,
Muito bom artigo cara, parabéns…
Sou iniciante na área de programação, preciso descobrir como eu posso “pegar” esse captcha e trazer para usar em meu ERP, estou trabalhando em um projeto onde devo buscar informações da danfe no site da secretaria da fazenda, eles disponibilizam um web service, porém, ele só me retorna “AUTORIZADO O USO DA NF” ou “DENEGADO” não me retorna os dados da danfe, preciso então trazer as informações direto do site, porém, lá tem o tal do captcha pra atrapalhar a minha vida, como posso fazer para trazer esse captcha na hora da consulta da danfe…
Desde já agradeço.
E parabéns mais uma vez.
Basta você pegar o URL da imagem gerada e mostrá-la ao usuário. Depois você precisa fazer um post à url da action do form utilizado no captcha com a descrição do capctcha.
Oi estou participando de uma promoção por captcha, mais estou em desvantagem pois trabalho e nao tenho tempo para esta votando manualmente, gostaria de um programa que identificasse os captchas para mim, estou disposta a pagar bem, quLquer coisa me passa um email.
Olá Adelciana,
Creio que esse tipo de prática seja ilegal.
Fala ai grande..
otimo artigo.. estou querendo fazer um me deu o caminho das pedras..
Como sou developer JAVA e sou a favor do Software Livre..
Irei disponibilizar os fontes do meu programa para o pessoal aqui caso permita.
[]‘s
Sem problemas!
Tiago, boa noite.
cara, tem como vc disponibilizar o código que vc criou para tirar o fundo das imagens?
Estou querendo desenvolver um sistema para tratamento de fotos. Tenho alguns exemplos de códigos aqui, mas o seu é mais objetivo. Queria ver como ficaria o seu, para depois eu criar algo próprio.
muito obrigado desde ja
O código para tirar o fundo das imagens pode ser visto aqui.
Cara, existe possibilidade de você disponibilizar este código?
Sem chances…
se você olhar os outros posts no blog, vai ver que já tem metade do código disponível
Quanto vc quer?
Envie-me um e-mail…
Oi eu gostaria muito de saber se é possivél burlar os captchas? Por favor entre em contato comigo pelo meu mail!!! Obrigada
Boa noite.
Muito interessante o seu artigo.
Por favor, você poderia fornecer o código do “endireitamento” da imagem.
Obrigado.
O código desse filtro está disponível em:
http://www.thiagovespa.com.br/blog/2011/01/16/filtro-de-bandeira-para-imagens/
Amigo, estou precisando de um programa em ruby que consulte o número das operadoras retornando a qual ela pertence.
O site http://consultanumero.abr.net.br:8080/consultanumero/consulta/consultaSituacaoAtual!carregar.action
tem a possibilidade de consulta do número.
1º gostaria de saber se este captcha pode ser quebrado, em caso afirmativo quanto vc cobraria para passar as dicas para quebrá-lo
Sds
Jardel
Gostaria de tirar o CAPTCHA pois isso Acaba sendo incomodo Para nossos clientes pode nós ajudar?
thiago tenho um grante interece nesse programa, se porsivel entra em contato comigo. rebert_lobos@hotmail.com
Primeiramente, parabéns!!! Segundo, tem como dispobilizar ai o código exemplo? Obrigado.
É só dar uma consultada: http://www.thiagovespa.com.br/blog/tag/imagem/
gostaria de saber mais sobre esses captchers add meu imail ?
Gostaria de conversar com vc a respeito de seus serviços com relação ao captcha no site da receita, caso tenha interesse por favor entre em contato.
Massa! cara vc é fera!
Um abraço!
Favor entrar em contato comigo através do email.
Estou interessado neste programa.
Bom dia,
Thiago, tem interesse em um trabalho free lancer?
Caso tenha por favor, retorne o contato ou ligue para
12.8185.XXXX (telefone editado pelo adm do sistema)