
Quebre a criptografia legada de zip com o ataque de texto claro conhecido de Biham e Kocher.
Quebre a criptografia legada de zip com o ataque de texto claro conhecido de Biham e Kocher.
Um arquivo ZIP pode conter muitas entradas cujo conteúdo pode ser comprimido e/ou criptografado. Em particular, as entradas podem ser criptografadas com um algoritmo de criptografia simétrica baseado em senha, conhecido como criptografia tradicional PKWARE, criptografia legada ou ZipCrypto. Este algoritmo gera um fluxo pseudoaleatório de bytes (keystream) que é aplicado XOR ao conteúdo da entrada (texto claro) para produzir dados criptografados (texto cifrado). O estado do gerador, composto por três inteiros de 32 bits, é inicializado usando a senha e depois continuamente atualizado com o texto claro à medida que a criptografia avança. Este algoritmo de criptografia é vulnerável a ataques de texto claro conhecido, conforme demonstrado por Eli Biham e Paul C. Kocher no artigo de pesquisa A known plaintext attack on the PKZIP stream cipher. Dado o texto cifrado e 12 ou mais bytes do texto claro correspondente, o estado interno do gerador de keystream pode ser recuperado. Este estado interno é suficiente para decifrar completamente o texto cifrado, bem como outras entradas que foram criptografadas com a mesma senha. Também pode ser usado para forçar a senha com complexidade nl-6, onde n é o tamanho do conjunto de caracteres e l é o comprimento da senha.
bkcrack é uma ferramenta de linha de comando que implementa este ataque de texto claro conhecido. As principais funcionalidades são:
Você pode obter o lançamento oficial mais recente no GitHub.
Pacotes pré-compilados para Ubuntu, MacOS e Windows estão disponíveis para download. Extraia o arquivo baixado no local desejado.
No Windows, as bibliotecas de tempo de execução da Microsoft são necessárias para o bkcrack funcionar. Se elas não estiverem instaladas no seu sistema, baixe e instale o pacote Microsoft Visual C++ Redistributable mais recente.
Alternativamente, você pode compilar o projeto com CMake.
Primeiro, baixe os arquivos fonte ou clone o repositório git.
Em seguida, execute os seguintes comandos na árvore de origem para criar uma instalação na pasta install.
cmake -S . -B build -DCMAKE_INSTALL_PREFIX=install
cmake --build build --config Release
cmake --build build --config Release --target install
bkcrack está disponível nos repositórios de pacotes listados abaixo. Esses pacotes são fornecidos por mantenedores externos.
Você pode ver uma lista de nomes de entradas e metadados em um arquivo chamado archive.zip da seguinte forma:
bkcrack -L archive.zip
As entradas que usam criptografia ZipCrypto são vulneráveis a um ataque de texto claro conhecido.
O ataque requer pelo menos 12 bytes de texto claro conhecido. Pelo menos 8 deles devem ser contíguos. Quanto maior o texto claro contíguo conhecido, mais rápido o ataque.
Tendo um arquivo zip encrypted.zip com a entrada cipher sendo o texto cifrado e plain.zip com a entrada plain como o texto claro conhecido, o bkcrack pode ser executado assim:
bkcrack -C encrypted.zip -c cipher -P plain.zip -p plain
Tendo um arquivo cipherfile com o texto cifrado (começando com os 12 bytes correspondentes ao cabeçalho de criptografia) e plainfile com o texto claro conhecido, o bkcrack pode ser executado assim:
bkcrack -c cipherfile -p plainfile
Se o texto claro corresponder a uma parte diferente do início do texto cifrado, você pode especificar um deslocamento. Ele pode ser negativo se o texto claro incluir uma parte do cabeçalho de criptografia.
bkcrack -c cipherfile -p plainfile -o offset
Se você conhece pouco texto claro contíguo (entre 8 e 11 bytes), mas conhece alguns bytes em alguns outros deslocamentos conhecidos, você pode fornecer essas informações para atingir o requisito de um total de 12 bytes conhecidos.
Para isso, use a flag -x seguida por um deslocamento e bytes em hexadecimal.
bkcrack -c cipherfile -p plainfile -x 25 4b4f -x 30 21
Se o ataque for bem-sucedido, os dados decifrados associados ao texto cifrado usado no ataque podem ser salvos:
bkcrack -c cipherfile -p plainfile -d decipheredfile
Se as chaves forem conhecidas de um ataque anterior, é possível usar o bkcrack para decifrar dados:
bkcrack -c cipherfile -k 12345678 23456789 34567890 -d decipheredfile
Os dados decifrados podem estar comprimidos, dependendo se a compressão foi usada ou não quando o arquivo zip foi criado.
Se a compressão deflate foi usada, um script Python 3 fornecido na pasta tools pode ser usado para descomprimir os dados.
python3 tools/inflate.py < decipheredfile > decompressedfile
Para obter acesso a todas as entradas do arquivo criptografado em uma única etapa, você pode gerar um novo arquivo com o mesmo conteúdo, mas sem criptografia. Isso assume que todas as entradas foram originalmente criptografadas com a mesma senha.
bkcrack -C encrypted.zip -k 12345678 23456789 34567890 -D decrypted.zip
Também é possível gerar um novo arquivo criptografado com a senha de sua escolha:
bkcrack -C encrypted.zip -k 12345678 23456789 34567890 -U unlocked.zip new_password
Você também pode definir a nova senha por sua representação interna correspondente.
bkcrack -C encrypted.zip -k 12345678 23456789 34567890 --change-keys unlocked.zip 581da44e 8e40167f 50c009a0
Esses dois comandos podem ser usados juntos para alterar o conteúdo de um arquivo criptografado sem conhecer a senha, mas conhecendo apenas as chaves internas: você pode fazer uma cópia criptografada com a senha de sua escolha, depois editar a cópia com um gerenciador de arquivos inserindo a senha escolhida quando solicitado, e finalmente fazer uma cópia do arquivo modificado de volta com as chaves de criptografia originais.
Dadas as chaves internas, o bkcrack pode tentar encontrar a senha original.
Você pode procurar uma senha usando caracteres em um determinado conjunto de caracteres:
bkcrack -k 1ded830c 24454157 7213b8c5 -b ?p
Você pode restringir a busca a senhas de um determinado comprimento ou a uma faixa de comprimentos:
bkcrack -k 1ded830c 24454157 7213b8c5 -b ?p -l 9
bkcrack -k 1ded830c 24454157 7213b8c5 -b ?p -l 8..10
A opção -r <length> <charset> é um atalho para -l 0..<length> -b <charset>:
bkcrack -k 1ded830c 24454157 7213b8c5 -r 10 ?p
Se você tem algum conhecimento sobre como a senha é formada, pode especificar uma máscara para restringir o espaço de busca e tornar a recuperação muito mais rápida. Isso é relevante para senhas longas (como aquelas com 12 ou mais caracteres) para as quais a força bruta se torna muito demorada.
Por exemplo, supondo que você se lembre vagamente que sua senha é composta por 8 letras minúsculas, um hífen e 6 dígitos decimais, você pode usar este comando:
bkcrack -k 1940e266 d3fd3d89 71ce9871 -m ?l?l?l?l?l?l?l?l-?d?d?d?d?d?d
Isso é executado em milissegundos, enquanto a alternativa de força bruta leva horas.
O espaço de busca tanto para força bruta quanto para recuperação baseada em máscara é definido com conjuntos de caracteres (charsets). Um charset é uma sequência de caracteres ou atalhos para charsets existentes. Os charsets predefinidos estão listados abaixo.
Além dos charsets predefinidos, você pode definir charsets personalizados com a opção -s.
Os charsets personalizados podem referenciar charsets predefinidos ou outros charsets personalizados.
Eles são especialmente úteis para a especificação precisa do espaço de busca na recuperação baseada em máscara.
Por exemplo, se você sabe que sua senha é composta por 10 letras (maiúsculas ou minúsculas) e 5 dígitos binários, pode usar este comando:
bkcrack -k b8c377a6 f603160f 1832a78b -m ?x?x?x?x?x?x?x?x?x?x?y?y?y?y?y -s x ?u?l -s y 01
Um tutorial é fornecido na pasta example.
Para mais informações, consulte a documentação e leia o código fonte.
Não hesite em sugerir melhorias ou enviar pull requests no GitHub.
Se você gostaria de mostrar seu apoio ao projeto, sinta-se à vontade para fazer uma doação ou patrocinar o projeto através do GitHub Sponsors.
Este projeto é fornecido sob os termos da licença zlib/png.
| Atalho | Descrição | Valor |
|---|
?l | letras minúsculas | abcdefghijklmnopqrstuvwxyz |
?u | letras maiúsculas | ABCDEFGHIJKLMNOPQRSTUVWXYZ |
?d | dígitos decimais | 0123456789 |
?s | caracteres especiais | !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~ |
?a | caracteres alfanuméricos | igual a ?l?u?d |
?p | caracteres ASCII imprimíveis | igual a ?l?u?d?s |
?b | todos os bytes | 0x00 .. 0xff |