Crypt, XOR, hackers ZIP e PRSP não criptografados. Solução de problemas com o r0ot-mi Crypto. Parte 2

imagem

Neste artigo, aprendemos sobre a função crypt, aprendemos como selecionar senhas para um arquivo ZIP com nomes de arquivos não criptografados, familiarizar-nos com o utilitário xortool e também lidar com um gerador de números pseudo-aleatórios. Artigos anteriores sobre este tópico:

Parte 1 - Codificações, shift cipher, hashes brutos e criação de imagens usando PIL python.

Informações Organizacionais
Especialmente para aqueles que desejam aprender algo novo e se desenvolver em qualquer uma das áreas de segurança da informação e da informática, escreverei e falarei sobre as seguintes categorias:

  • PWN;
  • criptografia (criptografia);
  • tecnologias de rede (rede);
  • reverso (engenharia reversa);
  • esteganografia (estegano);
  • pesquisa e exploração de vulnerabilidades na WEB.

Além disso, compartilharei minha experiência em análise forense de computadores, análise de malware e firmware, ataques a redes sem fio e redes locais, realização de protestos e explorações por escrito.

Para que você possa descobrir sobre novos artigos, software e outras informações, criei um canal no Telegram e um grupo para discutir quaisquer questões no campo da CID. Além disso, considerarei pessoalmente seus pedidos, perguntas, sugestões e recomendações pessoais e responderei a todos .

Todas as informações são fornecidas apenas para fins educacionais. O autor deste documento não se responsabiliza por nenhum dano causado a alguém como resultado do uso dos conhecimentos e métodos obtidos como resultado do estudo deste documento.


ELF64 - criptografia PID


imagem

Nós olhamos para o código fonte. O programa pega uma string como argumento e a compara com o que a função cryt retorna do PID do programa e a string "$ 1 $ awesome".

A função cryt é uma função de biblioteca usada para calcular o hash da senha. A saída da função não é apenas um hash, mas uma linha de texto que também contém salt, o algoritmo de hash usado e os parâmetros com os quais o hash foi recebido, como o número de rodadas e outras opções.

imagem

Esse recurso está incluído nas linguagens de programação Perl, PHP, Pike, Python e Ruby. Portanto, você precisa adivinhar o PID com o qual o programa será iniciado. Após a conexão via SSH, vemos que eles nos fornecem um programa, sua origem e um arquivo com uma senha.

imagem

No Linux, cada novo aplicativo em execução receberá o valor PID livre incremental mais aproximado. Por exemplo, execute ps várias vezes seguidas. O PID é incrementado a cada vez.

imagem

Portanto, você pode calcular o hash a partir de qualquer PID livre e, com esse valor como argumento, execute o programa infinitamente. Vamos pegar o PID, por exemplo, 30000 e executar a função de criptografia. Eu farei isso em python.

imagem

Agora execute um loop infinito de execução do programa.

imagem

E um minuto depois, obtemos um shell de onde lemos a senha.

imagem

Arquivo - PKZIP


imagem

Faça o download do arquivo que eles nos fornecerem. Este é um arquivo ZIP protegido por senha. Vamos passar a senha. Como os nomes dos arquivos não são criptografados, nós o tornamos o utilitário fcrackzip e usamos o rockyou.txt como um dicionário.

imagem

Após descompactar, obtemos um arquivo de texto onde diz que a resposta é a senha do arquivo.

imagem

Texto simples conhecido - XOR


imagem

Nos é dada uma imagem criptografada usando o XOR BMP. Como usamos o XOR (suponho com uma tecla curta) e temos um texto cifrado grande, você pode usar o xortool.

imagem

Assim, o xortool acredita que o comprimento mais provável da chave é 6. Vamos pedir que ele determine a chave.

imagem

Ótimo. A chave está definida, mas o próprio xortool descriptografou o arquivo e o salvou no diretório xortool_out.

imagem

Code - Gerador de números pseudo-aleatórios


imagem

Nos é dado um programa com o qual o arquivo é criptografado, assim como o próprio arquivo. Além disso, eles dizem que a criptografia ocorreu em dezembro de 2012. Vamos limpar o código.

No início do programa, o horário atual é memorizado (mais precisamente, o tempo decorrido desde 1º de janeiro de 1970). Em seguida, a presença do parâmetro do programa é verificada - o caminho para o arquivo.

imagem

imagem

Em seguida, esse arquivo é aberto para leitura e um novo arquivo é criado para gravação. Os descritores de ambos os arquivos são passados ​​para a função crypt_file.

imagem

No arquivo de criptografia, a função genere_key () inverte a chave de 32 bytes, usada para criptografar o arquivo XOR. O resultado da criptografia é gravado no arquivo recém-criado.

imagem

A chave é compilada de maneira pseudo-aleatória. No alfabeto apresentado em cada etapa, um valor é selecionado dependendo do valor do holdrand, que também muda a cada etapa, enquanto no início é igual ao tempo atual.

imagem

Portanto, precisamos gerar chaves possíveis. O código-fonte python se parece com isso.
keys = [] charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456789" l = len(charset) holdrand = None def Rand(): global holdrand holdrand = holdrand * 214013 + 2531011 return ((holdrand >> 16) & 0x7fff) def genere_key(): key = "".join( [ charset[Rand()%l] for _ in range(32) ] ) keys.append(key) start = ? fin = ? for ts in range(start, fin): holdrand = ts genere_key() 


Agora vamos lidar com os limites do tempo. Como a criptografia foi realizada em dezembro de 2012, precisamos classificar todos os valores possíveis de 1 a 31 de dezembro.

imagem

 start = 1354320000 fin = 1356998400 


Decidimos as fronteiras, mas ainda haverá muitas chaves. Felizmente, o arquivo tem sua extensão - este é o bz2.

imagem

Ou seja, os três primeiros bytes do arquivo devem ser "BZh", o quarto deve ser um dos caracteres de "1" a "9" e os próximos seis bytes devem ser 0x314159265359. Vamos adicionar um filtro para as chaves. Para fazer isso, precisamos dos primeiros bytes do texto cifrado.

imagem

 def key_filter(key): ctext = "\x23\x17\x5d\x70\x5a\x11\x6d\x67\x37\x08" BZh = "BZh" sign = "".join( [ chr(ord(ctext[i])^ord(BZh[i])) for i in range(3) ] ) byte4 = "".join( [ chr(ord(ctext[3])^ord(i)) for i in "123456789" ] ) bytePI = chr(ord(ctext[4])^0x31) if sign in key[:3] and key[3] in byte4 and key[4] in bytePI: print(key) 


E nós temos apenas uma chave.

imagem

E usando o mesmo xortool, é possível proxy do arquivo com a chave

imagem

Assim, você descriptografou o arquivo.

Você pode se juntar a nós no Telegram . Vamos montar uma comunidade na qual haverá pessoas versadas em muitas áreas da TI, para que possamos sempre nos ajudar em qualquer problema de segurança da informação e da TI.

Source: https://habr.com/ru/post/pt482680/


All Articles