Análisis SSL/TLS - OpenSSL, SSLScan y SSLyze
Análisis SSL/TLS: OpenSSL, SSLScan y SSLyze
Section titled “Análisis SSL/TLS: OpenSSL, SSLScan y SSLyze”Introducción a SSL/TLS
Section titled “Introducción a SSL/TLS”HTTP vs HTTPS
Section titled “HTTP vs HTTPS”HTTP (Hypertext Transfer Protocol) es un protocolo de comunicación utilizado para la transferencia de datos en la World Wide Web. Se utiliza para la transferencia de contenido de texto, imágenes, videos, hipervínculos, etc. El puerto predeterminado para HTTP es el puerto 80.
HTTPS (Hypertext Transfer Protocol Secure) es una versión segura de HTTP que utiliza SSL/TLS para cifrar la comunicación entre el cliente y el servidor. Utiliza el puerto 443 por defecto.
¿Por qué HTTPS es importante?
Section titled “¿Por qué HTTPS es importante?”La principal diferencia entre HTTP y HTTPS es que HTTPS utiliza una capa de seguridad adicional para cifrar los datos, lo que los hace más seguros para la transferencia.
Ventajas de HTTPS:
- ✅ Confidencialidad: Los datos se cifran durante la transmisión
- ✅ Integridad: Los datos no pueden ser modificados sin detección
- ✅ Autenticación: Verifica la identidad del servidor
- ✅ Confianza: Los usuarios ven el candado verde en el navegador
- ✅ SEO: Google favorece los sitios HTTPS en rankings
SSL vs TLS
Section titled “SSL vs TLS”- SSL (Secure Sockets Layer): Protocolo más antiguo, versiones 1.0, 2.0, 3.0
- TLS (Transport Layer Security): Evolución de SSL, versiones 1.0, 1.1, 1.2, 1.3
Hoy en día se usa TLS, aunque coloquialmente se sigue llamando “SSL”.
Certificados SSL/TLS
Section titled “Certificados SSL/TLS”Los certificados digitales son documentos electrónicos que vinculan una clave pública con una identidad (persona, organización, servidor web).
Tipos de certificados:
- DV (Domain Validated): Solo valida el dominio
- OV (Organization Validated): Valida dominio y organización
- EV (Extended Validation): Máxima validación con barra verde
Autoridades de Certificación (CA):
- DigiCert, GlobalSign, Let’s Encrypt, Comodo, etc.
OpenSSL
Section titled “OpenSSL”OpenSSL es una biblioteca de software libre y de código abierto que se utiliza para implementar protocolos de seguridad en línea, como TLS (Transport Layer Security) y SSL (Secure Sockets Layer). La biblioteca OpenSSL proporciona una implementación de estos protocolos para permitir que las aplicaciones se comuniquen de manera segura y encriptada a través de la red.
Instalación
Section titled “Instalación”# En distribuciones basadas en Debian/Ubuntusudo apt update && sudo apt install openssl
# En CentOS/RHEL/Fedorasudo yum install openssl # CentOS/RHELsudo dnf install openssl # Fedora
# En macOSbrew install openssl
# Compilación desde código fuentewget https://www.openssl.org/source/openssl-3.0.7.tar.gztar -xf openssl-3.0.7.tar.gzcd openssl-3.0.7./configmakesudo make installComandos Básicos de OpenSSL
Section titled “Comandos Básicos de OpenSSL”1. Inspeccionar Certificado SSL
Section titled “1. Inspeccionar Certificado SSL”# Comando básico para inspeccionar certificadoopenssl s_client -connect ejemplo.com:443
# Con más detalles y salida limpiaopenssl s_client -connect ejemplo.com:443 -servername ejemplo.com | openssl x509 -noout -text
# Solo información del certificadoopenssl s_client -connect ejemplo.com:443 -servername ejemplo.com 2>/dev/null | openssl x509 -noout -text2. Verificar Cadena de Certificación
Section titled “2. Verificar Cadena de Certificación”# Verificar la cadena completa de certificadosopenssl s_client -connect ejemplo.com:443 -showcerts
# Guardar certificados en archivos separadosopenssl s_client -connect ejemplo.com:443 -showcerts </dev/null 2>/dev/null | awk '/BEGIN CERTIFICATE/,/END CERTIFICATE/ {print > "cert" NR ".pem"}'3. Información del Certificado
Section titled “3. Información del Certificado”# Información básica del certificadoopenssl s_client -connect ejemplo.com:443 2>/dev/null | openssl x509 -noout -subject -issuer -dates
# Verificar validezopenssl s_client -connect ejemplo.com:443 2>/dev/null | openssl x509 -noout -checkend 0
# Fingerprint del certificadoopenssl s_client -connect ejemplo.com:443 2>/dev/null | openssl x509 -noout -fingerprint -sha2564. Análisis de Cifrados
Section titled “4. Análisis de Cifrados”# Ver cifrados soportados por el servidoropenssl s_client -connect ejemplo.com:443 -cipher 'ALL:eNULL' | grep "Cipher is"
# Probar un cifrado específicoopenssl s_client -connect ejemplo.com:443 -cipher AES128-SHA
# Ver todas las suites de cifrado disponiblesopenssl ciphers -v5. Generar y Gestionar Certificados
Section titled “5. Generar y Gestionar Certificados”# Generar clave privadaopenssl genrsa -out private.key 2048
# Generar CSR (Certificate Signing Request)openssl req -new -key private.key -out certificate.csr
# Generar certificado autofirmadoopenssl req -x509 -new -key private.key -out certificate.crt -days 365
# Ver contenido de un certificadoopenssl x509 -in certificate.crt -text -noout
# Convertir formatosopenssl x509 -in cert.pem -outform der -out cert.der # PEM a DERopenssl x509 -in cert.der -inform der -out cert.pem # DER a PEMScripts Útiles con OpenSSL
Section titled “Scripts Útiles con OpenSSL”Script de Monitoreo de Certificados
Section titled “Script de Monitoreo de Certificados”#!/bin/bash# check_ssl_cert.sh - Monitorea expiración de certificados SSL
DOMAINS=("ejemplo.com" "api.ejemplo.com" "admin.ejemplo.com")WARNING_DAYS=30CRITICAL_DAYS=7
for domain in "${DOMAINS[@]}"; do echo "Verificando $domain..."
# Obtener fecha de expiración expire_date=$(openssl s_client -connect "$domain:443" -servername "$domain" 2>/dev/null | openssl x509 -noout -enddate 2>/dev/null | cut -d= -f2)
if [ -z "$expire_date" ]; then echo "❌ ERROR: No se pudo obtener información del certificado para $domain" continue fi
# Convertir a timestamp expire_timestamp=$(date -d "$expire_date" +%s) current_timestamp=$(date +%s)
# Calcular días restantes days_left=$(( (expire_timestamp - current_timestamp) / 86400 ))
if [ $days_left -le $CRITICAL_DAYS ]; then echo "🚨 CRÍTICO: $domain expira en $days_left días ($expire_date)" elif [ $days_left -le $WARNING_DAYS ]; then echo "⚠️ ADVERTENCIA: $domain expira en $days_left días ($expire_date)" else echo "✅ OK: $domain expira en $days_left días ($expire_date)" fi echo ""doneScript de Escaneo de Cifrados Débiles
Section titled “Script de Escaneo de Cifrados Débiles”#!/bin/bash# weak_ciphers_check.sh - Verifica cifrados débiles
TARGET=$1WEAK_CIPHERS=("NULL" "EXPORT" "RC4" "DES" "3DES" "MD5")
if [ -z "$TARGET" ]; then echo "Uso: $0 <dominio>" exit 1fi
echo "Verificando cifrados débiles en $TARGET..."echo "========================================"
for cipher in "${WEAK_CIPHERS[@]}"; do echo "Probando cifrados $cipher..." result=$(openssl s_client -connect "$TARGET:443" -cipher "$cipher" 2>&1 | grep "Cipher is")
if [ $? -eq 0 ]; then echo "❌ VULNERABLE: Cifrado $cipher soportado" echo " $result" else echo "✅ Seguro: Cifrado $cipher no soportado" fi echo ""doneSSLScan
Section titled “SSLScan”SSLScan es una herramienta de línea de comandos que se utiliza para evaluar la configuración SSL/TLS de un servidor web. Proporciona información detallada sobre los protocolos SSL/TLS admitidos, el cifrado utilizado y los certificados SSL.
Instalación
Section titled “Instalación”# Instalación en Kali Linuxsudo apt update && sudo apt install sslscan
# Compilación desde código fuentegit clone https://github.com/rbsec/sslscan.gitcd sslscanmake staticsudo cp sslscan /usr/local/bin/Uso Básico
Section titled “Uso Básico”# Escaneo básicosslscan ejemplo.com
# Escaneo con puerto específicosslscan ejemplo.com:443
# Escaneo con opciones avanzadassslscan --no-colour --show-certificate ejemplo.comOpciones Principales
Section titled “Opciones Principales”| Opción | Descripción |
|---|---|
--no-colour | Salida sin colores |
--show-certificate | Muestra detalles del certificado |
--show-ciphers | Lista todos los cifrados probados |
--ssl2 | Fuerza uso de SSLv2 (deshabilitado por defecto) |
--ssl3 | Fuerza uso de SSLv3 (deshabilitado por defecto) |
--tls10 | Fuerza uso de TLS 1.0 |
--tls11 | Fuerza uso de TLS 1.1 |
--starttls-smtp | Usar STARTTLS para SMTP |
--starttls-imap | Usar STARTTLS para IMAP |
--starttls-pop3 | Usar STARTTLS para POP3 |
Ejemplos Prácticos
Section titled “Ejemplos Prácticos”1. Escaneo Completo
Section titled “1. Escaneo Completo”# Escaneo completo con todos los detallessslscan --no-colour --show-certificate --show-ciphers ejemplo.com2. Verificar Vulnerabilidades Comunes
Section titled “2. Verificar Vulnerabilidades Comunes”# Verificar Heartbleedsslscan --no-colour --heartbleed ejemplo.com
# Verificar POODLE (SSLv3)sslscan --no-colour --ssl3 ejemplo.com
# Verificar soporte para protocolos insegurossslscan --no-colour ejemplo.com | grep -E "(SSLv2|SSLv3|TLSv1.0|TLSv1.1)"3. Análisis de Certificado
Section titled “3. Análisis de Certificado”# Obtener información detallada del certificadosslscan --no-colour --show-certificate ejemplo.com | grep -A 20 "Certificate"4. Verificación de Configuración
Section titled “4. Verificación de Configuración”# Verificar configuración recomendadasslscan --no-colour ejemplo.com | grep -E "(Accepted|Preferred|Signature Algorithm)"Interpretación de Resultados
Section titled “Interpretación de Resultados”Códigos de Color (en terminal)
Section titled “Códigos de Color (en terminal)”- 🟢 Verde: Configuraciones seguras
- 🟡 Amarillo: Configuraciones aceptables pero mejorables
- 🔴 Rojo: Configuraciones inseguras o vulnerables
Protocolos Recomendados
Section titled “Protocolos Recomendados”- ✅ TLS 1.2 y TLS 1.3: Seguros
- ⚠️ TLS 1.0 y TLS 1.1: Obsoletos, deben deshabilitarse
- ❌ SSL 2.0 y SSL 3.0: Inseguros, nunca usar
Cifrados Recomendados
Section titled “Cifrados Recomendados”- ✅ AES-GCM: Cifrados modernos recomendados
- ✅ ChaCha20-Poly1305: Bueno para móviles
- ⚠️ AES-CBC: Aceptable pero vulnerable a ataques
- ❌ RC4, DES, 3DES: Inseguros
- ❌ NULL: Sin cifrado
SSLyze
Section titled “SSLyze”SSLyze es una herramienta de análisis de seguridad SSL/TLS más avanzada que SSLScan. Se enfoca en la evaluación exhaustiva de la configuración SSL/TLS de un servidor web, proporcionando información detallada sobre cifrados, protocolos, certificados y vulnerabilidades.
Instalación
Section titled “Instalación”# Usando pip (recomendado)pip3 install sslyze
# Desde código fuentegit clone https://github.com/nabla-c0d3/sslyze.gitcd sslyzepip3 install -r requirements.txtpython setup.py install
# Usando Dockerdocker run -it --rm nablac0d3/sslyze:latest sslyze --helpUso Básico
Section titled “Uso Básico”# Escaneo básicosslyze ejemplo.com
# Escaneo con opciones específicassslyze --regular ejemplo.com
# Escaneo completo (todos los plugins)sslyze --regular --certinfo --hide_rejected_ciphers --compression --heartbleed --openssl_ccs --fallback ejemplo.comPlugins Principales
Section titled “Plugins Principales”1. certificate_info
Section titled “1. certificate_info”Proporciona información detallada sobre el certificado SSL/TLS.
sslyze --certinfo ejemplo.com2. sslv2, sslv3, tlsv1, tlsv1_1, tlsv1_2, tlsv1_3
Section titled “2. sslv2, sslv3, tlsv1, tlsv1_1, tlsv1_2, tlsv1_3”Verifica soporte para diferentes versiones de protocolos.
# Verificar todas las versiones de protocolosslyze --sslv2 --sslv3 --tlsv1 --tlsv1_1 --tlsv1_2 --tlsv1_3 ejemplo.com
# Verificar solo versiones segurassslyze --tlsv1_2 --tlsv1_3 ejemplo.com3. resumption
Section titled “3. resumption”Verifica si el servidor soporta session resumption.
sslyze --resumption ejemplo.com4. compression
Section titled “4. compression”Verifica si el servidor es vulnerable a ataques CRIME (compresión).
sslyze --compression ejemplo.com5. heartbleed
Section titled “5. heartbleed”Verifica vulnerabilidad Heartbleed.
sslyze --heartbleed ejemplo.com6. openssl_ccs
Section titled “6. openssl_ccs”Verifica vulnerabilidad OpenSSL CCS.
sslyze --openssl_ccs ejemplo.com7. fallback
Section titled “7. fallback”Verifica si el servidor soporta downgrade attacks.
sslyze --fallback ejemplo.comEjemplos Avanzados
Section titled “Ejemplos Avanzados”1. Escaneo Completo de Seguridad
Section titled “1. Escaneo Completo de Seguridad”# Escaneo completo recomendadosslyze --regular \ --certinfo \ --hide_rejected_ciphers \ --compression \ --heartbleed \ --openssl_ccs \ --fallback \ --reneg \ --resum \ ejemplo.com2. Verificación de Configuración PFS
Section titled “2. Verificación de Configuración PFS”# Verificar Perfect Forward Secrecysslyze --regular --hide_rejected_ciphers ejemplo.com | grep -A 10 -B 10 "Forward Secrecy"3. Análisis de Cadena de Certificación
Section titled “3. Análisis de Cadena de Certificación”# Verificar cadena de certificadossslyze --certinfo --hide_rejected_ciphers ejemplo.com | grep -A 50 "Certificate"4. Monitoreo Continuo
Section titled “4. Monitoreo Continuo”#!/bin/bash# ssl_monitor.sh - Monitoreo continuo de configuración SSL
TARGET="ejemplo.com"LOG_FILE="ssl_monitor_$(date +%Y%m%d).log"
echo "Iniciando monitoreo SSL de $TARGET" | tee -a "$LOG_FILE"echo "Fecha: $(date)" | tee -a "$LOG_FILE"echo "========================================" | tee -a "$LOG_FILE"
# Escaneo completosslyze --regular --certinfo --compression --heartbleed --openssl_ccs --fallback "$TARGET" | tee -a "$LOG_FILE"
echo "" | tee -a "$LOG_FILE"echo "Monitoreo completado: $(date)" | tee -a "$LOG_FILE"Comparación entre Herramientas
Section titled “Comparación entre Herramientas”| Característica | OpenSSL | SSLScan | SSLyze |
|---|---|---|---|
| Complejidad | Baja | Media | Alta |
| Velocidad | Muy rápida | Rápida | Media |
| Profundidad | Media | Alta | Muy alta |
| Facilidad de uso | Media | Alta | Media |
| Vulnerabilidades | Básicas | Comunes | Avanzadas |
| Certificados | Detallado | Básico | Completo |
| Automatización | Limitada | Buena | Excelente |
Vulnerabilidades Comunes SSL/TLS
Section titled “Vulnerabilidades Comunes SSL/TLS”Heartbleed (CVE-2014-0160)
Section titled “Heartbleed (CVE-2014-0160)”Descripción: Vulnerabilidad en OpenSSL que permite a atacantes leer memoria del servidor.
Impacto: Acceso a claves privadas, nombres de usuario, contraseñas, etc.
Detección:
# Con SSLyzesslyze --heartbleed ejemplo.com
# Con SSLScansslscan --heartbleed ejemplo.comMitigación: Actualizar OpenSSL a versión 1.0.1g o superior.
POODLE (CVE-2014-3566)
Section titled “POODLE (CVE-2014-3566)”Descripción: Ataque que explota SSLv3 para realizar ataques man-in-the-middle.
Impacto: Descifrado de datos encriptados.
Detección:
# Verificar soporte SSLv3sslyze --sslv3 ejemplo.comsslscan --ssl3 ejemplo.comMitigación: Deshabilitar SSLv3, usar solo TLS 1.2+.
CRIME (CVE-2012-4929)
Section titled “CRIME (CVE-2012-4929)”Descripción: Ataque que explota compresión TLS para robar cookies.
Impacto: Robo de cookies de sesión.
Detección:
sslyze --compression ejemplo.comMitigación: Deshabilitar compresión TLS.
BEAST (CVE-2011-3389)
Section titled “BEAST (CVE-2011-3389)”Descripción: Ataque que explota cifrados CBC en TLS 1.0.
Impacto: Descifrado de datos encriptados.
Detección:
sslyze --tlsv1 ejemplo.com | grep "CBC"Mitigación: Usar TLS 1.1+ o cifrados AEAD (AES-GCM).
Logjam (CVE-2015-4000)
Section titled “Logjam (CVE-2015-4000)”Descripción: Ataque de downgrade que fuerza el uso de cifrados débiles.
Impacto: Degradación de seguridad a niveles export.
Detección:
sslyze --fallback ejemplo.comMitigación: Deshabilitar cifrados de 512 bits, usar DH parameters de 2048+ bits.
Mejores Prácticas SSL/TLS
Section titled “Mejores Prácticas SSL/TLS”Configuración Recomendada
Section titled “Configuración Recomendada”1. Protocolos
Section titled “1. Protocolos”- ✅ TLS 1.3 (máxima seguridad)
- ✅ TLS 1.2 (muy seguro)
- ❌ TLS 1.0/1.1 (obsoletos)
- ❌ SSL 2.0/3.0 (inseguros)
2. Cifrados Recomendados
Section titled “2. Cifrados Recomendados”ECDHE-RSA-AES256-GCM-SHA384ECDHE-RSA-AES128-GCM-SHA256ECDHE-RSA-AES256-SHA384ECDHE-RSA-AES128-SHA2563. Configuración del Servidor
Section titled “3. Configuración del Servidor”Apache:
SSLProtocol -all +TLSv1.2 +TLSv1.3SSLCipherSuite ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256SSLHonorCipherOrder onNginx:
ssl_protocols TLSv1.2 TLSv1.3;ssl_ciphers ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256;ssl_prefer_server_ciphers off;4. Certificados
Section titled “4. Certificados”- Usar certificados de 2048 bits o más
- Implementar HSTS (HTTP Strict Transport Security)
- Configurar renovación automática (Let’s Encrypt)
- Usar certificados wildcard cuando sea apropiado
Monitoreo Continuo
Section titled “Monitoreo Continuo”#!/bin/bash# ssl_monitoring.sh - Monitoreo completo SSL/TLS
TARGETS=("ejemplo.com" "api.ejemplo.com" "admin.ejemplo.com")REPORT_DIR="ssl_reports"mkdir -p "$REPORT_DIR"
for target in "${TARGETS[@]}"; do echo "Analizando $target..."
# Crear directorio para el target target_dir="$REPORT_DIR/$(date +%Y%m%d)_$target" mkdir -p "$target_dir"
# SSLyze completo sslyze --regular --certinfo --compression --heartbleed --openssl_ccs --fallback "$target" > "$target_dir/sslyze_report.txt"
# SSLScan sslscan --no-colour "$target" > "$target_dir/sslscan_report.txt"
# OpenSSL básico echo "Q" | openssl s_client -connect "$target:443" -servername "$target" 2>/dev/null | openssl x509 -noout -text > "$target_dir/openssl_cert.txt"
# Verificar expiración expire_date=$(openssl s_client -connect "$target:443" -servername "$target" 2>/dev/null | openssl x509 -noout -enddate 2>/dev/null | cut -d= -f2) if [ ! -z "$expire_date" ]; then days_left=$(( ($(date -d "$expire_date" +%s) - $(date +%s)) / 86400 )) echo "Días hasta expiración: $days_left" > "$target_dir/expiration.txt"
if [ $days_left -le 30 ]; then echo "⚠️ ALERTA: Certificado expira pronto ($days_left días)" >> "$target_dir/expiration.txt" fi fi
echo "Reportes generados en $target_dir"done
echo "Monitoreo SSL completado."Consideraciones Éticas y Legales
Section titled “Consideraciones Éticas y Legales”Uso Ético
Section titled “Uso Ético”✅ Permitido:
- Análisis de tus propios servidores
- Pruebas con autorización escrita
- Investigación académica
- Auditorías de seguridad autorizadas
❌ Prohibido:
- Escaneo de servidores ajenos sin permiso
- Uso para actividades maliciosas
- Violación de términos de servicio
- Acceso no autorizado a información
Marco Legal
Section titled “Marco Legal”Estados Unidos:
- CFAA (Computer Fraud and Abuse Act): Prohibe acceso no autorizado
- DMCA: Protección de propiedad intelectual
Unión Europea:
- GDPR: Protección de datos personales
- NIS Directive: Seguridad de infraestructuras críticas
Consideraciones importantes:
- Obtener permiso por escrito antes de cualquier análisis
- Documentar toda la metodología utilizada
- No almacenar información sensible obtenida
- Reportar vulnerabilidades encontradas de manera responsable
Reportes de Vulnerabilidades
Section titled “Reportes de Vulnerabilidades”Si encuentras vulnerabilidades durante un análisis autorizado:
- No explotes la vulnerabilidad
- Documenta los hallazgos detalladamente
- Reporta al propietario del sistema
- Espera confirmación antes de divulgar públicamente
Recursos Adicionales
Section titled “Recursos Adicionales”Herramientas Complementarias
Section titled “Herramientas Complementarias”# TestSSL.sh - Herramienta avanzada de testing SSLgit clone https://github.com/drwetter/testssl.sh.gitcd testssl.sh./testssl.sh ejemplo.com
# SSL Labs API# Verificación automática de calificación SSL Labscurl -s "https://api.ssllabs.com/api/v3/analyze?host=ejemplo.com" | jq .
# SSL Certificate Checker (online)# https://www.sslshopper.com/ssl-checker.htmlDocumentación Oficial
Section titled “Documentación Oficial”- OpenSSL: https://www.openssl.org/docs/
- SSLScan: https://github.com/rbsec/sslscan
- SSLyze: https://github.com/nabla-c0d3/sslyze
- RFC 5246: Especificación TLS 1.2
- RFC 8446: Especificación TLS 1.3
Certificaciones y Guías
Section titled “Certificaciones y Guías”- OWASP Testing Guide: Guías de testing SSL/TLS
- NIST SP 800-52: Guías de seguridad TLS
- Mozilla SSL Configuration Generator: https://ssl-config.mozilla.org/
Conclusiones
Section titled “Conclusiones”El análisis SSL/TLS es fundamental para garantizar la seguridad de las comunicaciones web. Las herramientas OpenSSL, SSLScan y SSLyze proporcionan diferentes niveles de profundidad y funcionalidad:
- OpenSSL: Ideal para inspección rápida y gestión de certificados
- SSLScan: Perfecto para evaluaciones rápidas de configuración SSL
- SSLyze: La herramienta más completa para análisis exhaustivo de seguridad
Puntos clave a recordar:
- HTTPS es esencial para la seguridad web moderna
- TLS 1.3 ofrece la máxima seguridad actual
- Los certificados deben renovarse antes de expirar
- Las vulnerabilidades conocidas deben parchearse inmediatamente
- El monitoreo continuo es crucial para mantener la seguridad
Recuerda: Siempre obtén autorización por escrito antes de realizar cualquier análisis SSL/TLS en sistemas que no te pertenecen. La seguridad debe ser proactiva, no reactiva.
Última actualización: 2025-01-23 Versión: 2.0