Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Captcha CPF/CNPJ deprecativo. #21

Open
lucianozanita opened this issue Oct 23, 2017 · 74 comments
Open

Captcha CPF/CNPJ deprecativo. #21

lucianozanita opened this issue Oct 23, 2017 · 74 comments

Comments

@lucianozanita
Copy link

Olá, hoje 23/10/2017 a Receita federal passou a não utilizar mais o captcha padrão e começou a usar o recaptcha, o que inviabilizou o captcha usado anteriormente, saberia alguma forma de resolver este problema?

@kivervinicius
Copy link

O site deathbycaptcha promete quebrar mas não sei ainda como, vou dar uma pesquisada.

@FelipeCastello
Copy link

Existem serviços com anti-captcha.com e o 2captcha.com mas são pagos. Eles na verdade já fornecem a solução do captcha para vc automatizar o processo todo sem necessidade de interação do usuário, o que é bem interessante se vc estiver disposto a gastar algum dinheiro com o serviço.

O cpf-gratis/cnpj-gratis nunca foi automatizado desta forma, ele apenas repassava para o usuário final responder o captcha e receber os dados. O ideal para continuar com o projeto sem custo seria apenas repassar a validação do recatpcha para o usuário final validar. Tem só q descobrir como fazer isso pegando a sitekey/public key e devolvendo a g-recaptcha-response.

@kivervinicius
Copy link

kivervinicius commented Oct 23, 2017

Pelo site http://cpf.receita.fazenda.gov.br/situacao/default.asp ainda a consulta é realizada pelo captcha antigo.

@FelipeCastello
Copy link

No caso do CNPJ se vc clicar em "Captcha Sonoro" também volta para o antigo mas não temos como saber quanto tempo isso ainda deve ficar disponível.

http://www.receita.fazenda.gov.br/PessoaJuridica/CNPJ/cnpjreva/Cnpjreva_Solicitacao.asp

@kivervinicius
Copy link

kivervinicius commented Oct 23, 2017

Fazendo a consulta pelo link https://www.receita.fazenda.gov.br/Aplicacoes/SSL/ATCTA/CPF/ConsultaSituacao/ConsultaPublicaSonoro.asp ao clicar em consultar estão validando se você "ouviu o audio"(clicou no botão para escutar) após isso ele permite digitar o captcha e consultar. Mas como o @FelipeCastello falou não é garantido.

@faelp22
Copy link

faelp22 commented Oct 23, 2017

Olá pessoal

Também estou com esse probleminhas.

Sobre o CPF eles mudaram para o sistema de Captcha do Google é mais complicado.
Já o CNPJ notei o seguinte

url_antiga = "http://www.receita.fazenda.gov.br/pessoajuridica/cnpj/cnpjreva/Cnpjreva_Solicitacao2.asp" essa solicita agora para pessoa ouvir áudio.

O que notei foi que agora tem essa nova url http://www.receita.fazenda.gov.br/pessoajuridica/cnpj/cnpjreva/Cnpjreva_solicitacao3.asp

acredito que atualizando a url para essa nova já resolve o cnpj.

@FelipeCastello
Copy link

Eu tinha feito essa troca da URL aqui no sistema para testar o CNPJ (Cnpjreva_solicitacao3.asp). Até agora ta funcionando normalmente sem nenhuma alteração no código e aprece ser a melhor solução temporária.

Se alguém quiser se aventurar um pouco, já vi a funcionalidade que queremos em outro projeto (repassar o recaptcha para o usuário validar). O projeto é em Python e usa umas libs externas mas já deve dar um norte para seguir.

https://github.com/RocketMap/RocketMap
http://rocketmap.readthedocs.io/en/develop/first-run/captchas.html

Esse projeto da a opção de fazer os captchas manualmente pelo navegador ou de forma automática pelo 2captcha. Deve ser uma boa referência para ver como precisa ser tratado as requisições/Tokens do ReCaptcha

@andercrist
Copy link

Estou com o mesmo problema, alguém está tentando implementar o recaptcha da receita? Se eu puder ajudar em algo.

@100n0m3
Copy link

100n0m3 commented Oct 24, 2017

Outro caminho é usar a url mobile, que vem dentro do app da receita tanto pra cpf como cnpj

@kivervinicius
Copy link

qual url @100n0m3

@100n0m3
Copy link

100n0m3 commented Oct 24, 2017

Cara chegando em casa já posto aqui, a url e os parâmetros.

@andercrist
Copy link

Não seria interessante acertar com o recaptcha? O @FelipeCastello deixou algumas dicas sobre isso, ainda não encontrei uma forma de trazer o recaptcha(da receita) mostrar na página do usuário final.

@FelipeCastello
Copy link

Achei um princípio de explicação aqui de como pegar o sitekey e como funciona o ajax do recaptcha mas eles não entram no detalhe de como repassar ao user final (afinal é o serviço deles)

https://anticaptcha.atlassian.net/wiki/spaces/API/pages/9666575/Reproducing+Recaptcha+validation+without+digging+the+HTML+source

@kivervinicius
Copy link

@fazti o recaptcha atualmente é o captcha mais dificil de "burlar" devido que ao constante uso de um ip ele dificultar os desafios até o ponto de bloquea-lo.

@andercrist
Copy link

@kivervinicius Que coisa chata hein! O pessoal da receita podia liberar uma API para consulta usando o próprio captcha, da forma como estava, não era um problema, afinal, qual a diferença de uma consulta no site da receita e um outro site intermediando? No final tenho que ir na receita e consultar se o CPF é válido ou não.

@kivervinicius
Copy link

@fazti o problema é o abuso, por exemplo se nós estamos colocando em nosso sistema não é uma pessoa que está consultando e sim milhares, isso cria uma sobrecarga tremenda no serviço deles. Sou a favor de liberarem consulta via api por pagamento seria muito bom, pois precisamos deste tipo de serviços.

@andercrist
Copy link

@FelipeCastello Interessante, estou pesquisando aqui também alguma forma, mas pelo visto complicou :(

@100n0m3
Copy link

100n0m3 commented Oct 24, 2017

@fazti creio que fazem isso para redução na carga dos servidores afinal imagina o Brasil todo fazendo consultas o dia todo, também acho que deveria haver uma api algo assim de preferencia free para desenvolvedores ou empresas sei la, sei q ta complicado.

@FelipeCastello
Copy link

O ReCaptcha é um dos melhores que existem atualmente nesse serviço mas no nosso caso não queremos burlar o sistema deles com um robô "resolvendo" a validação. Queremos apenas poder repassar para o usuário dos nossos sites validarem.

Eu sei q isso é possível pq é exatamente o que esses serviços anti-captcha fazem. Eles pegam a sitekey e enviam para uma pessoa de verdade que é paga para resolver e repassam a resposta para o usuário.

@fazti Concordo! Não faz NENHUM sentido a Receita não fornecer algum tipo de API para consulta cadastral básica (pelo menos de empresas, CPF é um debate um pouco mais complexo em relação a privacidade), assim como não faz sentido o correios não fornecer uma api decente de consulta de CEP

@kivervinicius na questão de abuso entra a questão de limitações. Não precisa ser um API pública, pode fazer um cadastro para liberar uma chave de acesso. Até X consultas diárias por chave liberada, se quiser mais para ter um volume corporativo ai se cobre separado.

@100n0m3
Copy link

100n0m3 commented Oct 24, 2017

as alteraçoes do re-captcha vão muito alem do site da receita, foram praticamente todos os sites do governo, denatran, antt, receita, e por ai vai...

@andercrist
Copy link

@FelipeCastello concordo plenamente na cobrança de serviços excedentes, libera uma api pública e cobra os excedentes até para manter o serviço em pé.

@kivervinicius
Copy link

@100n0m3 geral ta sendo bloqueado, e em breve as brechas q encontramos serão corrigidas.

@100n0m3
Copy link

100n0m3 commented Oct 24, 2017

@kivervinicius então, acabei de olhar em um dos meus repositórios e adivinha, visita da serpro.

Site | Views | Unique visitors

mail.serpro.gov.br | 2 | 1

com ctz vão fechar tudo :/

@kivervinicius
Copy link

:(

@FelipeCastello
Copy link

Bloquear vc diz desativarem as URLs? Pq acho difícil eles conseguirem bloquear algo se conseguirmos passar o campo do recaptcha para o usuário final. Isso seria uma questão com a equipe do ReCaptcha.

@kivervinicius
Copy link

@FelipeCastello o recaptcha bloqueia muitas requisições do mesmo ip e não deixa resolver o captcha.

@faelp22
Copy link

faelp22 commented Oct 24, 2017

Eles lançaram uma API https://servicos.serpro.gov.br/api-gov/ acredito que estão fechando as portas mesmo pois esse serviço é pago, também acho que o que poderíamos fazer era repassar o reCAPTCHA para o cliente, fiz alguns testes mas me deparei com o problema de capturar o token de verificação do Google.

A nova estrutura de requisição:

idCheckedReCaptcha:
txtCPF:
txtDataNascimento:
g-recaptcha-response:

E para mim o problema é pegar o "g-recaptcha-response" até tentei simular colocando diretamente o reCAPTCHA no meu sistema mas ele valida meu domínio.

O problema seria simular o domínio da receita para o reCAPTCHA achar que ele está acessando pois achava de acesso é publica e com isso pegaria o token do reCAPTCHA e mandaria na nova estrutura de requisição da receita.

@kivervinicius
Copy link

@faelp22 o bom que é baratinho (sqn)

@FelipeCastello
Copy link

FelipeCastello commented Oct 24, 2017

Sempre existiu essa API deles o problema era que somente um grupo pequeno de pessoas/empresas podiam usar. Se não me falha a memória existia alguns pré-requisitos a serem preenchidos para vc poder contratar como comprovar que essas informações eram necessárias a sua atividade-fim (como bancos e financeiras que precisam fazer validação cadastral). Aparentemente eles deram uma nova cara ao serviço e não vi nenhuma menção a qualquer tipo de limitação de contratação (o que é bem interessante) mas a tabela de preços ta bem surreal e inviável para projetos pequenos.

@kivervinicius
Copy link

kivervinicius commented Nov 21, 2017

deve ta de marcação comigo kkk, vc não precisou modificar o user-agent do curl não?

kiver@kiver-pc  ~  curl --insecure -X POST movel01.receita.fazenda.gov.br/servicos-rfb/v2/ConsultaCNPJ/captcha/post
curl: (7) Failed to connect to movel01.receita.fazenda.gov.br port 80: Tempo esgotado para conexão

@100n0m3
Copy link

100n0m3 commented Nov 21, 2017

Não mudei nada como pode ver no comando, porem se for por em produção recomendo a mudança, pega da explicação que deixei no post assim vc não corre o risco de ser bloqueado etc..

@100n0m3
Copy link

100n0m3 commented Nov 21, 2017

vc esta esquecendo de por o https na url por isso não esta funcionando.

@andercrist
Copy link

Pessoal, testei também o CAPTCHA sonoro, digitando o captcha antigo que aparece funciona perfeitamente.

@andercrist
Copy link

@100n0m3 Você sabe qual user-agent o app deles usa? Seria interessante deixar como o app usa.

@andercrist
Copy link

@100n0m3 Tem a possibilidade de consultar CPF?

@kivervinicius
Copy link

@fazti ta funcionando mesmo, mas está oscilando.

@kivervinicius
Copy link

@100n0m3 poxa, q merda em. kkk vlw! Você sabe qual é a url para o cpf?

@100n0m3
Copy link

100n0m3 commented Nov 21, 2017

Vou pegar o user agent hora que chegar em casa, quanto a url de cpf ainda estou debugando o app deles, mas vai ficar massa pois não tem captcha na consulta de cpf, ou seja da pra ficar automático tipo um viacep

@kivervinicius
Copy link

@100n0m3 seria legal, estou usando o deathbycaptcha para quebrar o link sonoro, mas está caindo mto, e está dando ban muito rápido mesmo trocando o user-agent, estou querendo usar uma vpn para não banir o ip do server.

@kivervinicius
Copy link

@100n0m3 aparentemente a url é https://movel01.receita.fazenda.gov.br/servicos-rfb/v2/IRPF/cpf/consultar mas ainda não consegui fazer funcionar.

@100n0m3
Copy link

100n0m3 commented Nov 21, 2017

Sim a url esta correta o problema são os parâmetros, temos vários parâmetros e tem um hash q penso eu que seja a parte mais complicada para debugar pois o app gera um hash penso eu que seja do cpf talvez data e hora, que é enviado junto com o header do post, no arquivo SutacaoCadastral referencia o arquivo headers que por sua vez chama o arquivo hash mas esta em java e eu não manjo de java :/

@100n0m3
Copy link

100n0m3 commented Nov 21, 2017

e a nomenclatura das variáveis deles esta me deixando doido

@kivervinicius
Copy link

@100n0m3 eu programo em Java, gera um gist por favor que eu dou uma olhada

@kivervinicius
Copy link

Não estou conseguindo converter os .smali para um formato mais legível, assim que tiver uma posição retorno aqui.

@marciofornari
Copy link

Olá pessoal tudo bem? Então me deparei que estou precisando assim como vocês buscar as informações do CNPJ E CPF, estou usando o framework Laravel, e pelo que andei lendo aqui nos comentários está dificil de fazer essa integração pois a Receita não está disponibilizando isso certo? Vou ficar acompanhando aqui para ver se acham alguma outra solução. Obrigado

@garimpeirodouniverso
Copy link

Não sei se já tentaram, mas o endereço do Cnpjreva_Solicitacao3.asp está de pé ainda (se não me engano o código original usa o Cnpjreva_Solicitacao2.asp). Não sei até quando isso dura, mas pode servir de solução de contorno por enquanto...

PS: desculpe se já postaram isso, me perdi um pouco na discussão :P

@lucas0maia
Copy link

@kivervinicius ou @100n0m3 conseguiram alguma solução pro caso do CPF?
É possível gerar o token?

@brunochuck
Copy link

Alguém por ae ainda eu tenho uns aquivos para debugar e preciso de ajuda.

para consultar cpf

@100n0m3
Copy link

100n0m3 commented Mar 30, 2019

tenho uma api se quiser... me chama ae

@brunochuck
Copy link

tenho uma api se quiser... me chama ae

chamar no e-mail ?

@100n0m3
Copy link

100n0m3 commented Mar 30, 2019

kkkk boa, desatento meu, acostumado com o Whats...

Mas vamos la, tenho sim uma api de consulta inclusive te trago o comprovante.

@bydylo
Copy link

bydylo commented Jun 25, 2020

kkkk boa, desatento meu, acostumado com o Whats...

Mas vamos la, tenho sim uma api de consulta inclusive te trago o comprovante.

kkkk boa, desatento meu, acostumado com o Whats...

Mas vamos la, tenho sim uma api de consulta inclusive te trago o comprovante.

quanto ????

@100n0m3
Copy link

100n0m3 commented Jun 25, 2020

@bydylo ainda funciona acabei de testar, kkk, te mandei um email!.

@lucas0maia
Copy link

lucas0maia commented Jun 25, 2020 via email

@100n0m3
Copy link

100n0m3 commented Jun 26, 2020

@lucas0maia te mandei um email :) ve ae se chegou

@lucas0maia
Copy link

lucas0maia commented Jun 26, 2020 via email

@100n0m3
Copy link

100n0m3 commented Jun 26, 2020

kkk, acho q nao deu fica ai meu contato chama no zap 44-991559009 quem tiver interesse na consulta chama ae :)

