Skip to content
This repository has been archived by the owner on Feb 12, 2024. It is now read-only.

Falha ao autenticar requisição #53

Closed
ferezini opened this issue Jul 4, 2023 · 61 comments
Closed

Falha ao autenticar requisição #53

ferezini opened this issue Jul 4, 2023 · 61 comments

Comments

@ferezini
Copy link

ferezini commented Jul 4, 2023

Aparentemente o erro da semana retrasada retornou, provavelmente aquele token expirou.

@tegila
Copy link

tegila commented Jul 4, 2023

Error: Falha ao autenticar requisição

@jhowbhz
Copy link
Contributor

jhowbhz commented Jul 4, 2023

O token mais longo que consegui gerar foi esse

{
  "requestToken": "YW5kcm9pZDtici5jb20uY29ycmVpb3MucHJlYXRlbmRpbWVudG87RjMyRTI5OTc2NzA5MzU5ODU5RTBCOTdGNkY4QTQ4M0I5Qjk1MzU3ODs1LjEuMTQ=",
  "data": "05/07/2023 00:00:06",
  "sign": "79d6f2e24946a01753cfb2b2b7c67fb4"
}

@ferezini
Copy link
Author

ferezini commented Jul 5, 2023

@jhowbhz n consegui usar seu token, dá o msm erro.

@jhowbhz
Copy link
Contributor

jhowbhz commented Jul 5, 2023

@jhowbhz n consegui usar seu token, dá o msm erro.

Uai, eu acabei de usar aqui normalmente.

image

@luanbatistadev
Copy link

O token mais longo que consegui gerar foi esse

{
  "requestToken": "YW5kcm9pZDtici5jb20uY29ycmVpb3MucHJlYXRlbmRpbWVudG87RjMyRTI5OTc2NzA5MzU5ODU5RTBCOTdGNkY4QTQ4M0I5Qjk1MzU3ODs1LjEuMTQ=",
  "data": "05/07/2023 00:00:06",
  "sign": "79d6f2e24946a01753cfb2b2b7c67fb4"
}

como vc consegue gerar isso?

@jhowbhz
Copy link
Contributor

jhowbhz commented Jul 5, 2023

O token mais longo que consegui gerar foi esse

{
  "requestToken": "YW5kcm9pZDtici5jb20uY29ycmVpb3MucHJlYXRlbmRpbWVudG87RjMyRTI5OTc2NzA5MzU5ODU5RTBCOTdGNkY4QTQ4M0I5Qjk1MzU3ODs1LjEuMTQ=",
  "data": "05/07/2023 00:00:06",
  "sign": "79d6f2e24946a01753cfb2b2b7c67fb4"
}

como vc consegue gerar isso?

Eu consegui usando o proprio APP dos correios, adiantando a hora do Relógio do celular até saber qual era o maximo permitido.

Ontem eu achei também a funcao que gera esse código, mas nao conseguir entender, pois nao sou dev java.

@ferezini
Copy link
Author

ferezini commented Jul 5, 2023

@jhowbhz n consegui usar seu token, dá o msm erro.

Uai, eu acabei de usar aqui normalmente.

image

Desconsidere, consegui acessar faltava o Header, mas via código eu consegui acessar tb. Sobre o código java não consegue disponibilizar para nós? talvez alguém aqui entenda

@jhowbhz
Copy link
Contributor

jhowbhz commented Jul 5, 2023

@jhowbhz n consegui usar seu token, dá o msm erro.

Uai, eu acabei de usar aqui normalmente.
image

Desconsidere, consegui acessar faltava o Header, mas via código eu consegui acessar tb. Sobre o código java não consegue disponibilizar para nós? talvez alguém aqui entenda

A parte que eu descompilei é a seguinte: não se é exatamente essa parte, mas foi o mais proximo que eu encontrei.

O código abaixo foi retirado da ultima versao do APK

public int hashCode() {
        String str = this.f12310a;
        int hashCode = str == null ? 0 : str.hashCode();
        long j9 = this.f12311b;
        int i10 = (((hashCode ^ 1000003) * 1000003) ^ ((int) (j9 ^ (j9 >>> 32)))) * 1000003;
        f.b bVar = this.f12312c;
        return i10 ^ (bVar != null ? bVar.hashCode() : 0);
    }

public String toString() {
      return "TokenResult{token=" + this.f12310a + ", tokenExpirationTimestamp=" + this.f12311b + ", responseCode=" + this.f12312c + "}";
    }

Pedi o GPT para me explicar mais ou menos o que é esse código, veja o que ele disse:

O código fornecido não gera um token. Em vez disso, os métodos hashCode() e toString() são implementações padrão usadas para gerar um valor de hash e uma representação de string de um objeto em Java.

O método hashCode() é usado para gerar um valor único de hash para o objeto com base em seus atributos. Nesse caso, ele está calculando um valor de hash combinando o hash do atributo f12310a (convertido em um inteiro usando hashCode()) com o hash do atributo f12311b (convertido em um inteiro de 64 bits).

O método toString() retorna uma representação em string do objeto. Nesse caso, ele está concatenando os valores dos atributos f12310a, f12311b e f12312c em uma string formatada.

Portanto, esses métodos são usados para calcular o hash e fornecer uma representação em string de um objeto da classe TokenResult, mas não geram um token real.

@ferezini
Copy link
Author

ferezini commented Jul 5, 2023

Acho que precisaria saber também como são valorezidas as variáveis f12310a, f12310b e f12310c

@jhowbhz
Copy link
Contributor

jhowbhz commented Jul 5, 2023

f12310a

Essa é a classe completa.

package m6;

import m6.f;

/* loaded from: classes.dex */
final class b extends f {

    /* renamed from: a  reason: collision with root package name */
    private final String f12310a;

    /* renamed from: b  reason: collision with root package name */
    private final long f12311b;

