cd ~/blog

~/vulns/zipcrypto-known-plaintext-attack-bkcrack.md

ZipCrypto Known-Plaintext Attack (bkcrack)

misc 20-06-2026
cryptozippassword-cracking

~2 min de lectura


1. Descripción técnica del ataque

El cifrado ZipCrypto (también llamado "ZIP 2.0 / traditional PKWARE encryption") es el esquema clásico de protección por contraseña de los archivos ZIP. Es criptográficamente débil: su estado interno son 3 claves de 32 bits derivadas de la contraseña, y es vulnerable al ataque de texto plano conocido de Biham y Kocher.

Si el atacante conoce (o puede adivinar) al menos 12 bytes de texto plano contiguos de alguno de los archivos contenidos en el ZIP, puede recuperar las claves internas del cifrado sin necesidad de conocer la contraseña. Con esas claves puede descifrar todos los archivos del ZIP (que comparten el mismo flujo de claves).

A diferencia de un ataque de diccionario/fuerza bruta sobre la contraseña, este ataque es independiente de la longitud o complejidad de la contraseña: solo importa disponer de texto plano conocido. La herramienta de referencia es bkcrack.

Importante: esto solo afecta a ZipCrypto. Los ZIP cifrados con AES (WinZip AES) no son vulnerables a esta técnica.

2. Impacto de la vulnerabilidad

  • Descifrado completo de un ZIP protegido por contraseña sin crackear la contraseña.
  • Recuperación de archivos sensibles dentro del ZIP (claves SSH, credenciales, documentos).
  • Opcionalmente, reempaquetar el archivo con una contraseña nueva conocida.

3. Historia y evolución

  • El ataque teórico fue descrito por Eli Biham y Paul Kocher en 1994.
  • Durante años fue poco práctico hasta herramientas modernas; bkcrack (kimci86) lo hizo accesible y rápido.
  • Es un recurso recurrente en CTFs cuando aparece un ZIP ZipCrypto junto a algún archivo de formato conocido (HTML, PNG, PDF... con cabeceras predecibles).

4. Factores que lo hacen posible

  1. El ZIP usa ZipCrypto (no AES). Se comprueba con 7z l -slt o bkcrack -L.
  2. El atacante conoce ≥12 bytes de texto plano contiguos de algún archivo del ZIP (p. ej. <!DOCTYPE html>, la firma \x89PNG, etc.).

5. Detección

# Ver el método de cifrado de cada entrada
7z l -slt archivo.zip          # busca "Method = ZipCrypto"
bkcrack -L archivo.zip         # lista entradas y su cifrado

6. Mitigación

  1. Usar cifrado AES (WinZip AES-256) en lugar de ZipCrypto.
  2. Mejor aún, usar formatos/herramientas con cifrado autenticado moderno (7z-AES, age, gpg).
  3. No confiar en ZipCrypto para proteger datos sensibles.

7. Ejemplo de explotación real

Recuperación de una id_rsa dentro de un ZIP ZipCrypto (máquina Movie de HMV), usando home.html (que empieza por <!DOCTYPE html>) como texto plano conocido:

 bkcrack -L mydata_archive.zip
...
    1 ZipCrypto  Store  a7786ca6  552  564  home.html
    2 ZipCrypto  Store  00d78482  2602 2614 id_rsa

 echo '<!DOCTYPE html>' > plain
 zip plain.zip plain

 bkcrack -C mydata_archive.zip -c home.html -P plain.zip -p plain
...
[19:54:24] Keys
d706e724 da372a68 a79864b0

# Reempaquetar con una contraseña conocida
 bkcrack -C mydata_archive.zip -k d706e724 da372a68 a79864b0 -U pwned.zip password

8. Clasificación

  • Tipo: Known-Plaintext Attack on Weak Cipher (ZipCrypto / PKWARE 2.0)
  • CWE:
    • CWE-326 – Inadequate Encryption Strength
    • CWE-327 – Use of a Broken or Risky Cryptographic Algorithm

9. Resumen

ZipCrypto es un cifrado de ZIP débil, vulnerable al ataque de texto plano conocido de Biham-Kocher: con ≥12 bytes de texto plano de un archivo del ZIP, bkcrack recupera las claves internas y descifra todo el archivo sin crackear la contraseña. Solo aplica a ZipCrypto (no a AES). La defensa es usar cifrado AES. Para ZIP con AES, este ataque no aplica: ahí el camino es el ataque de diccionario clásico con zip2john + john.

// relacionados