Krypton

Krypton0

Precisamos decodificar a mensagem S1JZUFRPTklTR1JFQVQ= para o próximo nível.

É dito que ela está em base64. Para resolver isso, é só usar o comando base64.

echo "S1JZUFRPTklTR1JFQVQ=" | base64 -d

Assim, obtemos a senha de Krypton1.

Resposta: KRYPTONISGREAT.

Krypton1

É preciso decodificar a mensagem YRIRY GJB CNFFJBEQ EBGGRA, encriptada por rotação simples.

Rotação simples pode significar alguma versão da Cifra de César, provavelmente ROT13. Para isso, podemos usar sites como dcode ou criar um programa em python que automatize isso:

def rot(char, shift):
    return chr((ord(char) - ord('A') + shift)%26 + ord('A'))

def decode(ciphertext, shift):
    msg = ''
    for c in ciphertext:
        msg += rot(c, shift) if c.isalpha() else c
    return msg

ciphertext = 'YRIRY GJB CNFFJBEQ EBGGRA'
shift = 13
flag = decode(ciphertext, shift)
print(flag)

A resposta está na cifra decodificada por ROT13: LEVEL TWO PASSWORD ROTTEN.

Resposta: ROTTEN.

Krypton2

Temos no arquivo krypton3 a mensagem OMQEMDUEQMEK que está criptografada em Cifra de César.

Há duas formas de resolver esse nível.

Podemos criar uma pasta em /tmp/ e linkar a keyfile nele para usarmos o executável encrypt. Dessa forma, podemos encriptar um arquivo com a para descobrir a rotação usada.

Com isso, o arquivo encriptado terá a letra m, indicando que foi usado ROT12 para encriptação e deverá ser usado ROT14 para decriptação, obtendo a flag.

Outro modo, muito mais rápido, é usar o mesmo método do nível anterior, fazendo um brute-force das 26 rotações possíveis de uma Cifra de César.

def brute_force(ciphertext):
    for shift in range(26):
        print(decode(ciphertext, shift))

brute_force('OMQEMDUEQMEK')

A que tiver a frase mais legível é a flag.

Resposta: CAESARISEASY.

Krypton3

Para esse nível, temos no arquivo krypton4 a mensagem KSVVW BGSJD SVSIS VXBMN YQUUK BNWCU ANMJS, cifrada por alguma cifra de substituição simples. Nesse momento, usar brute-force não é mais uma opção.

Para resolver isso, podemos pegar o texto em found1 e aplicar uma análise de frequência em suas letras.

Uma ferramenta online extremamente eficiente está localizada em guabala.de. Utilizando sua análise de frequência, obtemos o mapeamento:

abcdefghijklmnopqrstuvwxyz     This clear text ...
qazwsxedcrfvtgbyhnujmikolp     ... maps to this cipher text

Podemos, assim, decriptar a mensagem com o site dcode utilizando o alfabeto de susbtituição acima. O resultado é o texto WELLD ONETH ELEVE LFOUR PASSW ORDIS BRUTE.

Resposta: BRUTE.

Krypton4

Nesse nível, há a mensagem HCIKV RJOX em krypton5, codificada pela Cifra de Vigenère.

Primeiro, precisamos descobrir a key da cifra. Para isso usaremos o texto em found1 e a ferramenta em dcode. Assim, encontramos a key FREKEY.

Dessa forma, utilizando novamente o dcode com a key, obtemos a flag.

Resposta: CLEARTEXT.

Krypton5

Para esse nível, também temos uma mensagem codificada pela Cifra de Vigenère, porém sem termos o conhecimento do tamanho da chave.

Para descobirir a key podemos usar o texto em found1 e a ferramenta em dcode. Usando a análise estatística, obtemos uma resposta parcial: KEYLEBGTH.

Essa resposta é próxima de um termo legível: KEYLENGTH. Testando essa key em found1 usando o dcode, vemos que ela decifra o texto perfeitamente.

Assim, decriptando o texto BELOS Z usando a key KEYLENGTH obtemos a flag.

Resposta: RANDOM.

Krypton6

Nesse último nível, a mensagem em krypton7 está codificada pelo método de One-Time Pad, usando o programa encrypt6.

Como temos o programa, podemos usar o método do Chosen-plaintext attack para descobrir seu funcionamento.

Primeiro, criamos uma pasta em /tmp/ para os arquivos desse nível

mkdir /tmp/files/

Depois, vamos criar um arquivo apenas com "A"s, para ser encriptado.

echo "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" > /tmp/files/a

Assim, encriptando ele por

./encrypt6 /tmp/files/a /tmp/files/out

obtemos a sequência EICTDGYIYZKTHNSIRFXYCPFUEOCKRNEICTDGYIYZKTHNS. Ao realizar o mesmo comando várias vezes, a resposta continua a mesma. Logo, a key não é aleatória.

Além disso, vemos que ela se repete produzindo a sequência EICTDGYIYZKTHNSIRFXYCPFUEOCKRN várias vezes.

Testando com um arquivo com apenas "B"s,

echo "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" > /tmp/files/b
./encrypt6 /tmp/files/b /tmp/files/out2

Obtemos a sequência FJDUEHZJZALUIOTJSGYZDQGVFPDLSOFJDUEHZJZALUIOT, que é exatamente a anterior com um shift a mais no alfabeto em cada caractere.

Assim, temos que o One-Time Pad não é aleatório, usa a mesma seed, cuja key repete ao longo da mensagem, e se comporta com shifts no alfabeto, como na cifra de Vigenère.

Por fim, um pequeno script em Python consegue recuperar a flag:

input = 'PNUKLYLWRQKGKBE'
key = 'EICTDGYIYZKTHNS'
base = ord('A')
flag = ''
for c_in, shift in zip(input, key):
    flag += chr( (ord(c_in) - ord(shift) - 2*base)%26 + base)

print(flag)

Resposta: LFSRISNOTRANDOM.

Outros Write-ups e arquivos

  • Nada ainda