Lesson 4


ENTENDENDO A CRIPTOGRAFIA





Essa lição deve ser um ponto de partida no mundo da criptografia. Este é um tópico profundamente matemático e analítico, e na área de segurança nós o vemos mais como se fosse uma "ferramenta" de suporte. Nós iremos fornecer uma breve visão geral para que você possa começar a resolver questões básicas nesse assunto. Para resolver os desafios dessa categoria, você deve se familizarizar com os métodos mais populares e o básico da criptografia clássica.

A palavra Criptografia vem do Grego, sgnificando "escrita escondida", e o que nós vamos começar a aprender aqui é a arte da criptoanálise, que significa, a arte de decifrar.
O principal uso da criptografia na vida real é garantir a parte da confidencialidade na tríade de segurança (confidencialidade, integridade, disponibilidade). O que significa proteger seus dados de serem lidos/acessados por alguém que não deveria. Mas, como a maior parte das coisas na vida, ela pode ser usado para o bem e para o mal.

Quando você se autentica em um website, você não quer que ninguém observando a rede possa ver sua senha sendo transmitida ao destino, e é aí onde o Hyper Text Transfer Protocol Secure (HTTPS) entra. A camada extra usando SSL/TLS no protocolo HTTP cria uma conexão encriptada entre o cliente e o servidor, evitando que pessoas possam bibliotar seu tráfego e ver suas senhas ou outros dados sensíveis que possam estar sendo trafegados.

Você também usa a criptografia para proteger os dados digitais em seu computador. Se você carrega dados sensíveis, você não quer que esse dado seja acessado por estranhos no caso de você perder ou ser roubado. Isso também se aplica aos smartphones. Hoje em dia, a maioria dos smartphones vêm criptografados por padrão, o que significa que se alguém tentar acessar o disco do seu celular, ele não vai ter acesso aos dados. Um caso como esse esteve recentemente na mídia, quando o FBI não estava conseguindo acessar os dados dos smartphones dos atiradores de San Bernadino [1].

Os criminosos também usam muito a criptografia nos conhecidos malwares. Hoje em dia, a maioria das grandes empresas possuem muitos sistemas de proteção, como Firewalls, IPS e IDS, mas muitas destas soluções não podem fazer muito se não conseguem ler o que está sendo transmitido na rede. Então, se você tentar transmitir um payload através da rede, as soluções de segurança provavelmente vão pegar facilmente, mas os atacantes podem dificultar um pouco se a conexão estiver criptografada.

Em CTFs, no entanto, a grande parte das criptografias de alto nível não são geralmente usadas. Em alguns casos, você vai ver alguns métodos de criptografia "caseiros", que você pode reverter, ou então alguns métodos já conhecidos e que tudo o que você precisa fazer é alimentar em alguma ferramenta online para encontrar a resposta. Normalmente, a parte mais difícil em desafios de criptografia é descobrir que tipo de criptografia está sendo usada. Nós veremos aqui algumas das técnicas clássicas e como elas funcionam.

Ok, vamos começar.

CODIFICAÇÃO BÁSICA

Começando com realmente básico, considere a tabela abaixo:


Onde cada letra é atribuída a um número entre 65 e 90. Essa é a representação das letras maiúsculas em números decimais. Portanto, qualquer mensagem pode ser reescrita usando números. Por exemplo:

GO AHEAD AND CRACK IT

É equivalente a:

717932657269656832657868326782656775327384

No começo pode parecer confuso, mas você deve notar que existem apenas números decimais, sem letras ou caracteres especiais. Se você olhar atentamente e dividir os números, vai ficando mais claro. Separando os dois primeiros números 71, de acordo com a nossa tabela, ele é equivalente a G. O próximo é 79, que é equivalente a O, e assim por diante. Isso é chamado Tabela ASCII [2] e o que nós fizemos foi a codificação do texto ASCII para a sua respectiva representação decimal e depois decodificamos de volta a partir do decimal.

Observe que a nossa tabela consiste apenas de letras maiúsculas. E se nós também tivéssemos letras minúsculas? Como ficaria a nossa tabela? Tente descobrir.

Neste caso, um número decimal estava relacionado com a letra. Outra forma comum de encode que funciona de forma similar e que você verá com frequência são: octal, decimalm hexadecimal e HTML.
Existem muitos websites que fazem a codificação e decodificação automaticamente para você. No entanto, é importante saber como funciona e, em alguns CTFs, você pode estar participando sem acesso a internet. Para uma tabela de fácil acesso, tente digitar no seu terminal:

$ man ascii