@EduApps-CDG
Copy link

EduApps-CDG commented Feb 28, 2023

Boa noite, meus comparsas. Vim aqui compartilhar meu progresso na descoberta de uma API direta para consultas de CNPJ (demanda do trabalho).

Aliás, se puder me seguir no GitHub eu ficaria feliz. Estou tentando chegar ao 100.

Acabei percebendo não um mais dois links para consultar:

Link 1:

Utilizando descompilação, encontrei um link compatível com a antiga resposta.

Passo 1: Captcha

Request:

GET /servicos-rfb-apprfb-core/apprfb-core/obtercaptcha HTTP/1.1
Host: p-app-receita-federal.estaleiro.serpro.gov.br:443

PHP:

public static function getCaptchaFromMiniFazenda()
    {
        /**
         * Metodo GET
         * URL: captcha
         * 
         * retorno:
         * {
         *  "captcha": "...", //base64
         *  "audio": null, // Provavelmente não funciona
         *  "token": "...", //token do captcha
         *  "letras": "..." //letras selecionáveis do app
         * }
         */
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, "https://p-app-receita-federal.estaleiro.serpro.gov.br:443/servicos-rfb-apprfb-core/apprfb-core/obtercaptcha");
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
        
        $json = curl_exec($ch);
        curl_close($ch);

        return json_decode($json, true);
    }

