¿Cómo puedo recuperar una lista de los conjuntos de cifrado SSL / TLS que ofrece un sitio web en particular?
Intenté openssl, pero si examina la salida:
$ echo -n | openssl s_client -connect www.google.com:443
CONNECTED(00000003)
depth=1 /C=ZA/O=Thawte Consulting (Pty) Ltd./CN=Thawte SGC CA
verify error:num=20:unable to get local issuer certificate
verify return:0
---
Certificate chain
0 s:/C=US/ST=California/L=Mountain View/O=Google Inc/CN=www.google.com
i:/C=ZA/O=Thawte Consulting (Pty) Ltd./CN=Thawte SGC CA
1 s:/C=ZA/O=Thawte Consulting (Pty) Ltd./CN=Thawte SGC CA
i:/C=US/O=VeriSign, Inc./OU=Class 3 Public Primary Certification Authority
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIDITCCAoqgAwIBAgIQL9+89q6RUm0PmqPfQDQ+mjANBgkqhkiG9w0BAQUFADBM
MQswCQYDVQQGEwJaQTElMCMGA1UEChMcVGhhd3RlIENvbnN1bHRpbmcgKFB0eSkg
THRkLjEWMBQGA1UEAxMNVGhhd3RlIFNHQyBDQTAeFw0wOTEyMTgwMDAwMDBaFw0x
MTEyMTgyMzU5NTlaMGgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlh
MRYwFAYDVQQHFA1Nb3VudGFpbiBWaWV3MRMwEQYDVQQKFApHb29nbGUgSW5jMRcw
FQYDVQQDFA53d3cuZ29vZ2xlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkC
gYEA6PmGD5D6htffvXImttdEAoN4c9kCKO+IRTn7EOh8rqk41XXGOOsKFQebg+jN
gtXj9xVoRaELGYW84u+E593y17iYwqG7tcFR39SDAqc9BkJb4SLD3muFXxzW2k6L
05vuuWciKh0R73mkszeK9P4Y/bz5RiNQl/Os/CRGK1w7t0UCAwEAAaOB5zCB5DAM
BgNVHRMBAf8EAjAAMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwudGhhd3Rl
LmNvbS9UaGF3dGVTR0NDQS5jcmwwKAYDVR0lBCEwHwYIKwYBBQUHAwEGCCsGAQUF
BwMCBglghkgBhvhCBAEwcgYIKwYBBQUHAQEEZjBkMCIGCCsGAQUFBzABhhZodHRw
Oi8vb2NzcC50aGF3dGUuY29tMD4GCCsGAQUFBzAChjJodHRwOi8vd3d3LnRoYXd0
ZS5jb20vcmVwb3NpdG9yeS9UaGF3dGVfU0dDX0NBLmNydDANBgkqhkiG9w0BAQUF
AAOBgQCfQ89bxFApsb/isJr/aiEdLRLDLE5a+RLizrmCUi3nHX4adpaQedEkUjh5
u2ONgJd8IyAPkU0Wueru9G2Jysa9zCRo1kNbzipYvzwY4OA8Ys+WAi0oR1A04Se6
z5nRUP8pJcA2NhUzUnC+MY+f6H/nEQyNv4SgQhqAibAxWEEHXw==
-----END CERTIFICATE-----
subject=/C=US/ST=California/L=Mountain View/O=Google Inc/CN=www.google.com
issuer=/C=ZA/O=Thawte Consulting (Pty) Ltd./CN=Thawte SGC CA
---
No client certificate CA names sent
---
SSL handshake has read 1777 bytes and written 316 bytes
---
New, TLSv1/SSLv3, Cipher is AES256-SHA
Server public key is 1024 bit
Compression: NONE
Expansion: NONE
SSL-Session:
Protocol : TLSv1
Cipher : AES256-SHA
Session-ID: 748E2B5FEFF9EA065DA2F04A06FBF456502F3E64DF1B4FF054F54817C473270C
Session-ID-ctx:
Master-Key: C4284AE7D76421F782A822B3780FA9677A726A25E1258160CA30D346D65C5F4049DA3D10A41F3FA4816DD9606197FAE5
Key-Arg : None
Start Time: 1266259321
Timeout : 300 (sec)
Verify return code: 20 (unable to get local issuer certificate)
---
solo muestra que el conjunto de cifrado es algo con AES256-SHA. Sé que podría atravesar el basurero hexadecimal de la conversación, pero esperaba algo un poco más elegante.
Preferiría hacer esto en Linux, pero Windows (u otro) estaría bien. Esta pregunta está motivada por las pruebas de seguridad que hago para PCI y las pruebas de penetración general.
Actualizar:
GregS señala a continuación que el servidor SSL selecciona de los conjuntos de cifrado del cliente. Entonces parece que necesitaría probar todas las suites de cifrado de una en una. Creo que puedo hackear algo juntos, pero ¿hay una manera más simple y a prueba de futuro (por ejemplo, nuevas cifras) para hacer esto?
gnutls-cli
?Respuestas:
Escribí un script bash para probar conjuntos de cifrado. Obtiene una lista de conjuntos de cifrado compatibles de OpenSSL e intenta conectarse usando cada uno. Si el apretón de manos es exitoso, se imprime
YES
. Si el apretón de manos no tiene éxito, se imprimeNO
, seguido del texto de error de OpenSSL.Aquí hay una salida de muestra que muestra 3 cifrados no compatibles y 1 cifrado compatible:
EDITAR: agregue flexibilidad ya que el host y el puerto se proporcionan como parámetro para el script
fuente
if [[ "$result" =~ "Cipher :" ]] ; then
lugar deif [[ "$result" =~ "Cipher is " ]] ; then
probar también SSL2 y renegociación segura:echo -n Testing ssl2... result=$(echo -n | openssl s_client -ssl2 -connect $SERVER 2>&1) if [[ "$result" =~ "Cipher :" ]] ; then echo supported. INSECURE! else echo no support, OK fi echo -n Testing SSL secure renegotiation... echo -n "" | openssl s_client -connect $SERVER 2>&1 | grep 'Secure Renegotiation'
Nmap con ssl-enum-ciphers
No hay una forma mejor o más rápida de obtener una lista de cifrados disponibles de un servicio de red. Además, nmap proporcionará una clasificación de fuerza de fuerte, débil o desconocido para cada cifrado disponible.
Primero, descargue el script nmap ssl-enum-ciphers.nse ( explicación aquí ). Luego, desde el mismo directorio que el script, ejecute nmap de la siguiente manera:
Lista de cifrados compatibles con un servidor HTTP
Lista de cifrados compatibles con un servidor IMAP
Aquí hay un fragmento de salida de un servidor Dovecot IMAP:
fuente
portrule = function() \n return true \n end
AUTH TLS
, etc., pero es posible.Sí, puede usar la herramienta en línea en el sitio web de SSL Labs para consultar la base de datos del servidor SSL público.
Aquí hay un fragmento de información que proporciona:
(captura de pantalla de los resultados de google.com)
fuente
sslscan es una pequeña y agradable utilidad.
Prueba la conexión con TLS y SSL (y el script de compilación puede vincularse con su propia copia de OpenSSL para que también se verifiquen las versiones obsoletas de SSL) e informa sobre las suites y el certificado de cifrado del servidor.
Ejemplo de salida para
google.com
(recortado para facilitar la lectura):fuente
yum install sslscan
funciona en CentOS 6.sudo dnf install sslscan
en Fedora 22 también.brew install sslscan
en OSXsudo apt-get install sslscan
en Ubuntu (12.04, por lo que todas las versiones posteriores deberían estar bien).Como este es un excelente hilo de referencia para las herramientas de escaneo SSL, enumeraré CipherScan que se creó hace un año y también puede identificar problemas con los cifrados de intercambio de claves. https://github.com/jvehent/cipherscan
Si quieres mi fork que soporta SNI y FreeBSD, la URL es https://github.com/oparoz/cipherscan
Es un script que llama
openssl s_client
y admite el uso de su propio binario OpenSSL para que pueda probar las próximas funciones o nuevos cifrados (chacha20 + poly1305 por ejemplo).También te permite conectarte a cualquier puerto que desees y usar starttlss.
Aquí hay una salida típica
Y aquí hay una lista de opciones.
La salida json es útil si está llamando esto desde otros scripts.
fuente
https://github.com/iSECPartners/sslyze
Este está basado en Python, funciona en Linux / Mac / Windows desde la línea de comandos.
fuente
Después de buscar un poco en Google, encontré esta prueba para SSL-TLS (OWASP-CM-001) :
y también: Foundstone SSL Digger es una herramienta para evaluar la fortaleza de los servidores SSL mediante la prueba de los cifrados admitidos. Se sabe que algunos de estos cifrados son inseguros.
fuente
Estoy usando para la mayoría de las pruebas SSL testssl.sh (consulte https://testssl.sh / devel version @ https://github.com/drwetter/testssl.sh . Comprueba vulnerabilidades, cifrados, protocolos, etc.
fuente
SSLScan es genial; una nueva herramienta SSLDiagnos funciona para Windows, o puede escribir un script usando el openssl s_client.
fuente
El script ssl-enum-ciphers de Nmap puede enumerar los cifrados compatibles y las versiones SSL / TLS, así como los compresores compatibles.
fuente
ssl-enum-ciphers
mucho más exhaustivamente.Si desea un buen resultado grepable (y soporte para verificar todas las versiones SSL / TLS)
Uso: ./script.sh www.url.com
fuente
openssl ciphers -tls1.1
y,openssl ciphers -tls1.2
sin embargo, esos parámetros no parecen existir ... Solo existe-tls1
(al menos en las plataformas que he probado).tls1_1
y,tls1_2
pero solo se muestran en la versión maestra de openssl y ni siquiera en 1.0.2 ....)Hay un pequeño script en pentesterscripting.com para utilizar tanto SSLScan como OpenSSL para verificar:
http://www.pentesterscripting.com/discovery/ssl_tests (a través de Internet Archive Wayback Machine )
Duplicado aquí para futuras pruebas ya que el sitio principal ahora está muerto:
Uso: ./ssltest.sh PUERTO ANFITRIÓN
fuente
Basado en la respuesta de @ indiv y la sugerencia de publicarlo como su propia respuesta, proporciono mi versión ajustada del script de @ indiv. Puede proporcionar un host como primer argumento, y generará los mismos resultados que el script original, pero un poco más formateado:
fuente
El libro de cocina OpenSSL (gratuito) de Ivan Ristić, quien desarrolló la herramienta en línea SSL Labs que se menciona en la respuesta de Kez , dice:
(Mi énfasis)
Una herramienta que no he visto mencionada en otras respuestas es el SSLTest de Stephen Bradshaw , que, entre otras cosas, tiene la intención de comparar "los cifrados y protocolos detectados con los estándares de cumplimiento como DSD ISM y PCI-DSS".
Por lo tanto, pruebe esta o una de las herramientas mencionadas en las otras respuestas, o bien cree la suya propia y considere usar el enfoque de Ristić de apretones de manos parciales.
fuente
Escribí una herramienta que hace exactamente esto. Se llama tlsenum y está disponible en GitHub .
Aquí hay un ejemplo de salida de la herramienta contra
twitter.com
.Es similar a lo que hace SSL Lab, pero creo que tener una herramienta de línea de comandos que puede automatizar y analizar es mucho más útil.
fuente
SSLyze, originalmente en https://github.com/iSECPartners/sslyze , ahora está en https://github.com/nabla-c0d3/sslyze . Fue mencionado en otra respuesta , pero sin muchos detalles.
SSLyze está basado en Python y funciona en Linux / Mac / Windows desde la línea de comandos. Utiliza OpenSSL, y en Windows, viene con una copia incluida de OpenSSL.
Enumera protocolos, conjuntos de cifrado y detalles clave, además de pruebas para algunas vulnerabilidades comunes. Es posible habilitar o deshabilitar verificaciones particulares, obtener más datos o acelerar el escaneo.
fuente
Lo único que puede hacer es probarlos todos, uno a la vez, y ver cuáles son aceptados. No conozco una herramienta para hacer esto, aunque no debería ser difícil improvisar una de las herramientas de scripting y
openssl s_client
.Mientras el cliente anuncia qué conjuntos de cifrado aceptará, el servidor simplemente elige uno y lo usa o falla la conexión si no encuentra nada que le guste.
fuente
Todas esas respuestas están bien. Una parte de la respuesta podría explicar por qué necesitamos una herramienta para descubrir la lista de servidores y no preguntar directamente en TLS que ese servidor proporciona todas sus suites de cifrado compatibles al igual que el cliente TLS cuando se conecta a un servidor.
La respuesta es que el servidor nunca envía una lista , solo selecciona en la lista de cifrado del cliente el cifrado que quiere usar, esta es la forma en que se escribe el protocolo SSL / TLS: http://wiki.opensslfoundation.com/index.php/ SSL_and_TLS_Protocols # Cipher_Suites
Es por eso que el cliente tiene que enumerar los cifrados para poder encontrar aquellos compatibles con el servidor y para eso hacer al menos un nuevo protocolo de enlace de inicio (ClientHello) para cada conjunto de cifrado.
fuente
Mientras buscaba algo que funciona
AUTH TLS
en FTP, descubrí esta herramienta: ssl-cipher-suite-enumEs un script perl que básicamente hace lo que hace el script shell de hackajar, solo que más sofisticado.
También ofrece una evaluación básica de los cifrados y protocolos ofrecidos. Es algo así como las herramientas de SSL Labs, solo para uso doméstico. :)
Por defecto, solo es compatible
AUTH SSL
con FTP, pero una simple búsqueda y reemplazo puede solucionarlo. Como beneficio adicional, también afirma que admite SMTP conSTARTTLS
y RDP.fuente
TestSSLServer es una solución puramente basada en Java. Ventajas:
funciona a muy bajo nivel, solo en Sockets simples, por lo que es independiente de posibles cifrados no disponibles de JDK u OpenSSL .
no requiere que se abra ningún puerto adicional (como ICMP para ping)
está trabajando con certificados de clientes presentes
Desventajas
Mi experiencia personal: dado un servidor de enlace estrecho con un solo puerto HTTPS abierto (ningún otro puerto), se requieren certificados de cliente e iptables activo, todavía era capaz de enumerar los cifrados disponibles, mientras que las soluciones más votadas no estaban (estaba prueba de script de shell pequeño, SSL Labs, NMap, sslscan)
fuente