Hora do desafio

  • Você percebeu que a nossa tabela contém apenas letras maiúsculas? E se nós também tivéssemos letras minúsculas? Como seria a nossa tabela? Tente descobrir.
  • Você consegue desenvolver um programa que codifica e decodifica strings no formato octal, decimal e hexadecimal?


  • Ganhe alguns pontos: ASCII Encoding



  • Codificação Base64

    Outro famoso método de codificação é o chamado base64. Esse método é útil para codificar arquivos em um formato ASCII. Ele não é um método de criptografia mas é muito utilizado para codificar e transferir dados por não possuir caracteres especiais como ‘%$!; ou qualquer outro caractere não ASCII, que poderia quebrar alguns softwares.

    Esse método consiste em pegar três bytes, dividir estes bytes em quatro grupos de seis bits. Cada conjunto de seis bits pode ser de 0 a 63, que é, 64 possíveis valores (daí a origem do nome do método). Então, a codificação em base64 utiliza a seguinte tabela:


    É possível que ao codificar, você não consige obter três bytes. Neste caso, é necessário preencher o conteúdo da mensagem. Isso pode ser realizado usando o símbolo de preenchiment =.

    Vamos codificar a palavra SHELLTER usando base64 como um exemplo.

    Primeiro de tudo, nós precisamos obter os binários dos caracteres que nós queremos codificar:


    Se nós pegarmos todos os binarios juntos, nós iremos obter um total de 64bits. Nós os dividimos em 3 bytes (blocos de 24 bits). O leitor atento já percebeu que nós não temos bits suficientes para 3 bytes, e o último bloco vai ter apenas 16 bits, então nós precisamos preencher o resto dos bits faltantes adicionando 0s a direita.

    010100110100100001000101 010011000100110001010100 0100010101010010

    Depois disso, nós dividimos cada um destes blocos em pedaços de 6 bits cada, então todos eles podem ficar entra 0 até 63, como mencionado anteriormente. After that, we split each of these blocks in chunks of 6 bits each (1byte), so they can all be on the range from 0 to 63, as we mentioned earlier.

    Então nós teremos os conjuntos como este:

    010100 110100 100001 000101 010011 000100 110001 010100 010001 010101 001000 000000

    Agora nós iremos converter cada byte em base64 usando a tabela.


    Então, a palavra SHELLTER codificada em base64 seria:

    U0hFTExURVI=

    Outros métodos similares que você deve verificar são Base32 e Base16 [3].

    Hora do desafio

  • Você consegue escrever um programa que codifica e decodifica o texto de/para Base64?


  • Ganhe alguns pontos: Base64 Encoding



  • Cifra de Deslocamento (Shift) / Cifra de César

    Uma cifra muito famosa e clássica é a cifra de César. Ela foi criada em tempos antigos e utilizada para proteger mensagens militares. Como o nome diz, cifra de desolocamento desloca ou rotaciona as letras, e ela pode ser um deslocamento de qualquer número. Nos tempos de Júlio César, a cifra foi usada com deslocamento de 3 caracteres, mas hoje em dia o termo Cifra de César se refere a todas as variantes (deslocamentos/rotações) desse sistema. O deslocamento mais comum usada hoje em dia é o rot-13. [4]

    Em um deslocamento de 3, por exemplo, nós adicionamos 3 para cada letra no alfabeto, então nós temos:



    Pegue a nossa frase anterior:

    GO AHEAD AND CRACK IT

    e ao deslocar 3 para cada letra, nós temos:

    JR DKHDG DQG FUDFN LW

    É comum o uso de letras maiúsculas para indicar um texto cifrado.

    Hora do desafio

  • Qual é a mensagem que gerou o texto cifrado abaixo?
    Você precisa descobrir o valor de deslocamento para decifrar a mensagem.

  • OHJRPUN PZ NYLHA

  • Qual o número máximo de tentativas seria necessário?


  • Ganhe alguns pontos: Shift Cipher 01
  • Ganhe alguns pontos: Shift Cipher 02



  • Cifra de Vigenère

    Até agora, nós precisávamos saber apenas que tipo de codificação estava sendo usado para decodificar para texto plano. Mas, estes são os fáceis. Algumas cifras requerem uma chave para decifrar. Os criptosistemas clássicos também são chamados de criptosistemas simétricos porque a chave utilizada para descriptografar é a mesma utilizada para criptografar. As chaves assimétricas, no entanto, utilizam chaves diferentes para criptografar e descriptografar. Nessa lição nós falaremos apenas sobre as cifras simétricas, isso siginifica que, para decifrar, você vai precisar saber a chave que foi utilizada para cifrar.

    "E como eu pego a chave?" Você deve estar perguntando. Bom, existem muitas formas de fazer na vida real, como explorar uma vulnerabilidade que te dá acesso ao código fonte onde a chave está gravada (hardcoded), entender o algoritmo de criptografia e encontrar uma falha lógica, ou realizar um ataque de força bruta. Em CTFs, quando você enontra cifras que requerem uma chave, normalmente a melhor abordagem é realizar força bruta com chaves óbvias. Se a chave é uma string, por exemplo, tente algo como 'flag', ou o nome da competição, ou algo que possa estar na descrição da questão.
    Para dar um exemplo de cifra que usa chave, nós iremos mostrar a Cifra de Vigenère. É realmente similar a Cifra de César.

    Para criptografar o texto, você vai precisar usar uma tabela vigenère como a seguinte:


    Se você observar, cada linha corresponde a um deslocamento de X do alfabeto. Na Cifra de César nós vimos um deslocamento de X=3, que significa usar a linha 'D'. A Cifra de Vigenère pode usar todas as linhas da tablea (diferentes rotações), mas o que vai decidir qual rotação usar é a chave.

    É assim que funciona:

    Pegue a primeira letra da chave e encontre a linha da tabela que começa com aquela letra;
    Pegue a primeira letra do texto que você quer criptografar e encontra a coluna correspondente a ela.

    Pegue SHELLTER como chave, por exemplo. Para criptografar o texto:

    CRACK THE CRYPTO

    A posiçao correspondente na tabela que tem a linha S e coluna C é: U
    A posição correspondente na tabela que tem a linha H e a coluna R é: Y

    Se você continuar letra por letra, você vai perceber que a chave é menor que o texto a ser criptografado, mas isso não é um problema. Uma vez que você pegue o último caractere da chave, você vai recomeçar a partir da primeira letra até você criptografar todo o seu texto.


    Ao final do algoritmo, você deve ter um texto como esse:

    UYENV MLV UYCAEH

    Hora do desafio

  • Você consegue escrever um programa que criptografa e descriptografa o texto de/para Vigenère? O programa deve solicitar ao usuário uma chave.
  • Qual é a chave utilizada para gerar o texto abaixo?
  • Qual é a mensagem em texto plano?

  • DLECYBRXNPKPYXVVOPXSDAICDAIC


  • Ganhe alguns pontos: Vigenère Cipher 01
  • Ganhe alguns pontos: Vigenère Cipher 02



  • Cifra de Substituição

    Outro tipo de criptografia é a cifra de substituição, que ao invés de usar simples descolocamentos, utiliza uma permutação aleatória do alfabeto. Para essa lição, nós criamos essa tabela aleatória.


    Nesse caso, se nós quisermos criptografar o seguinte texto: In this case, if we want to encrypt the following text:

    Hacking n Roll is great

    Nós obteremos:

    DKFTMPZ P VIEE MC ZVYKJ

    É fácil perceber que existem 26!=403291461126605635584000000, ou, 4*10^26 possibilidades de permutação.
    Apesar do número grande, é possível usar análise de frequencia para detectar as letras mais comuns no texto e realizar a substituição mais provável.
    Por exemplo, em inglês, a letra mais comum é E, enquanto no português do Brasil é A Então, se você tiver um texto criptografado, apenas construa um histograma para as letras e use a tabela de distribuição como você pode encontrar aqui: https://en.wikipedia.org/wiki/Letter_frequency#Relative_frequencies_of_letters_in_other_languages para escolher a letra mais provável.

    Note que nem sempre essa técnica irá funcionar, e isso é porque você precisa de um texto criptografado que tenha quase a mesma frequência de distribuição das letras. Na flag anterior, nós temos apenas um Y (E) e dois K (a).

    Então, a análise de frequência não é fácil. Felizmente, não é comum na vida real um texto encriptado muito curto.


    Conclusão

    Este foi o básico da criptografia, no tutorial nós mal arranhamos a superficie da criptografia, mas deve ser um bom ponto de partida para trilhar o seu caminho nessa área e ganhar alguns pontos em CTFs.


    Agradecimentos

    Nós gostaríamos de agradecer ao Professor Inácio Alves (@icanolargv) pela contribuíção durante a escrita e criação de desafios para essa lição.


    Leitura Adicional




    Referencias

    [1] Why can't the FBI hack into San Bernardino killer's iPhone? Apple's mobile security explained
    [2] RFC 20
    [3] RFC 4648
    [4] Aalgoritmy.net - Caesar Cipher

    Share: