├── README.md ├── exportfile.sh └── pinguzip.sh /README.md: -------------------------------------------------------------------------------- 1 | Para ejecutar esta herramienta, simplemente debemos pasarle como argumentos el archivo .zip a crackear y un diccionario: 2 | 3 | ``` 4 | bash pinguzip.sh comprimido.zip diccionario.txt 5 | ``` 6 | 7 | ![imagen](https://github.com/Maalfer/PinguZip/assets/96432001/aa04327d-7dee-47df-8aab-39857f7a704c) 8 | -------------------------------------------------------------------------------- /exportfile.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Verificar que se haya proporcionado un archivo como argumento 4 | if [ -z "$1" ]; then 5 | echo "Por favor, proporciona la ruta del archivo que deseas agregar a ~/bin." 6 | exit 1 7 | fi 8 | 9 | # Ruta al archivo proporcionado 10 | SCRIPT_FILE="$1" 11 | 12 | # Verificar si el archivo existe 13 | if [ ! -f "$SCRIPT_FILE" ]; then 14 | echo "El archivo $SCRIPT_FILE no existe." 15 | exit 1 16 | fi 17 | 18 | # Crear el directorio ~/bin si no existe 19 | if [ ! -d "$HOME/bin" ]; then 20 | echo "Creando el directorio ~/bin..." 21 | mkdir -p "$HOME/bin" 22 | fi 23 | 24 | # Obtener el nombre del archivo y la extensión 25 | SCRIPT_NAME=$(basename "$SCRIPT_FILE") 26 | SCRIPT_NAME_NO_EXT="${SCRIPT_NAME%.sh}" 27 | 28 | # Copiar el archivo a ~/bin 29 | echo "Copiando $SCRIPT_FILE a ~/bin/$SCRIPT_NAME..." 30 | cp "$SCRIPT_FILE" "$HOME/bin/$SCRIPT_NAME" 31 | 32 | # Renombrar el archivo dentro de ~/bin para quitar la extensión .sh 33 | echo "Renombrando $SCRIPT_NAME a $SCRIPT_NAME_NO_EXT en ~/bin..." 34 | mv "$HOME/bin/$SCRIPT_NAME" "$HOME/bin/$SCRIPT_NAME_NO_EXT" 35 | 36 | # Dar permisos de ejecución al archivo copiado 37 | chmod +x "$HOME/bin/$SCRIPT_NAME_NO_EXT" 38 | 39 | # Asegurarse de que ~/bin esté en el PATH 40 | if ! grep -q "$HOME/bin" "$HOME/.zshrc"; then 41 | echo "Agregando ~/bin al PATH en ~/.zshrc..." 42 | echo "export PATH=\"$HOME/bin:\$PATH\"" >> "$HOME/.zshrc" 43 | echo "Recarga tu archivo ~/.zshrc para aplicar los cambios (usa 'source ~/.zshrc' o reinicia la terminal)." 44 | else 45 | echo "~/bin ya está en el PATH." 46 | fi 47 | 48 | echo "¡Listo! Ahora puedes ejecutar el script con el nombre $SCRIPT_NAME_NO_EXT desde cualquier lugar." 49 | -------------------------------------------------------------------------------- /pinguzip.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # ----------- CONFIGURACIÓN DE COLORES ----------- 4 | BLUE="\033[38;5;39m" 5 | YELLOW="\033[38;5;226m" 6 | GREEN="\033[38;5;46m" 7 | RED="\033[38;5;196m" 8 | RESET="\033[0m" 9 | 10 | # ----------- BANNER ----------- 11 | show_banner() { 12 | echo -e " 13 | ████████ ████ ██ ██ ██████ ██ ██ ████████ ████ ████████ 14 | ██ ██ ██ ███ ██ ██ ██ ██ ██ ██ ██ ██ ██ 15 | ██ ██ ██ ████ ██ ██ ██ ██ ██ ██ ██ ██ 16 | ████████ ██ ██ ██ ██ ██ ████ ██ ██ ██ ██ ████████ 17 | ██ ██ ██ ████ ██ ██ ██ ██ ██ ██ ██ 18 | ██ ██ ██ ███ ██ ██ ██ ██ ██ ██ ██ 19 | ██ ████ ██ ██ ██████ ████████ ████████ ████ ██ 20 | 21 | ${BLUE}[+]${RESET} - ${YELLOW}Made with love by The Penguin of Mario${RESET} 22 | " 23 | sleep 1 24 | } 25 | 26 | # ----------- VARIACIONES DE CONTRASEÑAS ----------- 27 | generate_variations() { 28 | local pass="$1" 29 | echo "$pass" 30 | echo "${pass}123" 31 | echo "${pass}!" 32 | echo "abc${pass}" 33 | echo "${pass^^}" 34 | echo "${pass,,}" 35 | echo "${pass:0:1}${pass:1}" 36 | } 37 | 38 | # ----------- MULTIPLATAFORMA ----------- 39 | setup_environment() { 40 | case "$(uname -s)" in 41 | Darwin*) STAT_CMD="stat -f %z"; SHASUM="shasum -a 256" ;; 42 | Linux*) STAT_CMD="stat -c %s"; SHASUM="sha256sum" ;; 43 | *) echo -e "${RED}Sistema operativo no soportado${RESET}"; exit 1 ;; 44 | esac 45 | } 46 | 47 | # ----------- MANEJO DE SEÑALES ----------- 48 | handle_interrupt() { 49 | echo -e "\n${YELLOW}[!] Interrupción detectada. Mostrando resumen...${RESET}" 50 | show_summary "${RED}INTERRUPCIÓN${RESET}" 51 | cleanup 52 | exit 1 53 | } 54 | 55 | # ----------- LIMPIEZA ----------- 56 | cleanup() { 57 | [[ -f "$ZIP_CACHE" ]] && rm -f "$ZIP_CACHE" 58 | } 59 | 60 | # ----------- RESUMEN ----------- 61 | show_summary() { 62 | local end_time=$(date +%s) 63 | local total_time=$((end_time - START_TIME)) 64 | echo -e "\n${BLUE}=== RESUMEN DE EJECUCIÓN ===" 65 | echo -e "Archivo analizado: ${YELLOW}$ZIPFILE${BLUE}" 66 | echo -e "Diccionario usado: ${YELLOW}$WORDLIST${BLUE}" 67 | echo -e "Tamaño del diccionario: ${YELLOW}$TOTAL_LINES líneas${BLUE}" 68 | echo -e "Variaciones activadas: ${YELLOW}${ENABLE_VARIATIONS}${BLUE}" 69 | echo -e "Contraseñas probadas: ${YELLOW}$ATTEMPT_COUNT${BLUE}" 70 | echo -e "Tiempo total: ${YELLOW}${total_time} segundos${BLUE}" 71 | [[ $total_time -gt 0 ]] && \ 72 | echo -e "Velocidad promedio: ${YELLOW}$((ATTEMPT_COUNT / total_time)) p/s${BLUE}" 73 | echo -e "Estado final: ${1}${RESET}" 74 | } 75 | 76 | # ----------- DEPENDENCIAS ----------- 77 | check_dependencies() { 78 | local missing=() 79 | # Herramienta zip preferente 80 | if command -v 7z &> /dev/null; then 81 | ZIP_TOOL="7z" 82 | ZIP_TEST_CMD="7z t -p{password} -y {zipfile} &>/dev/null" 83 | elif command -v unzip &> /dev/null; then 84 | ZIP_TOOL="unzip" 85 | ZIP_TEST_CMD="unzip -t -P {password} {zipfile} &>/dev/null" 86 | else 87 | missing+=("7z o unzip") 88 | fi 89 | 90 | if [[ ${#missing[@]} -gt 0 ]]; then 91 | echo -e "${RED}Faltan dependencias críticas:${RESET}" 92 | for m in "${missing[@]}"; do echo -e " - ${YELLOW}$m${RESET}"; done 93 | exit 1 94 | fi 95 | 96 | echo -e "${BLUE}[+]${RESET} Usando herramienta: ${YELLOW}$ZIP_TOOL${RESET}" 97 | } 98 | 99 | # ----------- FUNCIÓN GENÉRICA DE PRUEBA ----------- 100 | test_password() { 101 | local zipfile="$1" password="$2" 102 | local cmd="${ZIP_TEST_CMD//\{password\}/"$password"}" 103 | cmd="${cmd//\{zipfile\}/"$zipfile"}" 104 | eval "$cmd" 105 | } 106 | 107 | # ----------- CONFIG INICIAL ----------- 108 | trap handle_interrupt SIGINT 109 | VERBOSE=0 110 | ZIP_CACHE="" 111 | ENABLE_VARIATIONS=0 112 | START_TIME=0 113 | ATTEMPT_COUNT=0 114 | TOTAL_LINES=0 115 | 116 | # ----------- INICIO ----------- 117 | show_banner 118 | check_dependencies 119 | setup_environment 120 | 121 | # ----------- ARGUMENTOS ----------- 122 | while [[ "$#" -gt 0 ]]; do 123 | case $1 in 124 | -v) VERBOSE=1; shift ;; 125 | -vv) VERBOSE=2; shift ;; 126 | *) break ;; 127 | esac 128 | done 129 | 130 | if [[ "$#" -ne 2 ]]; then 131 | echo -e "${RED}Uso: $0 [-v|-vv] archivo.zip diccionario.txt${RESET}" 132 | exit 1 133 | fi 134 | 135 | ZIPFILE="$1" 136 | WORDLIST="$2" 137 | 138 | [[ ! -f "$ZIPFILE" ]] && echo -e "${RED}El archivo ZIP no existe${RESET}" && exit 1 139 | [[ ! -f "$WORDLIST" ]] && echo -e "${RED}El diccionario no existe${RESET}" && exit 1 140 | 141 | # ----------- VARIACIONES ----------- 142 | read -rp "$(echo -e "${BLUE}[?]${RESET} ¿Deseas probar variaciones de contraseñas? (s/n): ")" USE_VARIATIONS 143 | USE_VARIATIONS=${USE_VARIATIONS,,} 144 | [[ "$USE_VARIATIONS" =~ ^(s|si|y|yes)$ ]] && ENABLE_VARIATIONS=1 145 | 146 | # ----------- CACHE RAM ----------- 147 | ZIP_CACHE="/dev/shm/${ZIPFILE##*/}" 148 | cp "$ZIPFILE" "$ZIP_CACHE" && trap "cleanup" EXIT || exit 1 149 | 150 | # ----------- ESTADÍSTICAS ----------- 151 | START_TIME=$(date +%s) 152 | TOTAL_LINES=$(wc -l < "$WORDLIST") 153 | [[ $VERBOSE -ge 1 ]] && echo -e "${BLUE}Iniciando proceso con ${YELLOW}$TOTAL_LINES${BLUE} entradas base${RESET}" 154 | 155 | # ----------- ATAQUE ----------- 156 | while IFS= read -r base_password || [[ -n "$base_password" ]]; do 157 | password_list=("$base_password") 158 | [[ $ENABLE_VARIATIONS -eq 1 ]] && mapfile -t variations < <(generate_variations "$base_password") && password_list+=("${variations[@]}") 159 | 160 | for password in "${password_list[@]}"; do 161 | ((ATTEMPT_COUNT++)) 162 | 163 | [[ $VERBOSE -ge 2 ]] && echo -e "${YELLOW}Probando (${ATTEMPT_COUNT}): ${password:0:12}$([[ ${#password} -gt 12 ]] && echo '...')${RESET}" 164 | 165 | if test_password "$ZIP_CACHE" "$password"; then 166 | echo -e "\n\n${GREEN}[+] ¡Contraseña encontrada!: ${YELLOW}$password${RESET}" 167 | show_summary "${GREEN}ÉXITO${RESET}" 168 | exit 0 169 | fi 170 | 171 | if [[ $((ATTEMPT_COUNT % 100)) -eq 0 ]] || [[ $VERBOSE -ge 1 ]]; then 172 | elapsed=$(( $(date +%s) - START_TIME )) 173 | speed=$(( ATTEMPT_COUNT / (elapsed + 1) )) 174 | echo -ne "${BLUE}Progreso: ${YELLOW}$ATTEMPT_COUNT${BLUE} intentos | Velocidad: ${YELLOW}$speed p/s${BLUE} | Tiempo: ${YELLOW}${elapsed}s${RESET}\r" 175 | fi 176 | done 177 | done < "$WORDLIST" 178 | 179 | # ----------- FIN ----------- 180 | show_summary "${RED}FRACASO${RESET}" 181 | exit 1 182 | --------------------------------------------------------------------------------