Created
April 11, 2025 01:54
-
-
Save ErnestoCobos/70eb1f1e533060f9868e0c8418211dc6 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/bin/bash | |
| # Archivo: probar_passwords.sh | |
| # | |
| # Uso: | |
| # ./probar_passwords.sh <KEY_FILE> <CERT_FILE> <CSV_FILE> | |
| # | |
| # Descripción: | |
| # Este script valida las contraseñas para descifrar la llave privada de la e.firma del SAT. | |
| # Recibe como argumentos: | |
| # - KEY_FILE: Archivo de la llave privada. | |
| # - CERT_FILE: Archivo del certificado (usualmente en formato DER). | |
| # - CSV_FILE: Archivo CSV con cabeceras "Title,Url,Username,Password,OTPAuth,Notes". | |
| # | |
| # El script extrae la clave pública del certificado y, para cada contraseña extraída del CSV, | |
| # intenta descifrar la llave privada. Si se logra y la clave pública de la llave coincide con la | |
| # del certificado, se notifica la contraseña correcta y el script se detiene. | |
| # | |
| # Nota: Este CSV es una exportación de una bóveda de 1Password que contiene las contraseñas a probar. | |
| # Verifica que se pasen tres argumentos | |
| if [ "$#" -ne 3 ]; then | |
| echo "Uso: $0 <KEY_FILE> <CERT_FILE> <CSV_FILE>" | |
| exit 1 | |
| fi | |
| KEY_FILE="$1" | |
| CERT_FILE="$2" | |
| CSV_FILE="$3" | |
| FOUND=0 | |
| # Extrae la clave pública del certificado. | |
| # Se asume que el certificado está en formato DER (usado comúnmente por el SAT). | |
| cert_pub_key=$(openssl x509 -inform DER -in "$CERT_FILE" -pubkey -noout 2>/dev/null) | |
| if [ -z "$cert_pub_key" ]; then | |
| echo "Error al extraer la clave pública del certificado. Verifica el formato (DER/PEM)." | |
| exit 1 | |
| fi | |
| # Procesa el archivo CSV (omitiendo la cabecera) | |
| while IFS=, read -r title url username password otpauth notes; do | |
| # Remueve posibles comillas en la contraseña. | |
| password=$(echo "$password" | sed 's/^"//; s/"$//') | |
| echo "Probando contraseña: $password" | |
| # Intenta descifrar la llave privada con la contraseña. | |
| key_pub=$(openssl rsa -in "$KEY_FILE" -passin pass:"$password" -pubout 2>/dev/null) | |
| if [ $? -eq 0 ]; then | |
| # Si se logró descifrar, compara la clave pública obtenida con la del certificado. | |
| if diff <(echo "$cert_pub_key") <(echo "$key_pub") >/dev/null 2>&1; then | |
| echo -e "\n¡Contraseña correcta encontrada: $password" | |
| FOUND=1 | |
| exit 0 | |
| else | |
| echo "La contraseña '$password' descifra la llave, pero no coincide con el certificado." | |
| fi | |
| fi | |
| done < <(tail -n +2 "$CSV_FILE") | |
| if [ "$FOUND" -eq 0 ]; then | |
| echo -e "\nNinguna contraseña funcionó." | |
| fi |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment