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
ZipCryptojunto a algún archivo de formato conocido (HTML, PNG, PDF... con cabeceras predecibles).
4. Condiciones necesarias
- El ZIP usa ZipCrypto (no AES). Se comprueba con
7z l -sltobkcrack -L. - 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.
- 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 cifrado6. Mitigación
- Usar cifrado AES (WinZip AES-256) en lugar de ZipCrypto.
- Mejor aún, usar formatos/herramientas con cifrado autenticado moderno (7z-AES, age, gpg).
- 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 password8. 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.