[HackTheBox] Desafio TwoForOne

Cleber J Santos
4 min readJan 15, 2021

--

O desafio indica que: “Alice enviou duas vezes a mesma mensagem para Bob.” e o material para realizar o desafio compactados em um zip, contendo duas chaves e duas mensagens (criptografadas).

Como todo o desafio, depois que você compreende o que precisa ser feito, fica fácil, mas para chegar até a decifragem é preciso gastar um pouco de neurônios, e posso dizer que aqui não precisamos de nehuma calculadora da Nasa ou qualquer coisa parecida. Precisamos da velha e pura matemática, e claro, conhecimento sobre o método RSA, um dos primeiros sistemas de criptografia de chave pública.

O Método RSA e a geração das chaves

RSA como dito é um dos primeiros algorítimos de criptografia de dados, cujo o nome se deve a três dos professores do MIT, Ronald Rivest, Adi Shamir e Leonard Adleman e fundadores da RSA Data Security, Inc.

Foi também o primeiro algorítimo a permitir criptografia e assinatura digital e uma das grandes inovações em criptografia de chave pública.

Neste método as chaves são geradas da seguinte maneira:
1
. Pegamos de forma aleatória dois números primos grandes p e q, da ordem de 10¹⁰⁰ no mínimo (Apenas para efeito de curiosidade podemos também dizer da ordem de um googol, não confunda com o nome do buscador)

Um googol não tem um significado especial na matemática, mas basta saber que é o número 1⁰¹⁰⁰, ou seja, o dígito 1 seguido de cem zeros, conforme a representação da imagem.

2. Calcule n=pq
3. Calcule a função totiente de Euler em n: ϕ(n) = (p-1)(q-1)
4. Escolhemos um inteiro e em que 1 < e < ϕ(n), de forma que e e ϕ(n) tenham o único divisor comum sendo 1
5. Calcule d de forma que de ≡ 1 (mod ϕ(n)), ou seja, d precisa ser inverso multiplicativo de e em (mod ϕ(n)).

Por fim, temos nossa chave pública: o par (n, e,) e a chave privada: a tripla (p, q, d)

Decifragem e solução do desafio.

Não irei entrar no como faz a cifragem, mas em resumo para decifrar ou recuperar a mensagem m da mensagem cifrada c usando a respectiva chave privada do receptor n e d, basta fazer outra potenciação modular: cᵈ ≡ m (mod n).

Apesar de ser matemática pura, não acho que temos que sair criando nossas próprias funções para resolver o desafio, não precisamos reinventar a roda.

Existe uma ferramenta no Github chamada RsaCtfTool que consiste em diversos ataques e exploração RSA e principalmente para CTF.

Estou presumindo que você saiba minimamente clonar e usar o pip do python para instalar as dependências do pacote.

Se usarmos o comando cat ou um edito de sua preferência em ambas as chaves públicas, notaremos que se parecem muito, para tirar prova disso, vamos usar a ferramenta RsaCtfTool com a opção dumpkey para que ele possa nos mostrar quem é o (n, e) da nossa chave pública, conforme explicado acima. Execute o comando para ambas as chaves e veja o conteúdo de n.

Utilizei um Docker instalado a imagem do KaliLinux para facilitar

Agora que sabemos que as duas chaves usam o mesmo n, podemos usar um ataque conhecido como Ataque de Módulos Comum em RSA (RSA Common Modulus Attack).

O ataque consiste em pegar dois textos cifrados, criptografados com o mesmo módulo n, mas com um expoente e diferente. Então é possível recuperar o texto simples da mensagem m.

Para que esse ataque funcione, devemos lembrar do passo 4 da geração das chaves, onde o maior denominador comum dos dois expoentes deve ser 1: mdc (e1, e2) = 1.

Iremos usar um script chamado RSA-Common-Modulus-Attack que você encontra no Github também, seu uso é bem simples, após clonar e instalar os requerimentos usando o pip install do Python , então execute o comando conforme abaixo.

Com a saída em mãos, basta utilizar no site para completar o desafio.

--

--

Cleber J Santos
Cleber J Santos

Written by Cleber J Santos

I'm a Full Stack Developer with a solid experience in SysAdmin/DevOps, hands-on experience with Python development, websites and API-driven web apps.

No responses yet