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 chamadoextractall()que aceita o parâmetropwd. - 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
pyzipperem Python, pois ozipfilenativo 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.