    /* renamed from: c  reason: collision with root package name */
    private final f.b f12312c;

    /* renamed from: m6.b$b  reason: collision with other inner class name */
    /* loaded from: classes.dex */
    static final class C0154b extends f.a {

        /* renamed from: a  reason: collision with root package name */
        private String f12313a;

        /* renamed from: b  reason: collision with root package name */
        private Long f12314b;

        /* renamed from: c  reason: collision with root package name */
        private f.b f12315c;

        @Override // m6.f.a
        public f a() {
            String str = "";
            if (this.f12314b == null) {
                str = " tokenExpirationTimestamp";
            }
            if (str.isEmpty()) {
                return new b(this.f12313a, this.f12314b.longValue(), this.f12315c);
            }
            throw new IllegalStateException("Missing required properties:" + str);
        }

        @Override // m6.f.a
        public f.a b(f.b bVar) {
            this.f12315c = bVar;
            return this;
        }

        @Override // m6.f.a
        public f.a c(String str) {
            this.f12313a = str;
            return this;
        }

        @Override // m6.f.a
        public f.a d(long j9) {
            this.f12314b = Long.valueOf(j9);
            return this;
        }
    }

    private b(String str, long j9, f.b bVar) {
        this.f12310a = str;
        this.f12311b = j9;
        this.f12312c = bVar;
    }

    @Override // m6.f
    public f.b b() {
        return this.f12312c;
    }

    @Override // m6.f
    public String c() {
        return this.f12310a;
    }

    @Override // m6.f
    public long d() {
        return this.f12311b;
    }

    public boolean equals(Object obj) {
        if (obj == this) {
            return true;
        }
        if (obj instanceof f) {
            f fVar = (f) obj;
            String str = this.f12310a;
            if (str != null ? str.equals(fVar.c()) : fVar.c() == null) {
                if (this.f12311b == fVar.d()) {
                    f.b bVar = this.f12312c;
                    f.b b10 = fVar.b();
                    if (bVar == null) {
                        if (b10 == null) {
                            return true;
                        }
                    } else if (bVar.equals(b10)) {
                        return true;
                    }
                }
            }
            return false;
        }
        return false;
    }

    public int hashCode() {
        String str = this.f12310a;
        int hashCode = str == null ? 0 : str.hashCode();
        long j9 = this.f12311b;
        int i10 = (((hashCode ^ 1000003) * 1000003) ^ ((int) (j9 ^ (j9 >>> 32)))) * 1000003;
        f.b bVar = this.f12312c;
        return i10 ^ (bVar != null ? bVar.hashCode() : 0);
    }

