Curiosioux

Blog Personal Dedicado a la Ciberseguridad

Romper ZIP mediante diccionario. Script en Python

Si un ZIP es vulnerable a un ataque por diccionario, herramientas como Hashcat nos pueden facilitar muchísimo la vida. Pero a veces podemos jugar a crear nuestras propias herramientas; por ejemplo, en Python.

En el siguiente Script simplemente tratamos de abrir el ZIP recolectando las “claves” de un diccionario que podemos descargar o crear nosotros mismos con Crunch. Enviaremos los intentos fallidos al dev/null hasta que aparezca la clave que buscamos.

https://github.com/ismael107/romperZipDic.py/blob/main/romperZipDic.py

Lo comentamos detalladamente, y así vamos aprendiendo.

#Indicamos al sistema operativo qué interprete debe usar

#!/usr/bin/env python

# Importamos los modulos que necesitamos
''' 
zipfile para manejar archivos ZIP; sys para manejar argumentos de linea de comandos y salir del programa y os para poder usar /dev/null 

''' 
import zipfile
import sys
import os

'''
Verificamos que el script esté se ejecute con tres argumentos, si no es así imprime 
un mensaje de uso correcto y sale.
'''

if len(sys.argv) != 3:
    print("Uso: python fuerzaBrutaZip.py <archivo_zip> <archivo_contraseñas>")
    sys.exit(1)
'''
Abre el archivo zip y el archivo de contraseñas sys.argv[1]y sys.argv[2]
se refieren a los argumentos que tomamos

'''
zFile = zipfile.ZipFile(sys.argv[1], "r")
passFile = open(sys.argv[2], "r")

# Lee las contraseñas del archivo
passwords = passFile.readlines()

# Abre /dev/null para redirigir las contraseñas incorrectas
with open(os.devnull, 'w') as devnull:
    # Intenta cada contraseña
    for password in passwords:
        password = password.strip()  # Elimina cualquier espacio o salto de línea
        try:
            # Itera sobre los archivos dentro del zip
            for info in zFile.infolist():
                # Intenta abrir el archivo con la contraseña
                zFile.extract(info, pwd=password.encode('utf-8'))
            # Si llegamos aquí, significa que la contraseña es correcta para todos los archivos
            print("password encontrado: " + password)
            zFile.close()
            passFile.close()
            sys.exit(0)  # Sal del script si la contraseña es encontrada
'''
Si hay un error (por ejemplo, una contraseña incorrecta), el bloque except captura la excepción. Si el error indica una "contraseña incorrecta", se imprime un mensaje al archivo devnull (efectivamente descartando la salida). Otros errores también se imprimen en devnull.

'''
        except (RuntimeError, zipfile.BadZipFile, zipfile.LargeZipFile) as e:
            if 'Bad password for file' in str(e):
                print(f"Contraseña incorrecta: {password}", file=devnull)
            else:
                print(f"Error desconocido: {e}", file=devnull)
        except Exception as e:
            print(f"Error desconocido: {e}", file=devnull)

# Cierra los archivos abiertos
zFile.close()
passFile.close()
print("No se encontró la contraseña correcta.")
sys.exit(1)

Vemos si funciona

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *