cd ~/blog

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

ZipCrypto Known-Plaintext Attack (bkcrack)

miscautor: Jordy Pérez Osorio aviso legal
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.

La implementación actual de bkcrack requiere al menos 12 bytes conocidos en total, de los cuales 8 deben ser contiguos. Con ese material puede recuperar las claves internas sin conocer primero la contraseña. Esas claves permiten descifrar las entradas que utilicen la misma contraseña.

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. Condiciones necesarias

  1. El ZIP usa ZipCrypto (no AES). Se comprueba con 7z l -slt o bkcrack -L.
  2. El atacante conoce al menos 12 bytes del texto plano correspondiente a una entrada, con un mínimo de 8 bytes contiguos y en offsets conocidos.
  3. El texto conocido debe corresponder a los bytes que se cifraron. Cuando la entrada está comprimida, conocer la cabecera del archivo original no basta necesariamente porque ZipCrypto protege el flujo ya comprimido.

5. Validación y 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. Explotación documentada en 005-movie

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 Known-Plaintext Attack de Biham-Kocher. Con suficiente texto conocido y su posición, bkcrack puede recuperar las claves internas sin recuperar primero la contraseña. Sólo aplica a ZipCrypto, no a WinZip AES.

10. Referencias

// relacionados