Skip to content

Instantly share code, notes, and snippets.

@ErnestoCobos
Created April 11, 2025 01:54
Show Gist options
  • Select an option

  • Save ErnestoCobos/70eb1f1e533060f9868e0c8418211dc6 to your computer and use it in GitHub Desktop.

Select an option

Save ErnestoCobos/70eb1f1e533060f9868e0c8418211dc6 to your computer and use it in GitHub Desktop.
#!/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