chapeupreto / sinesp

:oncoming_automobile: API em PHP para consultar informações de veículos na base de dados do SINESP Cidadão
MIT License
143 stars 39 forks source link

API Retorna - Versão desatualizada. Favor atualizar aplicativo. #37

Open rmp1985 opened 5 years ago

rmp1985 commented 5 years ago

Bom dia,

Funcionou bem até aqui. A partir de hoje 02/07/2019 começou a retornar. "Versão desatualizada. Favor atualizar aplicativo."

O que será que mudou...?

elciocf commented 5 years ago

Devem ter mudado o secret novamente ='(

ritielmi commented 5 years ago

Sim. Funcionou muito bem até ontem. Hoje pela manhã parou. Vi que mudaram a url (https://cidadao.sinesp.gov.br/sinesp-cidadao/mobile/consultar-placa/v4). Fiz um teste com a url (https://cidadao.sinesp.gov.br/sinesp-cidadao/mobile/consultar-placa/v5) e retornou "mensagemRetorno":"Erro no processamento da consulta."( @elciocf Devem ter mudado o secret novamente)

elciocf commented 5 years ago

É triste ver um serviço tão útil ser "protegido" dessa forma ... tentei localizar o secret, mas sem sucesso... gerou mtos arquivos com dex2jar... e sem o "caminho das pedras" e alguma familiaridade anterior com o código dos cara ... fica difícil achar mesmo... vamos ter de aguardar um salvador rsrsrs

Pedroasilva commented 5 years ago

Deem uma olhada nesse discord. Lá o pessoal tá conversando sobre a correção. Pode ser que saia lá antes. https://discordapp.com/channels/403565711898968065/403565711898968067

Sorackb commented 5 years ago

@Pedroasilva não dá pra acessar essa sala do discord pelo link que você informou.

arivanbastos commented 5 years ago

@Pedroasilva também não consegui acessar o discord.

ritielmi commented 5 years ago

também não consegui acessar o discord.

giovanigenerali commented 5 years ago

discord fora do ar e muitos outros sites. problema na CloudFlare

Giovani Generali

On Tue, Jul 2, 2019, 10:50 AM riti_ notifications@github.com wrote:

também não consegui acessar o discord.

— You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub https://github.com/chapeupreto/sinesp/issues/37?email_source=notifications&email_token=AAAKDW4UMIME2RSXOIXEB6LP5NMKFA5CNFSM4H43DPO2YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGODZBKYFQ#issuecomment-507685910, or mute the thread https://github.com/notifications/unsubscribe-auth/AAAKDW4X644ISUNT6S5TWXDP5NMKFANCNFSM4H43DPOQ .

Pedroasilva commented 5 years ago

https://discordapp.com/invite/3shuzyT

eversonjoay commented 5 years ago

o que descobri até o momento: url mudou para /sinesp-cidadao/mobile/consultar-placa/v5. libs para o android mudaram de nome e secret gerando a chave do envelope diferente. foi adicionado no cabeçalho da requisição uma chave de autenticação "Authorization: Token ffwFPHnPFz8:APA91bGsyyaPKKq7gbrKfynrj5CBG8hV3X46KiQ1cGaZpJV8xAG2_Xu7TIXOc-WKmYbXPOvGsjQom1IVnftnm11VnKOq-uL9CASHRRTjzdDCVrfzaMa6GbiaCpoPwCXD9Bba22dJi-qv" foi adicionado uma chave no envelope da requisição, nesta chave está indo um código que também vai no authorization do cabeçalho, no meu caso ffwFPHnPFz8 e no cabeçalho "Authorization: Token ffwFPHnPFz8:APA..........". alguém tem alguma ideia do que seria essa chave e de onde está saindo este cabeçalho de autenticação?

Pedroasilva commented 5 years ago

Discord voltou, acompanhem

elciocf commented 5 years ago

Um resumo da situação atual... A SERPRO atualizou o aplicativo e agora a requisição precisa uma nova chave "Firebase Id" Isso dificulta, se não impossibilita, o acesso de terceiros que não o próprio aplicativo do SINESP... infelizmente...

lucazin commented 5 years ago

Já era.

Em ter, 2 de jul de 2019 às 15:10, elciocf notifications@github.com escreveu:

Um resumo da situação atual... A SERPRO atualizou o aplicativo e agora a requisição precisa uma nova chave "Firebase Id" Isso dificulta, se não impossibilita, o acesso de terceiros que não o próprio aplicativo do SINESP... infelizmente...

— You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub https://github.com/chapeupreto/sinesp/issues/37?email_source=notifications&email_token=AGXVDFXZVTNMWG3365QXVV3P5OKZNA5CNFSM4H43DPO2YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGODZCDQQI#issuecomment-507787329, or mute the thread https://github.com/notifications/unsubscribe-auth/AGXVDFWB2TOKXRFRGNGO7FDP5OKZNANCNFSM4H43DPOQ .

lucasschlottfeldt commented 5 years ago

Já era oficial?

Pedroasilva commented 5 years ago

https://cdn.discordapp.com/attachments/403565711898968067/595701215653003299/Captura_de_Tela_2019-07-02_as_16.43.28.png

carloscte commented 5 years ago

Alguém conseguiu? Obteve alguma novidade?

Pelo que eu pude ver, eles de fato estão utilizando o FirebaseInstanceId para obter o ID e o TOKEN, gerando assim o cabeçalho da requisição:

Authorization: Token TOKEN

Além da, como já foi citado, alteração da URL para https://cidadao.sinesp.gov.br/sinesp-cidadao/mobile/consultar-placa/v5 e alteração das libs para o android citadas por @eversonjjo

Vi também que isso não é algo ligado diretamente com a chave de assinatura, ou seja, se você descompilar e compilar novamente o Apk do SINESP e utilizar uma chave qualquer para assinar o pacote, o aplicativo vai continuar funcionando.

lucazin commented 5 years ago

FirebaseInstanceId pelo que vi nao tem como recuperar esse cara.

Um monte de app que disponibiliza esse servico da sinesp quebrou..pq nao acessa mais.

Em qua, 3 de jul de 2019 às 11:30, Carlos Henrique Fernandes Silva < notifications@github.com> escreveu:

Alguém conseguiu? Obteve alguma novidade?

Pelo que eu pude ver, eles de fato estão utilizando o FirebaseInstanceId para obter o ID e o TOKEN, gerando assim o cabeçalho da requisição:

Authorization: Token TOKEN

Vi também que isso não é algo ligado diretamente com a chave de assinatura, ou seja, se você descompilar e compilar novamente o Apk do SINESP e utilizar uma chave qualquer para assinar o pacote, o aplicativo vai continuar funcionando.

— You are receiving this because you commented. Reply to this email directly, view it on GitHub https://github.com/chapeupreto/sinesp/issues/37?email_source=notifications&email_token=AGXVDFSRFXZKRDEBTXZTJG3P5SZXTA5CNFSM4H43DPO2YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGODZEUJUY#issuecomment-508118227, or mute the thread https://github.com/notifications/unsubscribe-auth/AGXVDFXMWMV47AU2JUD6GZTP5SZXTANCNFSM4H43DPOQ .

carloshsjp commented 5 years ago

Estou buscando informações, mas ainda não obtive nada concreto. Alguém tem alguma informação nova?

jhonata-menezes commented 5 years ago

O que obtive até o momento

Segue exemplo de requisição

curl -X POST \
  https://cidadao.sinesp.gov.br/sinesp-cidadao/mobile/consultar-placa/v5 \
  -H 'Authorization: Token c9pw3ekWMRg:APA91bGAwox1JBa0xtC0a8JnrdZwFLBpLX7O9pB2LA9jsnENtYoHnlM4_wL8BXysYp6dHydk02vmyWrAXJo6KtfsPIZojZYxOfIXvP2yubbWc1LpJ-kKKixYZSoIuHU7JGpIP1213X92' \
  -H 'Content-Type: application/xml' \
  -H 'Postman-Token: 376347da-2aa7-43fe-b1bd-a47f1f59e291' \
  -H 'User-Agent: SinespCidadao / 3.0.2.1 CFNetwork / 758.2.8 Darwin / 15.0.0' \
  -H 'cache-control: no-cache' \
  -d '<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<v:Envelope xmlns:v="http://schemas.xmlsoap.org/soap/envelope/">
    <v:Header>
        <b>motorola XT1097</b>
        <c>ANDROID</c>
        <d>6.0</d>
        <e>4.7.4</e>
        <f>192.168.0.23</f>
        <g>0cdb52abd9dfebf425fd0bc356bd4e36fcfe8722</g>
        <h>0.0</h>
        <i>0.0</i>
        <k />
        <l>2019-07-03 14:39:45</l>
        <m>8797e74f0d6eb7b1ff3dc114d4aa12d3</m>
        <n>c9pw3ekWMRg</n>
    </v:Header>
    <v:Body>
        <n0:getStatus xmlns:n0="http://soap.ws.placa.service.sinesp.serpro.gov.br/">
            <a>GGG6699</a>
        </n0:getStatus>
    </v:Body>
</v:Envelope>'
carloscte commented 5 years ago

De forma resumida, para que a consulta volte a funcionar é necessário que o FirebaseInstanceId de qualquer Cliente (seja ele um aplicativo ou não) gere um ID e TOKEN com a mesma chave que o aplicativo do Sinesp gera. Isso é possível? Alguém sabe qual chave o FirebaseInstanceId usa ao ser inicializado em um aplicativo?

Obtendo esse ID e TOKEN, bastar montar a requisição que irá funcionar.

Acredito que não seja algo fácil e talvez seja impossível

carloshsjp commented 5 years ago

Boa tarde,

Fiz alguns testes aqui e pude perceber que a forma como o token é gerado foi alterado. Se eu passar a placa GGG6699, conforme o exemplo acima, com o token 8797e74f0d6eb7b1ff3dc114d4aa12d3, fixo no código, ele funciona.

return sprintf($xml,'0cdb52abd9dfebf425fd0bc356bd4e36fcfe8722',$this->latitude(),$this- >longitude(),strftime('%Y-%m-%d %H:%M:%S'),$this->placa);

Porém se eu passar o token gerado pela classe ($this->token()) ele dá erro

return sprintf($xml $this->token(),$this->latitude(),$this->longitude(),strftime('%Y-%m-%d %H:%M:%S'),$this->placa);

PLACA : GGG6699 NÃO FUNCIONA private function xml() { $xml = <<<EOX <?xml version="1.0" encoding="utf-8" standalone="yes" ?> motorola XT1097 ANDROID 6.0 4.7.4 192.168.0.23 %s %s %s %s 8797e74f0d6eb7b1ff3dc114d4aa12d3 c9pw3ekWMRg </v:Header> %s </n0:getStatus> </v:Body> </v:Envelope> EOX; return sprintf($xml,$this->token(),$this->latitude(),$this-`>longitude(),strftime('%Y-%m-%d %H:%M:%S'),$this->placa);

}

PLACA : GGG6699 FUNCIONA private function xml() { $xml = <<<EOX <?xml version="1.0" encoding="utf-8" standalone="yes" ?> motorola XT1097 ANDROID 6.0 4.7.4 192.168.0.23 %s %s %s %s 8797e74f0d6eb7b1ff3dc114d4aa12d3 c9pw3ekWMRg </v:Header> %s </n0:getStatus> </v:Body> </v:Envelope> EOX; return sprintf($xml,'0cdb52abd9dfebf425fd0bc356bd4e36fcfe8722',$this->latitude(),$this-`>longitude(),strftime('%Y-%m-%d %H:%M:%S'),$this->placa);

}

Na classe ele gera o token dessa forma:

private function token() { return hash_hmac('sha1', $this->placa, $this->placa . $this->secret); }

Creio que o secret abaixo tenha sido alterado.

private $secret = '#8.1.0#g8LzUadkEHs7mbRqbX5l';

@jhonata-menezes, como esse token 0cdb52abd9dfebf425fd0bc356bd4e36fcfe8722 foi gerado na tua requisição ?

jhonata-menezes commented 5 years ago

Boa tarde,

Fiz alguns testes aqui e pude perceber que a forma como o token é gerado foi alterado. Se eu passar a placa GGG6699, conforme o exemplo acima, com o token 8797e74f0d6eb7b1ff3dc114d4aa12d3, fixo no código, ele funciona.

return sprintf($xml,'0cdb52abd9dfebf425fd0bc356bd4e36fcfe8722',$this->latitude(),$this- >longitude(),strftime('%Y-%m-%d %H:%M:%S'),$this->placa);

Porém se eu passar o token gerado pela classe ($this->token()) ele dá erro

return sprintf($xml $this->token(),$this->latitude(),$this->longitude(),strftime('%Y-%m-%d %H:%M:%S'),$this->placa);

PLACA : GGG6699 NÃO FUNCIONA private function xml() { $xml = <<<EOX``](http://schemas.xmlsoap.org/soap/envelope/%22%3E%60) motorola XT1097 ANDROID 6.0 4.7.4 192.168.0.23 %s %s %s %s 8797e74f0d6eb7b1ff3dc114d4aa12d3 c9pw3ekWMRg </v:Header> %s </n0:getStatus> </v:Body> </v:Envelope> EOX;` return sprintf($xml,$this->token(),$this->latitude(),$this->longitude(),strftime('%Y-%m-%d %H:%M:%S'),$this->placa); ``

}

PLACA : GGG6699 FUNCIONA private function xml() { $xml = <<<EOX``](http://schemas.xmlsoap.org/soap/envelope/%22%3E%60) motorola XT1097 ANDROID 6.0 4.7.4 192.168.0.23 %s %s %s %s 8797e74f0d6eb7b1ff3dc114d4aa12d3 c9pw3ekWMRg </v:Header> %s </n0:getStatus> </v:Body> </v:Envelope> EOX;` return sprintf($xml,'0cdb52abd9dfebf425fd0bc356bd4e36fcfe8722',$this->latitude(),$this->longitude(),strftime('%Y-%m-%d %H:%M:%S'),$this->placa); ``

}

Na classe ele gera o token dessa forma:

private function token() { return hash_hmac('sha1', $this->placa, $this->placa . $this->secret); }

Creio que o secret abaixo tenha sido alterado.

private $secret = '#8.1.0#g8LzUadkEHs7mbRqbX5l';

@jhonata-menezes, como esse token 0cdb52abd9dfebf425fd0bc356bd4e36fcfe8722 foi gerado na tua requisição ?

Não gerei pela aplicação, apenas coloquei um proxy para monitorar as requisições do App da Sinesp

jhonata-menezes commented 5 years ago

Está difícil entender o processo, descompilei e criei um repositório, caso alguém tenha conseguido descompilar em um formato melhor por favor avise

Esse arquivo e linha pega o Token: https://github.com/jhonata-menezes/sinesp-app/blob/master/java/br/sources%5Cbr%5Cgov%5Csinesp%5Ccidadao%5Candroid%5Cg%5Ce.java#L107

Informações da conexão com o Firebase, retirado deste arquivo: https://github.com/jhonata-menezes/sinesp-app/blob/master/lib/res%5Cvalues%5Cstrings.xml#L55-L60

firebase_database_url: https://sinesp-178916.firebaseio.com gcm_defaultSenderId: 905942954488 google_api_key: AIzaSyAnV6TNrPwDB2gW-q0sMbSrkIFRsknK-QA google_app_id: 1:905942954488:android:d9d949bd7721de40 google_storage_bucket: sinesp-178916.appspot.com

lucazin commented 5 years ago

Os cara pode até tentar dificultar..mas sempre tem um jeito.

Mas agora deixar as Keys e Urls desse tipo exposto é coisa de principiante.

Em qua, 3 de jul de 2019 às 18:09, Jhonata Menezes notifications@github.com escreveu:

Está difícil entender o processo, descompilei e criei um repositório, caso alguém tenha conseguido descompilar em um formato melhor por favor avise

Esse arquivo e linha pega o Token: https://github.com/jhonata-menezes/sinesp-app/blob/master/java/br/sources%5Cbr%5Cgov%5Csinesp%5Ccidadao%5Candroid%5Cg%5Ce.java#L107

Informações da conexão com o Firebase, retirado deste arquivo: https://github.com/jhonata-menezes/sinesp-app/blob/master/lib/res%5Cvalues%5Cstrings.xml#L55-L60

firebase_database_url: https://sinesp-178916.firebaseio.com gcm_defaultSenderId: 905942954488 google_api_key: AIzaSyAnV6TNrPwDB2gW-q0sMbSrkIFRsknK-QA google_app_id: 1:905942954488:android:d9d949bd7721de40 google_storage_bucket: sinesp-178916.appspot.com

— You are receiving this because you commented. Reply to this email directly, view it on GitHub https://github.com/chapeupreto/sinesp/issues/37?email_source=notifications&email_token=AGXVDFTLMW5XGZSO2YMOM2TP5UISPA5CNFSM4H43DPO2YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGODZFV6HQ#issuecomment-508256030, or mute the thread https://github.com/notifications/unsubscribe-auth/AGXVDFVI5ABUJHJQTUXVOQLP5UISPANCNFSM4H43DPOQ .

jhonata-menezes commented 5 years ago

Os cara pode até tentar dificultar..mas sempre tem um jeito. Mas agora deixar as Keys e Urls desse tipo exposto é coisa de principiante. Em qua, 3 de jul de 2019 às 18:09, Jhonata Menezes notifications@github.com escreveu: Está difícil entender o processo, descompilei e criei um repositório, caso alguém tenha conseguido descompilar em um formato melhor por favor avise Esse arquivo e linha pega o Token: https://github.com/jhonata-menezes/sinesp-app/blob/master/java/br/sources%5Cbr%5Cgov%5Csinesp%5Ccidadao%5Candroid%5Cg%5Ce.java#L107 Informações da conexão com o Firebase, retirado deste arquivo: https://github.com/jhonata-menezes/sinesp-app/blob/master/lib/res%5Cvalues%5Cstrings.xml#L55-L60 firebase_database_url: https://sinesp-178916.firebaseio.com gcm_defaultSenderId: 905942954488 google_api_key: AIzaSyAnV6TNrPwDB2gW-q0sMbSrkIFRsknK-QA google_app_id: 1:905942954488:android:d9d949bd7721de40 google_storage_bucket: sinesp-178916.appspot.com — You are receiving this because you commented. Reply to this email directly, view it on GitHub <#37?email_source=notifications&email_token=AGXVDFTLMW5XGZSO2YMOM2TP5UISPA5CNFSM4H43DPO2YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGODZFV6HQ#issuecomment-508256030>, or mute the thread https://github.com/notifications/unsubscribe-auth/AGXVDFVI5ABUJHJQTUXVOQLP5UISPANCNFSM4H43DPOQ .

São chaves públicas do Firebase, não tem nada fora do normal.

jhonata-menezes commented 5 years ago

Tem uma solução para obter o token do Firebase, utilize essa biblioteca: https://github.com/MatthieuLemoine/push-receiver

E este SenderID: 905942954488

Acho que falta apenas uma etapa, como ele esta gerando o hash dentro do Header, ex.:

<g>0cdb52abd9dfebf425fd0bc356bd4e36fcfe8722</g>
eversonjoay commented 5 years ago

@jhonata-menezes esse push-receiver pra gerer o token, gera o FirebaseInstalId:FirebaseToken que está indo no cabeçalho da requisição? esta tag que você colocou é gerada pela biblioteca libsuperplacas.so, que alterou a chave secret que era usada, a $secret = '#8.1.0#g8LzUadkEHs7mbRqbX5l', ainda não procurei qual a nova

jhonata-menezes commented 5 years ago

@jhonata-menezes esse push-receiver pra gerer o token, gera o FirebaseInstalId:FirebaseToken que está indo no cabeçalho da requisição? esta tag que você colocou é gerada pela biblioteca libsuperplacas.so, que alterou a chave secret que era usada, a $secret = '#8.1.0#g8LzUadkEHs7mbRqbX5l', ainda não procurei qual a nova

SIm, o token que a lib gera é no mesmo formato do app.

O novo secret tenho quase certeza que utiliza este token, mas ainda sem resultados concretos. Seria uma combinação de: token + versão do so (6.0 ou 8.1.0, etc)

gamadoleo commented 5 years ago

alguma novidade? alguem gera o convite para o Discord?

darkromanced commented 5 years ago

Tem uma solução para obter o token do Firebase, utilize essa biblioteca: https://github.com/MatthieuLemoine/push-receiver

E este SenderID: 905942954488

Acho que falta apenas uma etapa, como ele esta gerando o hash dentro do Header, ex.:

<g>0cdb52abd9dfebf425fd0bc356bd4e36fcfe8722</g>

@jhonata-menezes esse push-receiver pra gerer o token, gera o FirebaseInstalId:FirebaseToken que está indo no cabeçalho da requisição? esta tag que você colocou é gerada pela biblioteca libsuperplacas.so, que alterou a chave secret que era usada, a $secret = '#8.1.0#g8LzUadkEHs7mbRqbX5l', ainda não procurei qual a nova

SIm, o token que a lib gera é no mesmo formato do app.

O novo secret tenho quase certeza que utiliza este token, mas ainda sem resultados concretos. Seria uma combinação de: token + versão do so (6.0 ou 8.1.0, etc)

criei uma conta rápida para participar da discussão aqui. o novo secret eu não acredito que utilize o token, a hash em questão é resultado de uma criptografia utilizando a secret e a placa do veículo em SHA-1. Quando eu fiz a analise da requisição eu fiz várias solicitações esperando que a hash tivesse alguma alteração e nada, só houve alteração após a mudança na placa, ou seja, a secret é um valor fixo e não variável, também não é um estudo concreto, ainda estou fazendo testes pois não tive tempo de analisar.

gamadoleo commented 5 years ago

Tem uma solução para obter o token do Firebase, utilize essa biblioteca: https://github.com/MatthieuLemoine/push-receiver E este SenderID: 905942954488 Acho que falta apenas uma etapa, como ele esta gerando o hash dentro do Header, ex.:

<g>0cdb52abd9dfebf425fd0bc356bd4e36fcfe8722</g>

@jhonata-menezes esse push-receiver pra gerer o token, gera o FirebaseInstalId:FirebaseToken que está indo no cabeçalho da requisição? esta tag que você colocou é gerada pela biblioteca libsuperplacas.so, que alterou a chave secret que era usada, a $secret = '#8.1.0#g8LzUadkEHs7mbRqbX5l', ainda não procurei qual a nova

SIm, o token que a lib gera é no mesmo formato do app. O novo secret tenho quase certeza que utiliza este token, mas ainda sem resultados concretos. Seria uma combinação de: token + versão do so (6.0 ou 8.1.0, etc)

criei uma conta rápida para participar da discussão aqui. o novo secret eu não acredito que utilize o token, a hash em questão é resultado de uma criptografia utilizando a secret e a placa do veículo em SHA-1. Quando eu fiz a analise da requisição eu fiz várias solicitações esperando que a hash tivesse alguma alteração e nada, só houve alteração após a mudança na placa, ou seja, a secret é um valor fixo e não variável, também não é um estudo concreto, ainda estou fazendo testes pois não tive tempo de analisar.

ao trocar a placa percebeu mudança apenas no token?

0cdb52abd9dfebf425fd0bc356bd4e36fcfe8722
darkromanced commented 5 years ago

0cdb52abd9dfebf425fd0bc356bd4e36fcfe8722

só há mudanças no token de autenticação, ou seja, o problema principal é a nova secret... eu ainda não consegui localizar a nova token, estou procurando.

jhonata-menezes commented 5 years ago

0cdb52abd9dfebf425fd0bc356bd4e36fcfe8722

só há mudanças no token de autenticação, ou seja, o problema principal é a nova secret... eu ainda não consegui localizar a nova token, estou procurando.

Fiz o seguinte teste, monitorando as requisições com charles proxy e realmente não deve utilizar o token. O hash gerado continua o mesmo

Requisição 1

curl -X POST \
  https://cidadao.sinesp.gov.br/sinesp-cidadao/mobile/consultar-placa/v5 \
  -H 'Authorization: Token diVchM49cn4:APA91bG39FF95gM8kQs3pnmkcbx-iV4ArgpngmkOsAupuktgXkOkYPd4BbmrSBjlpYBycyl1QvMD1QdFOhTE0-lg7za_leAAexYWNMAazMXJ6xfBltiEIF-nrTJTDTO-TU9pAYftagM1' \
  -H 'Content-Type: application/xml' \
  -H 'Postman-Token: c4fb99c9-93c3-4562-b476-81b1308d0e4e' \
  -H 'User-Agent: SinespCidadao / 3.0.2.1 CFNetwork / 758.2.8 Darwin / 15.0.0' \
  -H 'cache-control: no-cache' \
  -d '<v:Envelope xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:d="http://www.w3.org/2001/XMLSchema" xmlns:c="http://schemas.xmlsoap.org/soap/encoding/" xmlns:v="http://schemas.xmlsoap.org/soap/envelope/">
    <v:Header>
        <b>motorola XT1097</b>
        <c>ANDROID</c>
        <d>6.0</d>
        <e>4.7.4</e>
        <f>10.0.0.103</f>
        <g>c525197792a8b8dc2ef41776ff9b4fbc2b9ffbd7</g>
        <h>0.0</h>
        <i>0.0</i>
        <k />
        <l>2019-07-04 15:05:28</l>
        <m>8797e74f0d6eb7b1ff3dc114d4aa12d3</m>
        <n>diVchM49cn4</n>
    </v:Header>
    <v:Body>
        <n0:getStatus xmlns:n0="http://soap.ws.placa.service.sinesp.serpro.gov.br/">
            <a>GGG6669</a>
        </n0:getStatus>
    </v:Body>
</v:Envelope>'

Requisição 2 (cache e dados do app limpos)

curl -X POST \
  https://cidadao.sinesp.gov.br/sinesp-cidadao/mobile/consultar-placa/v5 \
  -H 'Authorization: Token c6pqRaVqvnA:APA91bEo7hwUPXKqsZbnTGr-gbxR4RrHNngWKiOTRvhRF5FEcBtto74uzHNLGd9uWeF7nKgIqZ6l43nKdRPh0ngna7gkCDNg_mih4kjIa8g41p68mPkmtd4KOKgNjZgIQR83jfm6Um6g' \
  -H 'Content-Type: application/xml' \
  -H 'Postman-Token: ece28862-1b55-48c5-bafa-15315dc2bd85' \
  -H 'User-Agent: SinespCidadao / 3.0.2.1 CFNetwork / 758.2.8 Darwin / 15.0.0' \
  -H 'cache-control: no-cache' \
  -d '<v:Envelope xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:d="http://www.w3.org/2001/XMLSchema" xmlns:c="http://schemas.xmlsoap.org/soap/encoding/" xmlns:v="http://schemas.xmlsoap.org/soap/envelope/">
    <v:Header>
        <b>motorola XT1097</b>
        <c>ANDROID</c>
        <d>6.0</d>
        <e>4.7.4</e>
        <f>10.0.0.103</f>
        <g>c525197792a8b8dc2ef41776ff9b4fbc2b9ffbd7</g>
        <h>0.0</h>
        <i>0.0</i>
        <k />
        <l>2019-07-04 15:59:19</l>
        <m>8797e74f0d6eb7b1ff3dc114d4aa12d3</m>
        <n>c6pqRaVqvnA</n>
    </v:Header>
    <v:Body>
        <n0:getStatus xmlns:n0="http://soap.ws.placa.service.sinesp.serpro.gov.br/">
            <a>GGG6669</a>
        </n0:getStatus>
    </v:Body>
</v:Envelope>'
darkromanced commented 5 years ago

0cdb52abd9dfebf425fd0bc356bd4e36fcfe8722

só há mudanças no token de autenticação, ou seja, o problema principal é a nova secret... eu ainda não consegui localizar a nova token, estou procurando.

Fiz o seguinte teste, monitorando as requisições com charles proxy e realmente não deve utilizar o token. O hash gerado continua o mesmo

Requisição 1

curl -X POST \
  https://cidadao.sinesp.gov.br/sinesp-cidadao/mobile/consultar-placa/v5 \
  -H 'Authorization: Token diVchM49cn4:APA91bG39FF95gM8kQs3pnmkcbx-iV4ArgpngmkOsAupuktgXkOkYPd4BbmrSBjlpYBycyl1QvMD1QdFOhTE0-lg7za_leAAexYWNMAazMXJ6xfBltiEIF-nrTJTDTO-TU9pAYftagM1' \
  -H 'Content-Type: application/xml' \
  -H 'Postman-Token: c4fb99c9-93c3-4562-b476-81b1308d0e4e' \
  -H 'User-Agent: SinespCidadao / 3.0.2.1 CFNetwork / 758.2.8 Darwin / 15.0.0' \
  -H 'cache-control: no-cache' \
  -d '<v:Envelope xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:d="http://www.w3.org/2001/XMLSchema" xmlns:c="http://schemas.xmlsoap.org/soap/encoding/" xmlns:v="http://schemas.xmlsoap.org/soap/envelope/">
  <v:Header>
      <b>motorola XT1097</b>
      <c>ANDROID</c>
      <d>6.0</d>
      <e>4.7.4</e>
      <f>10.0.0.103</f>
      <g>c525197792a8b8dc2ef41776ff9b4fbc2b9ffbd7</g>
      <h>0.0</h>
      <i>0.0</i>
      <k />
      <l>2019-07-04 15:05:28</l>
      <m>8797e74f0d6eb7b1ff3dc114d4aa12d3</m>
      <n>diVchM49cn4</n>
  </v:Header>
  <v:Body>
      <n0:getStatus xmlns:n0="http://soap.ws.placa.service.sinesp.serpro.gov.br/">
          <a>GGG6669</a>
      </n0:getStatus>
  </v:Body>
</v:Envelope>'

Requisição 2 (cache e dados do app limpos)

curl -X POST \
  https://cidadao.sinesp.gov.br/sinesp-cidadao/mobile/consultar-placa/v5 \
  -H 'Authorization: Token c6pqRaVqvnA:APA91bEo7hwUPXKqsZbnTGr-gbxR4RrHNngWKiOTRvhRF5FEcBtto74uzHNLGd9uWeF7nKgIqZ6l43nKdRPh0ngna7gkCDNg_mih4kjIa8g41p68mPkmtd4KOKgNjZgIQR83jfm6Um6g' \
  -H 'Content-Type: application/xml' \
  -H 'Postman-Token: ece28862-1b55-48c5-bafa-15315dc2bd85' \
  -H 'User-Agent: SinespCidadao / 3.0.2.1 CFNetwork / 758.2.8 Darwin / 15.0.0' \
  -H 'cache-control: no-cache' \
  -d '<v:Envelope xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:d="http://www.w3.org/2001/XMLSchema" xmlns:c="http://schemas.xmlsoap.org/soap/encoding/" xmlns:v="http://schemas.xmlsoap.org/soap/envelope/">
  <v:Header>
      <b>motorola XT1097</b>
      <c>ANDROID</c>
      <d>6.0</d>
      <e>4.7.4</e>
      <f>10.0.0.103</f>
      <g>c525197792a8b8dc2ef41776ff9b4fbc2b9ffbd7</g>
      <h>0.0</h>
      <i>0.0</i>
      <k />
      <l>2019-07-04 15:59:19</l>
      <m>8797e74f0d6eb7b1ff3dc114d4aa12d3</m>
      <n>c6pqRaVqvnA</n>
  </v:Header>
  <v:Body>
      <n0:getStatus xmlns:n0="http://soap.ws.placa.service.sinesp.serpro.gov.br/">
          <a>GGG6669</a>
      </n0:getStatus>
  </v:Body>
</v:Envelope>'

Eu consegui reproduzir a função que criptografa, realmente funciona do jeito que eu já havia falado, a placa é envelopada com uma chave (secret fixa), o resultado é uma hash do tipo SHA-1, o servidor recebe essa hash e utiliza o mesmo algorítimo para comparar as hash, se estiver tudo certo ele libera a informação. A questão agora é, qual é a nova secret para fazer a criptografia fora e compor a requisição. E muito obrigado pela biblioteca foi de grande utilidade para o token de autenticação...

theclanks commented 5 years ago

Cara, não sei se vai ajudar, mas parece que o token e o vem dessa função no APK (Java) https://firebase.google.com/docs/reference/android/com/google/firebase/iid/InstanceIdResult.html?hl=pt-br n = getId () Authorization: Token = getToken ()

darkromanced commented 5 years ago

Cara, não sei se vai ajudar, mas parece que o token e o vem dessa função no APK (Java) https://firebase.google.com/docs/reference/android/com/google/firebase/iid/InstanceIdResult.html?hl=pt-br n = getId () Authorization: Token = getToken ()

O token a biblioteca disponibilizada pelo Jhonata já resolve. Agora falta achar a secret, já sabemos que é uma chave fixa e que ela se forma antes de enviar a requisição (dentro da aplicação), ela é necessária para criar uma hash aceita pelo servidor, pois sem ela ou com ela errada o resultado sera uma hash diferente da esperada pelo servidor.

theclanks commented 5 years ago

Você diz a secret para envelopar a placa?

darkromanced commented 5 years ago

Você diz a secret para envelopar a placa?

exato, você já conseguiu encontrar a nova?

theclanks commented 5 years ago

Na verdade parece ser um algorítmo

https://paste.proxy.sh/?52fb95d704d53f52#sIL0sWE+FLnXfS/qpaDLA3swVk8cyKJD0A4fplEXW14=

gamadoleo commented 5 years ago

não sei se ajuda mas encontrei uma função que recebe duas string e gera algum tipo de hash sha porem não conseguir localizar nenhum local que chame ela

https://pastebin.com/bEeDNCiV

darkromanced commented 5 years ago

Na verdade parece ser um algorítmo

https://paste.proxy.sh/?52fb95d704d53f52#sIL0sWE+FLnXfS/qpaDLA3swVk8cyKJD0A4fplEXW14=

sim é um algorítimo mas não creio que misture base64, visto que a criptografia aplicada é uma Hmac SHA-1

darkromanced commented 5 years ago

não sei se ajuda mas encontrei uma função que recebe duas string e gera algum tipo de hash sha porem não conseguir localizar nenhum local que chame ela

https://pastebin.com/bEeDNCiV

isso aqui já é parte de algo, estou analisando...

darkromanced commented 5 years ago

quem puder também ajuda a encontrar essa secret, só falta ela pra gente fazer a manutenção da biblioteca, toda a ajuda é bem vinda.

jhonata-menezes commented 5 years ago

não sei se ajuda mas encontrei uma função que recebe duas string e gera algum tipo de hash sha porem não conseguir localizar nenhum local que chame ela

https://pastebin.com/bEeDNCiV

Decompilei o app e recompilei colocando log, não passou por esse método, to testando alguns metodos possiveis para ver onde acontece a geração desse hash

jhonata-menezes commented 5 years ago

Não consegui chegar ao resultado final, mas consegui essas informações

https://gist.github.com/jhonata-menezes/c934ff0dfd06486d5a9e4d74355635c4#file-fragmentconsulta-java-L322-L323

utilizei a placa: GGG6669 nome das variaveis e conteudo

sb2 = GGG6669 FragmentConsulta.this.b(sb2) = xSUZd5KouNwu9Bd2/5tPvCuf+9dp retorno de base64ToHex : c525197792a8b8dc2ef41776ff9b4fbc2b9ffbd7

maycon1038 commented 5 years ago

de onde vc tirou esse resultado xSUZd5KouNwu9Bd2/5tPvCuf+9dp?

jhonata-menezes commented 5 years ago

de onde vc tirou esse resultado xSUZd5KouNwu9Bd2/5tPvCuf+9dp?

Descompilando, colocando Log nas strings e compilando novamente. No momento não consigo dar continuidade, mas estamos próximo.

maycon1038 commented 5 years ago

entendi, falta só descobrir como gerar esse resultado xSUZd5KouNwu9Bd2/5tPvCuf+9dp depois pode gerar o token usando esse código

 String str = "xSUZd5KouNwu9Bd2/5tPvCuf+9dp";

 base64ToHex(str);
  public static String base64ToHex(String str) {
    String b2 = b(Base64.decode(str, 0));
    if (b2.length() > 40) {
        b2 = b2.substring(0, 40);
    }
    return b2.toLowerCase();
   }
    public static String b(byte[] bArr) {
    char[] cArr = new char[(bArr.length * 2)];
    for (int i = 0; i < bArr.length; i++) {
        int b2 =  bArr[i] & 255;
        int i2 = i * 2;
        char[] cArr2 = a;
        cArr[i2] = cArr2[b2 >>> 4];
        cArr[i2 + 1] = cArr2[b2 & 15];

      }

    return new String(cArr);
}
jhonata-menezes commented 5 years ago

Identifiquei onde esta fazendo o hash, esta dentro do libsuperplacas.so uma biblioteca compartilhada. No arquivo FragmentConsulta.java ele carrega a biblioteca - https://gist.github.com/jhonata-menezes/c934ff0dfd06486d5a9e4d74355635c4#file-fragmentconsulta-java-L176-L178

Esta assinatura é como deve ser chamado dentro do Java public native String b(String str); - https://gist.github.com/jhonata-menezes/c934ff0dfd06486d5a9e4d74355635c4#file-fragmentconsulta-java-L196

Tentei executar no linux esse código e com a libsuperplacas.so na mesma pasta, mas não obtive sucesso

public class Load {
    static {
        System.loadLibrary("superplacas");
    }
    public native String b(String str);
    public static void main(String[] args){
    System.out.println("Hello World");
        Load l = new Load();
        System.out.println(l.b("GGG6669"));
    }
}

Tentando ver a implementação no libsuperplacas.so da para perceber que ele usa sha1. Mas tem que ser analisado com mais calma.

Caso alguém queira inspecionar o conteúdo do .so - https://onlinedisassembler.com/odaweb/LaVAgEWf

eversonjoay commented 5 years ago

Conseguiram gerar a nova chave pro secret no Discord, continua no formato #VersaoAndroid#Chave a chave agora é 0KnlVSWHxOih3zKXBWlo

8.1.0#0KnlVSWHxOih3zKXBWlo