    public String toString() {
        return "TokenResult{token=" + this.f12310a + ", tokenExpirationTimestamp=" + this.f12311b + ", responseCode=" + this.f12312c + "}";
    }
}```

@ferezini
Copy link
Author

ferezini commented Jul 5, 2023

Olha o que o GPT disse sobre esta classe:

Claro! Esta é uma classe b que estende a classe abstrata f. Ela contém três campos privados: f12310a, f12311b e f12312c. Os campos f12310a e f12311b são do tipo String e long, respectivamente, enquanto o campo f12312c é do tipo f.b. A classe também contém um construtor privado que inicializa esses campos.

A classe b também inclui uma classe interna estática C0154b, que implementa a interface abstrata f.a. Essa classe interna é usada para construir instâncias da classe b.

A classe b implementa os métodos abstratos da classe f, que incluem b(), c() e d(). Ela também inclui implementações dos métodos equals(), hashCode() e toString(). Esses métodos são usados para comparar e representar objetos da classe b.

Em resumo, a classe b representa um resultado de token de autenticação com um token de autenticação, um carimbo de data/hora de expiração do token e um código de resposta. A classe interna C0154b é usada para construir instâncias de b.

Acho que precisavamos da classe f também :(

@jhowbhz
Copy link
Contributor

jhowbhz commented Jul 5, 2023

ada para construir instâncias da classe b.

A classe b implementa os métodos abstratos da classe f, que incluem b(), c() e d(). Ela também inclui implementações dos

Eu consigo pegar qualquer classe la no APP, só falar... rsrs mas eu realmente nao manjo nada de JAVA/Kotlin.

Sabe o que eu acho engraçado, é: por que esse token aqui não expira?

{
  "requestToken": "YW5kcm9pZDtici5jb20uY29ycmVpb3MucHJlYXRlbmRpbWVudG87RjMyRTI5OTc2NzA5MzU5ODU5RTBCOTdGNkY4QTQ4M0I5Qjk1MzU3ODs1LjEuMTQ=",
  "data": "04/07/2023 17:39:44",
  "sign": "bd2401834330086b78386c036b3936ab"
}

@andersonmendess
Copy link

andersonmendess commented Jul 5, 2023

A grande questão é:

O app é feito em flutter, então a parte de gerar o token muito provavelmente ta dentro do binario do flutter (libapp.so).
não faria muito sentido criar uma ponte entre o dart e o java para gerar um token.

Esses metodos de token provavelmente são de alguma biblioteca nativa do android, creio que não tenha relação com o token que estamos procurando.

Lembrando que uma app flutter para android consiste em uma casca nativa (java) e um binario que é carregado na abertura do app (libapp.so)

@tegila
Copy link

tegila commented Jul 5, 2023

@jhowbhz precisamos da classe f

@tegila
Copy link

tegila commented Jul 6, 2023

@jhowbhz gostaria de pedir também todas as referências a palavra “C0154b” no código. Teria como você hospedar esse código completo em algum lugar pra gente poder ver melhor.

Eu sei ler o código mas não tenho android nem debug setup para android.

@jhowbhz
Copy link
Contributor

jhowbhz commented Jul 6, 2023

Vou subir pro meu github pra gente estudar o apk deles, breve posto aqui

@GabrielRF
Copy link

{
  "requestToken": "YW5kcm9pZDtici5jb20uY29ycmVpb3MucHJlYXRlbmRpbWVudG87RjMyRTI5OTc2NzA5MzU5ODU5RTBCOTdGNkY4QTQ4M0I5Qjk1MzU3ODs1LjEuMTQ=",
  "data": "04/07/2023 17:39:44",
  "sign": "bd2401834330086b78386c036b3936ab"
}

sign = MD5hash("requestTokenYW5kcm9pZDtici5jb20uY29ycmVpb3MucHJlYXRlbmRpbWVudG87RjMyRTI5OTc2NzA5MzU5ODU5RTBCOTdGNkY4QTQ4M0I5Qjk1MzU3ODs1LjEuMTQ=data04/07/2023 17:39:44")

Resolvido.

@GabrielRF
Copy link

const sign = crypto
  .createHash('md5')
  .update(`requestToken${token}data${data}`)
  .digest('hex');

@ferezini
Copy link
Author

ferezini commented Jul 6, 2023

{
  "requestToken": "YW5kcm9pZDtici5jb20uY29ycmVpb3MucHJlYXRlbmRpbWVudG87RjMyRTI5OTc2NzA5MzU5ODU5RTBCOTdGNkY4QTQ4M0I5Qjk1MzU3ODs1LjEuMTQ=",
  "data": "04/07/2023 17:39:44",
  "sign": "bd2401834330086b78386c036b3936ab"
}

sign = MD5hash("requestTokenYW5kcm9pZDtici5jb20uY29ycmVpb3MucHJlYXRlbmRpbWVudG87RjMyRTI5OTc2NzA5MzU5ODU5RTBCOTdGNkY4QTQ4M0I5Qjk1MzU3ODs1LjEuMTQ=data04/07/2023 17:39:44")

Resolvido.

mito demais

@tegila
Copy link

tegila commented Jul 7, 2023

Bonito não ficou, mas está funcionando. vlw demais!!!

var m = new Date();
var data =
  ("0" + m.getDate()).slice(-2) +
  "/" +
  ("0" + (m.getMonth() + 1)).slice(-2) +
  "/" +
  m.getFullYear() +
  " " +
  ("0" + m.getHours()).slice(-2) +
  ":" +
  ("0" + m.getMinutes()).slice(-2) +
  ":" +
  ("0" + m.getSeconds()).slice(-2);
const sign = crypto
  .createHash("md5")
  .update(`requestToken${l}data${data}`)
  .digest("hex");
console.log(l, data, sign);
u(s.PROXYAPP_TOKEN, {
  method: "POST",
  headers: {
    "content-type": "application/json",
    "user-agent": "Dart/3.0 (dart:io)",
  },
  data: {
    requestToken: l,
    data,
    sign,
  },
})

@GabrielRF
Copy link

@tegila Que tal assim?

const crypto = require('crypto');
const moment = require('moment-timezone');

const data = moment().tz('America/Sao_Paulo').format('DD/MM/YYYY HH:mm:ss');

const token = 'YW5kcm9pZDtici5jb20uY29ycmVpb3MucHJlYXRlbmRpbWVudG87RjMyRTI5OTc2NzA5MzU5ODU5RTBCOTdGNkY4QTQ4M0I5Qjk1MzU3ODs1LjEuMTQ=';

const sign = crypto
  .createHash('md5')
  .update(`requestToken${token}data${data}`)
  .digest('hex');

@tecomanow
Copy link

Solução em Kotlin:


import java.math.BigInteger
import java.security.MessageDigest

private fun getSign(): String {
      val requestToken = "YW5kcm9pZDtici5jb20uY29ycmVpb3MucHJlYXRlbmRpbWVudG87RjMyRTI5OTc2NzA5MzU5ODU5RTBCOTdGNkY4QTQ4M0I5Qjk1MzU3ODs1LjEuMTQ="
      val date = getDate()

      return md5Hash("requestToken${requestToken}data${date}")
}

private fun getDate() : String {
      val formatter = SimpleDateFormat("dd/MM/yyyy HH:mm:ss")
      return formatter.format(Date(System.currentTimeMillis()))
}

private fun md5Hash(str: String): String {
     val md = MessageDigest.getInstance("MD5")
     val bigInt = BigInteger(1, md.digest(str.toByteArray(Charsets.UTF_8)))
     return String.format("%032x", bigInt)
}

@ils15
Copy link

ils15 commented Jul 7, 2023

Eu criaria uma funçao para gerar o sign e resetaria o sign toda vez que desse um erro na requisiçao
eu migrei do meu codigo em python, voce pode tentar verificar se ta certinho
mas o caminho seria esse @tegila
Nesse caso ta pra qualquer erro, voce pode ajustar para o erro especifico de quando o sign expira

fun generateSign(token: String): Pair<String, String> {
    val data = LocalDateTime.now().format(DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm:ss"))
    val sign = MessageDigest
        .getInstance("MD5")
        .digest("requestToken$token$data$data".toByteArray())
        .joinToString("") { "%02x".format(it) }
    return Pair(data, sign)
}

fun getToken(client: Any, requestToken: String): String? {
    for (i in 1..10) {
        val (data, sign) = generateSign(requestToken)
        val payload = mapOf(
            "requestToken" to requestToken,
            "data" to data,
            "sign" to sign
        )
        val headers = mapOf(
            "content-type" to "application/json",
            "user-agent" to "Dart/3.0 (dart:io)"
        )
        val response = post(
            "https://proxyapp.correios.com.br/v2/app-validation",
            headers = headers,
            json = payload
        )
        if (response.statusCode == 201) {
            val token = response.jsonObject.getString("token")
            if (token != null) {
                return token
            }
        } else {
            println("Algo deu errado na requisição dos Correios: ${response.statusCode}: ${response.text} na data $data")
        }
        delay(1000)
    }
    throw Exception("Não foi possível obter um token válido nos Correios")
}

@ferezini
Copy link
Author

ferezini commented Jul 7, 2023

@tegila Que tal assim?

const crypto = require('crypto');
const moment = require('moment-timezone');

const data = moment().tz('America/Sao_Paulo').format('DD/MM/YYYY HH:mm:ss');

const token = 'YW5kcm9pZDtici5jb20uY29ycmVpb3MucHJlYXRlbmRpbWVudG87RjMyRTI5OTc2NzA5MzU5ODU5RTBCOTdGNkY4QTQ4M0I5Qjk1MzU3ODs1LjEuMTQ=';

const sign = crypto
  .createHash('md5')
  .update(`requestToken${token}data${data}`)
  .digest('hex');

repliquei esta solução aqui e está funcional, quem quiser utilizar: https://github.com/ferezini/Correios-Brasil/tree/atu-correios/

@jhowbhz
Copy link
Contributor

jhowbhz commented Jul 7, 2023

Acabei de fazer esse exemplo também funcional na minha API, o exemplo está em python, se alguem precisar.

import hashlib

token = "YW5kcm9pZDtici5jb20uY29ycmVpb3MucHJlYXRlbmRpbWVudG87RjMyRTI5OTc2NzA5MzU5ODU5RTBCOTdGNkY4QTQ4M0I5Qjk1MzU3ODs1LjEuMTQ="
data = datetime.datetime.now().strftime("%d/%m/%Y %H:%M:%S")

hash_object = hashlib.md5()
hash_object.update(f"requestToken{token}data{data}".encode())
sign = hash_object.hexdigest()

print(sign)

@jhowbhz
Copy link
Contributor

jhowbhz commented Jul 7, 2023

{
  "requestToken": "YW5kcm9pZDtici5jb20uY29ycmVpb3MucHJlYXRlbmRpbWVudG87RjMyRTI5OTc2NzA5MzU5ODU5RTBCOTdGNkY4QTQ4M0I5Qjk1MzU3ODs1LjEuMTQ=",
  "data": "04/07/2023 17:39:44",
  "sign": "bd2401834330086b78386c036b3936ab"
}

sign = MD5hash("requestTokenYW5kcm9pZDtici5jb20uY29ycmVpb3MucHJlYXRlbmRpbWVudG87RjMyRTI5OTc2NzA5MzU5ODU5RTBCOTdGNkY4QTQ4M0I5Qjk1MzU3ODs1LjEuMTQ=data04/07/2023 17:39:44")

Resolvido.

Poderia depois por favor, explicar como chegou a essa conclusão, ficaria grato.

@ils15
Copy link

ils15 commented Jul 7, 2023

{
  "requestToken": "YW5kcm9pZDtici5jb20uY29ycmVpb3MucHJlYXRlbmRpbWVudG87RjMyRTI5OTc2NzA5MzU5ODU5RTBCOTdGNkY4QTQ4M0I5Qjk1MzU3ODs1LjEuMTQ=",
  "data": "04/07/2023 17:39:44",
  "sign": "bd2401834330086b78386c036b3936ab"
}

sign = MD5hash("requestTokenYW5kcm9pZDtici5jb20uY29ycmVpb3MucHJlYXRlbmRpbWVudG87RjMyRTI5OTc2NzA5MzU5ODU5RTBCOTdGNkY4QTQ4M0I5Qjk1MzU3ODs1LjEuMTQ=data04/07/2023 17:39:44")
Resolvido.

Poderia depois por favor, explicar como chegou a essa conclusão, ficaria grato.

pelo que entendi o sign deles nada mais é do que o MD5 do token combinado com a data
sei lá porque é simplificado essa autenticação, mas é isso

@ferezini
Copy link
Author

ferezini commented Jul 7, 2023

{
  "requestToken": "YW5kcm9pZDtici5jb20uY29ycmVpb3MucHJlYXRlbmRpbWVudG87RjMyRTI5OTc2NzA5MzU5ODU5RTBCOTdGNkY4QTQ4M0I5Qjk1MzU3ODs1LjEuMTQ=",
  "data": "04/07/2023 17:39:44",
  "sign": "bd2401834330086b78386c036b3936ab"
}

sign = MD5hash("requestTokenYW5kcm9pZDtici5jb20uY29ycmVpb3MucHJlYXRlbmRpbWVudG87RjMyRTI5OTc2NzA5MzU5ODU5RTBCOTdGNkY4QTQ4M0I5Qjk1MzU3ODs1LjEuMTQ=data04/07/2023 17:39:44")
Resolvido.

Poderia depois por favor, explicar como chegou a essa conclusão, ficaria grato.

pelo que entendi o sign deles nada mais é do que o MD5 do token combinado com a data sei lá porque é simplificado essa autenticação, mas é isso

Mas eu acho que ele quer saber como o rapaz descobriu isso.

@jhowbhz
Copy link
Contributor

jhowbhz commented Jul 7, 2023

{
  "requestToken": "YW5kcm9pZDtici5jb20uY29ycmVpb3MucHJlYXRlbmRpbWVudG87RjMyRTI5OTc2NzA5MzU5ODU5RTBCOTdGNkY4QTQ4M0I5Qjk1MzU3ODs1LjEuMTQ=",
  "data": "04/07/2023 17:39:44",
  "sign": "bd2401834330086b78386c036b3936ab"
}

sign = MD5hash("requestTokenYW5kcm9pZDtici5jb20uY29ycmVpb3MucHJlYXRlbmRpbWVudG87RjMyRTI5OTc2NzA5MzU5ODU5RTBCOTdGNkY4QTQ4M0I5Qjk1MzU3ODs1LjEuMTQ=data04/07/2023 17:39:44")
Resolvido.

Poderia depois por favor, explicar como chegou a essa conclusão, ficaria grato.

pelo que entendi o sign deles nada mais é do que o MD5 do token combinado com a data sei lá porque é simplificado essa autenticação, mas é isso

Mas eu acho que ele quer saber como o rapaz descobriu isso.

Exatamente kkk essa é a chave da questão, literalmente.... kkkk

@GabrielRF
Copy link

@jhowbhz

Poderia depois por favor, explicar como chegou a essa conclusão, ficaria grato.

Acho que vai ficar um pouco desapontado com a resposta, mas a versão resumida é que foi no chute mesmo.

Eu tava travado nesse problema para resolver o RastreioBot e, obviamente, não conseguia reverter o hash.
Encontrar uma colisão também não resolvia.
Então fiquei refletindo a respeito até que pensei.. "Bem.. Esse negócio não pode ser complicado. Tem que ser algo que está no celular". Testei umas 3 combinações e bingo. Foi simplesmente isso.

FinotiLucas added a commit that referenced this issue Jul 12, 2023
@FinotiLucas
Copy link
Owner

Gente, boa noite.

Subi a nova versão com as alterações de vocês, quando tiver mais tempo vou reescrever toda essa parte para deixar mais simples.

Obrigado pela ajuda de vocês, abraços.

@andersonmendess
Copy link

e os correios ataca novamente...

Agora na terceira tentativa, temos um hash unico e maior.
https://proxyapp.correios.com.br/v3/app-validation

{
  "requestToken": "tE8l0X/+zoQBOGSLejnUSKS/7bymdZxNwHUdAjZ1Ersq46eFVL7gZgI/1vCVjn2I08GwmBWRv3yfC9NNyEDqh705rIcC64JJ+sSJW+jKpi4xXT/JWhD3qMJeQRSmNzbDziocdHlBJ+N7yQYe63D7mTDw12mRuwnXHXc1I7JJYty7GenkqxPomGHJvFxsc1N8wfOaXFY3P7Pf5Pf09OtIe2I5NaAS6VmfLk5J13HnEgXYAyVeYH4L9ItStp3aG0Em1MCnxm7wHqhSy6BN8Pg1J2w9ng12WSBNpmUXAeemC1SRV1dJ0T5OB2wGFce+l0vQLj2/0j8Zt5/8YQ3kZ05u3g=="
}

@ils15
Copy link

ils15 commented Aug 29, 2023

e os correios ataca novamente...

Agora na terceira tentativa, temos um hash unico e maior. https://proxyapp.correios.com.br/v3/app-validation

{
  "requestToken": "tE8l0X/+zoQBOGSLejnUSKS/7bymdZxNwHUdAjZ1Ersq46eFVL7gZgI/1vCVjn2I08GwmBWRv3yfC9NNyEDqh705rIcC64JJ+sSJW+jKpi4xXT/JWhD3qMJeQRSmNzbDziocdHlBJ+N7yQYe63D7mTDw12mRuwnXHXc1I7JJYty7GenkqxPomGHJvFxsc1N8wfOaXFY3P7Pf5Pf09OtIe2I5NaAS6VmfLk5J13HnEgXYAyVeYH4L9ItStp3aG0Em1MCnxm7wHqhSy6BN8Pg1J2w9ng12WSBNpmUXAeemC1SRV1dJ0T5OB2wGFce+l0vQLj2/0j8Zt5/8YQ3kZ05u3g=="
}

aqui eu desde ontem nao consigo obter o token valido

Alguem tá conseguindo usar o token?

@leandrobattochio
Copy link

Provavelmente mudaram o APP. Vai precisar de algum ninja pra decompilar o flutter de novo e encontrar onde está a mudança que cria o hash novo.

@ils15
Copy link

ils15 commented Aug 29, 2023

sim
e parece que nao é base64 mais

import encodings

List all available encodings in Python's standard library

all_encodings = encodings.aliases.aliases.values()

Remove duplicates

all_encodings_unique = list(set(all_encodings))
print(all_encodings_unique)

Function to try all available encodings

def try_decode_all_encodings(token_base64):
token_bytes = base64.b64decode(token_base64)
results = {}

for encoding in all_encodings_unique:
    try:
        results[encoding] = token_bytes.decode(encoding)
    except Exception as e:
        results[encoding] = str(e)

return results

Try decoding the example token with all available encodings

decoded_str_all_encodings_example = try_decode_all_encodings(REQUEST_TOKEN)

Showing a subset for brevity

subset_results = {k: decoded_str_all_encodings_example[k] for k in list(decoded_str_all_encodings_example.keys())[:10]}
print(subset_results)

['mac_roman', 'cp850', 'quopri_codec', 'cp437', 'iso8859_14', 'euc_jp', 'utf_32_le', 'iso2022_jp_2', 'gb2312', 'gb18030', 'latin_1', 'mac_cyrillic', 'cp1252', 'big5', 'hz', 'tis_620', 'utf_16_le', 'cp1125', 'iso8859_15', 'uu_codec', 'shift_jis', 'euc_jis_2004', 'iso8859_2', 'cp1256', 'iso8859_7', 'utf_32_be', 'cp861', 'iso8859_3', 'johab', 'cp1254', 'cp852', 'koi8_r', 'cp1257', 'cp855', 'mac_turkish', 'iso8859_11', 'utf_7', 'cp932', 'iso2022_jp_2004', 'iso8859_16', 'mac_latin2', 'bz2_codec', 'cp1140', 'cp1251', 'cp1258', 'base64_codec', 'cp037', 'cp273', 'cp863', 'ptcp154', 'big5hkscs', 'cp1253', 'cp775', 'utf_16_be', 'cp950', 'gbk', 'rot_13', 'shift_jis_2004', 'iso8859_9', 'cp862', 'cp1255', 'iso2022_jp', 'iso8859_5', 'cp424', 'mbcs', 'hex_codec', 'cp860', 'iso8859_4', 'cp858', 'cp866', 'mac_iceland', 'iso2022_jp_1', 'euc_jisx0213', 'kz1048', 'cp500', 'hp_roman8', 'iso8859_6', 'iso8859_10', 'utf_32', 'cp949', 'euc_kr', 'cp864', 'iso8859_13', 'iso2022_jp_3', 'cp869', 'iso8859_8', 'cp1250', 'utf_16', 'cp1026', 'utf_8', 'ascii', 'iso2022_kr', 'mac_greek', 'zlib_codec', 'iso2022_jp_ext', 'shift_jisx0213', 'cp865', 'cp857']
{'mac_roman': "¥O%—\x7f˛ŒÑ\x018dãz9‘H§ø̺¶uúM¿u\x1d\x026u\x12ª*„ßÖTæ‡f\x02?÷\uf8ffïé}à”¡∞ò\x15ëø|ü\x0b”M»@ÍáΩ9¨á\x02ÎÇI˙ƒâ[Ë\xa0¶.1]?…Z\x10˜®¬^A\x14¶76√Œ*\x1ctyA'„{…\x06\x1eÎp˚ô0\uf8ff◊iëª\t◊\x1dw5#≤Ib‹ª\x19ȉ´\x13Ëòa…º\lsS|¡Ûö\V7?≥fl‰˜ÙÙÎH{b95†\x12ÈYü.NI◊qÁ\x12\x05ÿ\x03%^~\x0bÙãR∂ù⁄\x1bA&‘¿ß∆n\uf8ff\x1e®RÀ†M\uf8ff¯5'l=û\rvY M¶e\x17\x01Á¶\x0bTëWWI—>N\x07l\x06\x15«æóK–.=ø“?\x19∑ü¸a\r‰gNnfi", 'cp850': "┤O%Ð\x7f■╬ä\x018dïz9ÈHñ┐Ý╝ªu£M└u\x1d\x026u\x12╗*ÒºàT¥Óf\x02?Í\xadòÄ}êË┴░ÿ\x15æ┐|ƒ\x0bËM╚@Ûç¢9¼ç\x02ÙéI·─ë[Þ╩ª.1]?╔Z\x10¸¿┬^A\x14ª76├╬*\x1ctyA'Ò{╔\x06\x1eÙp¹Ö0\xadÎiæ╗\tÎ\x1dw5#▓Ib▄╗\x19Úõ½\x13Þÿa╔╝\\lsS|┴¾Ü\\V7?│▀õ¸¶¶ÙH{b95á\x12ÚYƒ.NIÎqþ\x12\x05Ï\x03%^\x0b¶ïRÂØ┌\x1bA&È└ºãn\xad\x1e¿R╦áM\xad°5'l=×\rvY Mªe\x17\x01þª\x0bTæWWIÐ>N\x07l\x06\x15Ã¥ùKð.=┐Ê?\x19Àƒ³a\rõgNnÌ", 'quopri_codec': "'quopri_codec' is not a text encoding; use codecs.decode() to handle arbitrary codecs", 'cp437': "┤O%╤\x7f■╬ä\x018dïz9╘Hñ┐φ╝ªu£M└u\x1d\x026u\x12╗πºàT╛αf\x02?╓≡òÄ}ê╙┴░ÿ\x15æ┐|ƒ\x0b╙M╚@Ωç╜9¼ç\x02δéI·─ë[Φ╩ª.1]?╔Z\x10≈¿┬^A\x14ª76├╬\x1ctyA'π{╔\x06\x1eδp√Ö0≡╫iæ╗\t╫\x1dw5#▓Ib▄╗\x19ΘΣ½\x13Φÿa╔╝\lsS|┴≤Ü\V7?│▀Σ≈⌠⌠δH{b95á\x12ΘYƒ.NI╫qτ\x12\x05╪\x03%^~\x0b⌠ïR╢¥┌\x1bA&╘└º╞n≡\x1e¿R╦áM≡°5'l=₧\rvY Mªe\x17\x01τª\x0bTæWWI╤>N\x07l\x06\x15╟╛ùK╨.=┐╥?\x19╖ƒⁿa\rΣgNn▐", 'iso8859_14': "ṀO%Ñ\x7fŷÎ\x84\x018d\x8bz9ÔHĊṡíỳḊu\x9cMÀu\x1d\x026u\x12Ṡ*ã§\x85Tẅàf\x02?Öŵ\x95\x8e}\x88ÓÁḞ\x98\x15\x91ṡ|\x9f\x0bÓMÈ@ê\x87Ẅ9Ỳ\x87\x02ë\x82IúÄ\x89[èÊḊ.1]?ÉZ\x10ṫẀÂ^A\x14Ḋ76ÃÎ*\x1ctyA'ã{É\x06\x1eëpû\x990ŵṪi\x91Ṡ\tṪ\x1dw5#ĠIbÜṠ\x19éäḋ\x13è\x98aÉỳ\\lsS|Áó\x9a\\V7?ġßäṫôôëH{b95\xa0\x12éY\x9f.NIṪqç\x12\x05Ø\x03%^\x0bô\x8bR¶\x9dÚ\x1bA&ÔÀ§Ænŵ\x1eẀRË\xa0Mŵø5'l=\x9e\rvY MḊe\x17\x01çḊ\x0bT\x91WWIÑ>N\x07l\x06\x15Çẅ\x97KŴ.=ṡÒ?\x19Ṗ\x9füa\rägNnŶ", 'euc_jp': "'euc_jp' codec can't decode byte 0xb4 in position 0: illegal multibyte sequence", 'utf_32_le': "'utf-32-le' codec can't decode bytes in position 0-3: code point not in range(0x110000)", 'iso2022_jp_2': "'iso2022_jp_2' codec can't decode byte 0xb4 in position 0: illegal multibyte sequence", 'gb2312': "'gb2312' codec can't decode byte 0xb4 in position 0: illegal multibyte sequence", 'gb18030': "'gb18030' codec can't decode byte 0xd1 in position 3: illegal multibyte sequence"}

retornou isso dai

NO token antigo

['iso8859_8', 'iso8859_14', 'cp1125', 'utf_32_be', 'cp037', 'mbcs', 'cp1255', 'mac_greek', 'latin_1', 'base64_codec', 'cp1252', 'ptcp154', 'gb18030', 'hz', 'koi8_r', 'iso2022_jp_2', 'cp863', 'iso2022_jp', 'uu_codec', 'iso8859_6', 'cp855', 'utf_16_be', 'iso8859_9', 'cp500', 'cp864', 'iso8859_5', 'mac_latin2', 'iso8859_4', 'ascii', 'iso2022_jp_2004', 'shift_jis', 'iso8859_13', 'iso8859_15', 'shift_jis_2004', 'tis_620', 'euc_jisx0213', 'cp950', 'utf_16_le', 'iso8859_11', 'cp1256', 'cp850', 'cp869', 'iso2022_jp_ext', 'mac_roman', 'cp932', 'hp_roman8', 'euc_jp', 'cp1257', 'cp1250', 'iso8859_16', 'iso2022_jp_1', 'utf_16', 'cp1254', 'cp1140', 'kz1048', 'euc_jis_2004', 'gbk', 'bz2_codec', 'cp775', 'rot_13', 'mac_iceland', 'cp949', 'big5hkscs', 'cp273', 'cp865', 'cp852', 'johab', 'iso8859_3', 'cp437', 'utf_32_le', 'mac_cyrillic', 'mac_turkish', 'cp1253', 'iso8859_7', 'cp861', 'cp857', 'quopri_codec', 'utf_32', 'shift_jisx0213', 'utf_8', 'cp862', 'iso8859_10', 'cp424', 'cp1251', 'cp1258', 'iso8859_2', 'euc_kr', 'iso2022_kr', 'iso2022_jp_3', 'cp858', 'utf_7', 'cp860', 'cp866', 'big5', 'cp1026', 'hex_codec', 'zlib_codec', 'gb2312']
{'iso8859_8': 'android;br.com.correios.preatendimento;F32E29976709359859E0B97F6F8A483B9B953578;5.1.14', 'iso8859_14': 'android;br.com.correios.preatendimento;F32E29976709359859E0B97F6F8A483B9B953578;5.1.14', 'cp1125': 'android;br.com.correios.preatendimento;F32E29976709359859E0B97F6F8A483B9B953578;5.1.14', 'utf_32_be': "'utf-32-be' codec can't decode bytes in position 0-3: code point not in range(0x110000)", 'cp037': '/>ÀÊ?ÑÀ\x9bÂÊ\x06Ä?_\x06Ä?ÊÊÁÑ?Ë\x06øÊÁ/ÈÁ>ÀÑ_Á>È?\x9bã\x93\x16á\x16\x99\x99\x04\x96\x04\x90\x99\x93\x95\x99\x98\x95\x99á\x90â\x99\x04ã\x96ã\x98\xa0\x94\x98\x93â\x99â\x99\x95\x93\x95\x04\x98\x9b\x95\x06\x91\x06\x91\x94', 'mbcs': 'android;br.com.correios.preatendimento;F32E29976709359859E0B97F6F8A483B9B953578;5.1.14', 'cp1255': 'android;br.com.correios.preatendimento;F32E29976709359859E0B97F6F8A483B9B953578;5.1.14', 'mac_greek': 'android;br.com.correios.preatendimento;F32E29976709359859E0B97F6F8A483B9B953578;5.1.14', 'latin_1': 'android;br.com.correios.preatendimento;F32E29976709359859E0B97F6F8A483B9B953578;5.1.14', 'base64_codec': "'base64_codec' is not a text encoding; use codecs.decode() to handle arbitrary codecs"}

@leandrobattochio
Copy link

leandrobattochio commented Aug 29, 2023

Acredito que isso não tem relevância. "Só" precisa decompilar o apk de novo e encontrar o trecho de código que monta o request. Já fizeram isso na v2, resta esperar alguém fazer pra gente na v3.

Talvez o @jhowbhz consiga encontrar de novo como já fez antes

@ils15
Copy link

ils15 commented Aug 29, 2023

Acredito que isso não tem relevância. "Só" precisa decompilar o apk de novo e encontrar o trecho de código que monta o request. Já fizeram isso na v2, resta esperar alguém fazer pra gente na v3.

Talvez o @jhowbhz consiga encontrar de novo como já fez antes

mas esse token funciona

So mudar de V2 pra V3 na autenticaçao
O problema é a quantidade de desconexao que ele ta retornando
ate sincrono, as vezes preciso mandar 5,6 requisicoes para ele nao retornar o erro

" Cannot connect to host proxyapp.correios.com.br:443 ssl:default [Não há endereço associado com o nome]"

@leandrobattochio
Copy link

Pra mim não funcionou:

image

@jhowbhz
Copy link
Contributor

jhowbhz commented Aug 29, 2023

Pra mim não funcionou:

image

Ta fazendo errado chefe.

@leandrobattochio
Copy link

Era uma grande possibilidade kkkkkk

@jhowbhz
Copy link
Contributor

jhowbhz commented Aug 29, 2023

Era uma grande possibilidade kkkkkk

Mas parece que tem um problema mesmo....

image

@leandrobattochio
Copy link

Rodei o jadx aqui num apk que baixei da net, não encontrei nada de v3 no app. Consegui encontrar o método antigo que gerava o hash que postaram aqui. Mas nada dessa v3. Talvez o app nao esteja atualizado ou eu não sei procurar. Nao manjo mt de eng reversa mobile =/

@jhowbhz
Copy link
Contributor

jhowbhz commented Aug 29, 2023

Consegui, trocaram a v2 pra v3 e agora nao existe mais o sign e o data.

Ta na mão.

image

@jhowbhz
Copy link
Contributor

jhowbhz commented Aug 29, 2023

POST:
https://proxyapp.correios.com.br/v3/app-validation

Body:

{
  "requestToken": "rPgi596V7vNHkEJwJA0eW30hUeJNqvKcHVdhfcX3CDuNCFu3KT5XgkbDf2iFc/g7nuGbFx4bNOBUEieF0k+jICMcWRN+ug0asYGwMM511vBzfbLotGy6IR5Ya0jUjx+N/EAhJM3jjxYUudPZLWIdwoL/B23mPvbQEXAyWcEAxHS7JUOgC9p/Zj/RHXtF9W3iK1TfRdk1CjNP5UmwUdGWwawgvfPY7Fof9nPrHMz/MkeYn0/PSemHHhJ3TdHCFc0h/MrWDSjsTtznZbpQcZZL4rAes9vOoN8SWJgyLmK21qXeErdB1OljK/VYbBvTfTzEcoOWM3/4Z3jGPyxM+a77Mg=="
}

@leandrobattochio
Copy link

Como gera esse token? Não conseguiu encontrar?
Pra mim ainda da forbidden

@jhowbhz
Copy link
Contributor

jhowbhz commented Aug 29, 2023

Como gera esse token? Não conseguiu encontrar? Pra mim ainda da forbidden

Eu pego no APK deles... hueuheuhuheuhe

@leandrobattochio
Copy link

Como gera esse token? Não conseguiu encontrar? Pra mim ainda da forbidden

Eu pego no APK deles... hueuheuhuheuhe

Aaa pode crer, usando aquele programinha la pra interceptar as requests. Verdade. Mas aqui num ta rolando =/

@ils15
Copy link

ils15 commented Aug 29, 2023

POST: https://proxyapp.correios.com.br/v3/app-validation

Body:

{
  "requestToken": "rPgi596V7vNHkEJwJA0eW30hUeJNqvKcHVdhfcX3CDuNCFu3KT5XgkbDf2iFc/g7nuGbFx4bNOBUEieF0k+jICMcWRN+ug0asYGwMM511vBzfbLotGy6IR5Ya0jUjx+N/EAhJM3jjxYUudPZLWIdwoL/B23mPvbQEXAyWcEAxHS7JUOgC9p/Zj/RHXtF9W3iK1TfRdk1CjNP5UmwUdGWwawgvfPY7Fof9nPrHMz/MkeYn0/PSemHHhJ3TdHCFc0h/MrWDSjsTtznZbpQcZZL4rAes9vOoN8SWJgyLmK21qXeErdB1OljK/VYbBvTfTzEcoOWM3/4Z3jGPyxM+a77Mg=="
}

essa ta boa
parece que nao ta dando problema com requests
e de fato
nao precisa mais atualizar o sign

@leandrobattochio
Copy link

leandrobattochio commented Aug 29, 2023

Ta de boa mesmo, tava faltando o User-Agent na requisição. Ta safe mesmo. O foda é quando esse requestToken não for mais válido auhauh

@GabrielRF
Copy link

@leandrobattochio

Ta de boa mesmo, tava faltando o User-Agent na requisição. Ta safe mesmo. O foda é quando esse requestToken não for mais válido auhauh

Esse momento chegou..

@andersonmendess
Copy link

o token só dura 24 horas, se gerar com um dia a frente ele chega a durar 48 horas

@andersonmendess
Copy link

esse aqui vai expirar dia 01 as 11am

Aru8f+R6u00wQgU0nZ7AZg0vpvXTfB+e7w00jf+OkHbgQDwHUpVvhdIzf7BdYSGxQdwlcefRusOvAkLpMFXFwA0ujoHrN82I2hxVumUQELmCEbu47jqa916P2mmIcmMC4rMwY8ihFAnOjnrEdLaLnRceOdxzwcIsGKEeXpJ6S0mVYHP/t6eU9EsOGRxJTEf4jl6oEEMwgfqf7nSkuy+NX/CTvNz0jm1aMsz4NkAqjtaMegE/K2pMTBGLt3CD01gHhylz1bKjNUUmgUhFlBNDD40qBPvUS+sVtt29GJTJj5n+S9ny5BpUE2fkHwwKub7Oz0ummldKEVGx0zYq1KP86w==

@ils15
Copy link

ils15 commented Aug 30, 2023

o legal era voces passarem como encontra o token
o @GabrielRF passou o esquema do data e sign aqui sem reclamar

@tecomanow
Copy link

O token não é gerado com o requestToken? Antes (no v2/app-validation) usando o data e o sign e aparentemente mudaram o endereço (v3/app-validation agora) e um novo requestToken que aparentemente é fixo no cód.

@GabrielRF
Copy link

@tecomanow É exatamente do requestToken que estamos falando. Agora ele tem validade também.

@andersonmendess
Copy link

pessoal, criei um slack sobre este assunto, quem quiser entrar

https://join.slack.com/t/novoworkspace-gy79184/shared_invite/zt-22d38753o-EhySiuK76VOK~GSeyFwENg

@leandrobattochio
Copy link

leandrobattochio commented Aug 30, 2023

o legal era voces passarem como encontra o token o @GabrielRF passou o esquema do data e sign aqui sem reclamar

O problema é que tem que fazer engenharia reversa do app. E parece que não é todo mundo que sabe... Ninguém ta escondendo nada aqui não kkk

Muito pelo contrário, diga-se de passagem.

Pra pegar o token tem instrução aqui: #49 (comment)

Agora, isso não é viavel em nenhum cenário imaginável. Enquanto alguém não conseguir debugar o app vai ter que sempre fazer esse processo manual.

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

No branches or pull requests