Passo 2: Obter resultados

Request:

POST /servicos-rfb-apprfb-core/apprfb-core/obtercaptcha HTTP/1.1
Host: p-app-receita-federal.estaleiro.serpro.gov.br:443
token: Hash::generateHash("Sup3RbP4ssCr1t0grPhABr4sil", ???)
aplicativo: Pessoa Jurídica
versao: 6.0.1
dispositivo: Moto G Play
versao_app: 3.2
Content-Type: application/x-www-form-urlencoded

cnpj=XXXXXXXXX&token=[token]&resposta=[XXXX]

PHP:

//Pre requisito
<?php
//Pré-requisito
class Hash {
    //private static $ALGORITIMO_HASH = "HmacSHA1";
    private static $ALGORITIMO_HASH = "sha1"; //HmacSHA1

    function __constructor() {
    }

    // Esta função é a reescrita de Hash.generateHash do app (em Java)
    // Ela é passada como parâmetro para o header "token", porém requer
    // um parâmetro extra desconhecido...
    public static function generateHash(string $key, string $text) {
        try {
            $mac = hash_hmac('sha1', $text, $key, true);
            return bin2hex($mac);
        } catch (\Exception $e) {
            return null;
        }
    }

    public static function validateHash(string $key, string $text, string $hash) {
        $hash2 = self::generateHash($key, $text);
        return $hash2 === $hash;
    }
}

// retorna os dados do CNPJ
function fromMiniFazenda(string $token, string $capicci, string $cnpj)
    {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, self::$API_MINISTERIO_FAZENDA['consulta']);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, [
            'token' => Hash::generateHash("Sup3RbP4ssCr1t0grPhABr4sil", ???), //??? deve ser algo que resulta em ""44d4ba14482a7be2a495e73" (a primeira resposta deste post)
            'aplicativo' => 'Pessoa Jurídica',
            'plataforma' => 'Android',
            'versao' => '6.0.1',
            'dispositivo' => 'Moto G Play',
            'versao_app' => '3.2',
            'Content-Type' => 'application/x-www-form-urlencoded'
        ]);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([
            'cnpj' => $cnpj,
            'token' => $token,
            'resposta' => $capicci
        ]));

        $json = curl_exec($ch);
        curl_close($ch);

        echo $json;

        $instance = new CNPJ($cnpj, json_decode($json, true));

        return $instance;
    }

Link 2 (Captura de requests)

Abri um app para capturar as requests do app.
Consegui capturar uma vez, mas por algum motivo nas outras tentativas não foi registrado o request.

Passo 1: Captcha

Request:

GET /servicos-rfb-apprfb-core/apprfb-core/obtercaptcha HTTP/1.1
Host: p-app-receita-federal.estaleiro.serpro.gov.br:443

PHP:

public static function getCaptchaFromMiniFazenda()
    {
        /**
         * Metodo GET
         * URL: captcha
         * 
         * retorno:
         * {
         *  "captcha": "...", //base64
         *  "audio": null, // Provavelmente não funciona
         *  "token": "...", //token do captcha
         *  "letras": "..." //letras selecionáveis do app
         * }
         */
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, "https://p-app-receita-federal.estaleiro.serpro.gov.br:443/servicos-rfb-apprfb-core/apprfb-core/obtercaptcha");
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
        
        $json = curl_exec($ch);
        curl_close($ch);

        return json_decode($json, true);
    }

Passo 2: obter os dados

Este eu provavelmente não vou conseguir reproduzir, pois existe uma verificação se a url está sendo requisitada pelo app.

Link: https://p-app-receita-federal.estaleiro.serpro.gov.br:443/servicos-rfb-apprfb-cnpj/apprfb-cnpj/detalhe-empresa/[CNPJ SEM NUMERO]

Eis a print do request:
Imagem do WhatsApp de 2023-02-28 à(s) 16 19 08


O mais triste de isso tudo é o fato de SUPER PASS ser o código secreto por trás do dos Tokens.

Espero que isso ajude alguém a terminar o trabalho.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests