Pregunta ¿Cómo incluyo las suites de cifrado SSL / TLS que ofrece un sitio web en particular?


¿Cómo puedo recuperar una lista de las suites de cifrado SSL / TLS que ofrece un sitio web en particular?

He intentado con openssl, pero si examinas el resultado:

$ 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 pasar apresuradamente por el maleficio 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 generales de penetración.

Actualizar: 

GregS señala a continuación que el servidor SSL selecciona de las suites de cifrado del cliente. Así que parece que necesitaría probar todas las suites de cifrado de a una por vez. Creo que puedo hackear algo juntos, pero ¿hay alguna manera más simple y más a prueba de futuro (por ejemplo, nuevas cifras) para hacer esto?


229


origen


Tal vez gnutls-cli? - grawity
Después del cambio de título, esta pregunta realmente no está pidiendo un software-rec. Votando para reabrir - Bob
@ fixer1234 Si te hace más feliz, he eliminado cualquier aparición de la palabra "herramienta". La pregunta central es preguntar cómo cumplir una tarea específica de todos modos; es una frase de reformulación menor y está lejos de ser una lista más abierta de preguntas de tipo "software". - Bob
@Bob: estoy en éxtasis. :-) Votación para reabrir. - fixer1234


Respuestas:


Escribí un script bash para probar suites de cifrado. Obtiene una lista de suites de cifrado admitidas de OpenSSL e intenta conectarse utilizando cada una. Si el saludo de manos es exitoso, imprime YES. Si el saludo de manos no es exitoso, imprime NO, seguido del texto de error de OpenSSL.

#!/usr/bin/env bash

# OpenSSL requires the port number.
SERVER=$1
DELAY=1
ciphers=$(openssl ciphers 'ALL:eNULL' | sed -e 's/:/ /g')

echo Obtaining cipher list from $(openssl version).

for cipher in ${ciphers[@]}
do
echo -n Testing $cipher...
result=$(echo -n | openssl s_client -cipher "$cipher" -connect $SERVER 2>&1)
if [[ "$result" =~ ":error:" ]] ; then
  error=$(echo -n $result | cut -d':' -f6)
  echo NO \($error\)
else
  if [[ "$result" =~ "Cipher is ${cipher}" || "$result" =~ "Cipher    :" ]] ; then
    echo YES
  else
    echo UNKNOWN RESPONSE
    echo $result
  fi
fi
sleep $DELAY
done

Aquí hay un ejemplo de salida que muestra 3 cifrados no compatibles y 1 cifrado compatible:

[@linux ~]$ ./test_ciphers 192.168.1.11:443
Obtaining cipher list from OpenSSL 0.9.8k 25 Mar 2009.
Testing ADH-AES256-SHA...NO (sslv3 alert handshake failure)
Testing DHE-RSA-AES256-SHA...NO (sslv3 alert handshake failure)
Testing DHE-DSS-AES256-SHA...NO (sslv3 alert handshake failure)
Testing AES256-SHA...YES

EDITAR: agregue flexibilidad ya que el host y el puerto se proporcionan como parámetro para la secuencia de comandos


199



openssl 1.0 necesita un cambio: if [[ "$result" =~ "Cipher :" ]] ; then en lugar de if [[ "$result" =~ "Cipher is " ]] ; then También pruebo 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' - Hubert Kario
Existe otro script de shell muy sofisticado que utiliza sslscan y openssl: TLSSLed - Robert
He enumerado a continuación otra secuencia de comandos que solo requiere OpenSSL llamado CipherScan - Olivier - interfaSys
Tenga en cuenta que este script probablemente no lo hará decirle si un servidor admite conjuntos de cifrado que OpenSSL no admite. - sampablokuper
La sugerencia de @Robert para TLSSLed fue fantastico. Se ha actualizado a 1.3 y tiene mucha más funcionalidad. He estado usando pruebas de seguridad y debo decir que estoy impresionado. - John Yeary


Nmap con ssl-enum-cifra

No hay una manera mejor ni más rápida de obtener una lista de cifrados disponibles de un servicio de red. Más, nmap proporcionará una calificación de resistencia de fuerte, débil o desconocida para cada cifra disponible.

Primero, descarga el ssl-enum-ciphers.nse secuencia de comandos nmap (explicación aquí) Luego, desde el mismo directorio que el script, ejecute nmap de la siguiente manera:

Cifrados de lista admitidos por un servidor HTTP

$ nmap --script ssl-enum-ciphers -p 443 www.example.com

Cifrados de lista admitidos por un servidor IMAP

$ nmap --script ssl-enum-ciphers -p 993 mail.example.com

Aquí hay un fragmento de salida de un servidor IMAP de Dovecot:

993/tcp open  imaps
| ssl-enum-ciphers:
|   SSLv3:
|     ciphers:
|       TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA - strong
|       TLS_DHE_RSA_WITH_AES_128_CBC_SHA - strong
|       TLS_DHE_RSA_WITH_AES_256_CBC_SHA - strong
|       TLS_RSA_WITH_IDEA_CBC_SHA - weak
...
|   TLSv1.0:
|     ciphers:
|       TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA - strong
|       TLS_DHE_RSA_WITH_AES_128_CBC_SHA - strong
|       TLS_DHE_RSA_WITH_AES_256_CBC_SHA - strong
|       TLS_RSA_WITH_IDEA_CBC_SHA - weak
...
|_  least strength: weak

Nmap done: 1 IP address (1 host up) scanned in 1.03 seconds

128



¿Hay alguna forma de utilizar esta secuencia de comandos en IMAP con STARTTLS? STARTTLS en SMTP parece funcionar, pero en IMAP el script ni siquiera parece ejecutarse. - Giel
Un par de cosas: es posible que esté ejecutando el script en su distribución nmap, en lugar de la que descargó. Compruebe cambiando el nombre del suyo. Luego verifique la "portrule", que en algunas versiones verifica los números de puerto comúnmente utilizados. Reemplazar con portrule = function() \n return true \n end - slim
... y necesitaría algo de piratería para trabajar con IMAP STARTTLS, FTPS AUTH TLS etc., pero es posible. - slim
Una advertencia es que las secuencias de comandos más antiguas, que pueden estar incluidas en su distribución / paquete, enumeran las cifras en orden alfabético, no orden preferida del servidor (o cliente). Mira el comentario anterior de @slim - Clint Pachl
En los 2 años transcurridos desde que se escribió esta respuesta, Nmap ha agregado soporte para STARTTLS a través de FTP, NNTP, IMAP, LDAP, POP3, PostgreSQL, SMTP, XMPP, VNC y MS SQL, además de muchas otras mejoras más allá de la simple enumeración de cifrados compatibles . - bonsaiviking


¿Hay alguna herramienta que pueda probar qué   Las suites de cifrado SSL / TLS un particular   ofertas de sitios web?

Sí, podría usar la herramienta en línea en Laboratorios SSL'sitio web para consultar la base de datos del servidor SSL público.

Aquí hay un fragmento de información que proporciona:

alt text

(captura de pantalla de los resultados de google.com)


94



genial, gracias por encontrar eso. - James K Polk
Esto es exactamente lo que estaba buscando! ¡Muchas gracias! - Jeremy Powell
Desafortunadamente solo admite HTTPS en un puerto estándar, no puede usarlo para verificar POP3S, IMAPS o IMAP con TLS - Hubert Kario
Y aunque solo es compatible con HTTPS, incluso carece de soporte para SNI. - Gurken Papst
Y si bien es ideal para sitios públicos, no puede usarlo para sitios en redes aisladas de Internet. - Iszi


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) y los informes sobre las suites y el certificado de cifrado del servidor.

Ejemplo de salida para google.com (recortado para facilitar la lectura):

$ sslscan google.com
Testing SSL server google.com on port 443

 TLS renegotiation:
Secure session renegotiation supported

  TLS Compression:
Compression disabled

  Heartbleed:
TLS 1.2 not vulnerable to heartbleed
TLS 1.1 not vulnerable to heartbleed
TLS 1.0 not vulnerable to heartbleed

  Supported Server Cipher(s):
Preferred TLSv1.2  128 bits  ECDHE-RSA-AES128-GCM-SHA256   Curve P-256 DHE 256
Accepted  TLSv1.2  128 bits  ECDHE-RSA-AES128-SHA          Curve P-256 DHE 256
Accepted  TLSv1.2  128 bits  ECDHE-RSA-RC4-SHA             Curve P-256 DHE 256
Accepted  TLSv1.2  128 bits  AES128-GCM-SHA256
Accepted  TLSv1.2  128 bits  AES128-SHA
<snip>
Preferred TLSv1.1  128 bits  ECDHE-RSA-AES128-SHA          Curve P-256 DHE 256
Accepted  TLSv1.1  128 bits  ECDHE-RSA-RC4-SHA             Curve P-256 DHE 256
Accepted  TLSv1.1  128 bits  AES128-SHA
<snip>
Preferred TLSv1.0  128 bits  ECDHE-RSA-AES128-SHA          Curve P-256 DHE 256
Accepted  TLSv1.0  128 bits  ECDHE-RSA-RC4-SHA             Curve P-256 DHE 256
Accepted  TLSv1.0  128 bits  AES128-SHA
<snip>
Preferred SSLv3    128 bits  RC4-SHA
Accepted  SSLv3    128 bits  RC4-MD5
<snip>

  SSL Certificate:
Signature Algorithm: sha256WithRSAEncryption
RSA Key Strength:    2048

Subject:  *.google.com
Altnames: DNS:*.google.com, DNS:*.android.com, <snip>
Issuer:   Google Internet Authority G2

Not valid before: Apr  7 08:24:31 2016 GMT
Not valid after:  Jun 30 08:20:00 2016 GMT

47



yum install sslscan trabaja en CentOS 6. - a coder
sudo dnf install sslscan en Fedora 22 también. - Zayne S Halsall
brew install sslscan en OSX - Xiao
sudo apt-get install sslscan en Ubuntu (12.04 - así que todas las versiones posteriores deberían estar bien). - balu
Actualización: Cabe señalar que la versión oficial de sslscan se encuentra en los repositorios Debian y Ubuntu (actualmente 1.8.2 de 2009) no admite TLS v1.1 y 1.2, consulte bugs.launchpad.net/ubuntu/+source/sslscan/+bug/1372741. Por lo tanto, uno debe usar la versión en GitHub a la que se vinculó el OP. - balu


Dado que este es un gran hilo de referencia para las herramientas de escaneo de SSL, voy a enumerar CipherScan que fue creado hace un año y también puede identificar problemas con claves 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_clienty admite el uso de su propio binario OpenSSL para que pueda probar las funciones futuras o los 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

# ./cipherscan -o ./openssl api.mycompany.com:443
...................
prio  ciphersuite                  protocols              pfs_keysize
1     DHE-RSA-AES256-GCM-SHA384    TLSv1.2                DH,4096bits
2     DHE-RSA-AES256-SHA256        TLSv1.2                DH,4096bits
3     ECDHE-RSA-AES256-GCM-SHA384  TLSv1.2                ECDH,P-384,384bits
4     ECDHE-RSA-AES256-SHA384      TLSv1.2                ECDH,P-384,384bits
5     DHE-RSA-AES128-GCM-SHA256    TLSv1.2                DH,4096bits
6     DHE-RSA-AES128-SHA256        TLSv1.2                DH,4096bits
7     ECDHE-RSA-AES128-GCM-SHA256  TLSv1.2                ECDH,P-384,384bits
8     ECDHE-RSA-AES128-SHA256      TLSv1.2                ECDH,P-384,384bits
9     DHE-RSA-CAMELLIA256-SHA      TLSv1,TLSv1.1,TLSv1.2  DH,4096bits
10    DHE-RSA-AES256-SHA           TLSv1,TLSv1.1,TLSv1.2  DH,4096bits
11    ECDHE-RSA-AES256-SHA         TLSv1,TLSv1.1,TLSv1.2  ECDH,P-384,384bits
12    DHE-RSA-CAMELLIA128-SHA      TLSv1,TLSv1.1,TLSv1.2  DH,4096bits
13    DHE-RSA-AES128-SHA           TLSv1,TLSv1.1,TLSv1.2  DH,4096bits
14    ECDHE-RSA-AES128-SHA         TLSv1,TLSv1.1,TLSv1.2  ECDH,P-384,384bits
15    CAMELLIA256-SHA              TLSv1,TLSv1.1,TLSv1.2
16    AES256-SHA                   TLSv1,TLSv1.1,TLSv1.2
17    CAMELLIA128-SHA              TLSv1,TLSv1.1,TLSv1.2
18    AES128-SHA                   TLSv1,TLSv1.1,TLSv1.2

Certificate: trusted, 4096 bit, sha256WithRSAEncryption signature
TLS ticket lifetime hint: 300
OCSP stapling: supported

Y aquí hay una lista de opciones

-a | --allciphers   Test all known ciphers individually at the end.
-b | --benchmark    Activate benchmark mode.
-d | --delay        Pause for n seconds between connections
-D | --debug        Output ALL the information.
-h | --help         Shows this help text.
-j | --json         Output results in JSON format.
-o | --openssl      path/to/your/openssl binary you want to use.
-v | --verbose      Increase verbosity.

La salida json es útil si está llamando esto desde otras secuencias de comandos.


14



"big-SSLv3 config not supported, connection failed" - a coder


https://github.com/iSECPartners/sslyze

Éste está basado en Python, funciona en Linux / Mac / Windows desde la línea de comandos.


12





Después de un poco de google, encontré esto Prueba de SSL-TLS (OWASP-CM-001):

los nmap El escáner, a través de la opción de escaneo "-sV", puede identificar los servicios SSL. Los escáneres de vulnerabilidades, además de realizar el descubrimiento del servicio, pueden incluir controles contra cifrados débiles (por ejemplo, el Escáner Nessus tiene la capacidad de verificar servicios SSL en puertos arbitrarios e informará cifras débiles).

y también: Foundstone SSL Digger es una herramienta para evaluar la fortaleza de los servidores SSL probando las cifras admitidas. Algunas de estas cifras son inseguras.


8





Estoy usando la mayoría de las pruebas SSL testssl.sh (ver https://testssl.sh / devel version @ https://github.com/drwetter/testssl.sh. Prueba vulnerabilidades, cifrados, protocolos, etc.


4





SSLScan es genial; una nueva herramienta SSLDiagnos funciona para Windows, o simplemente puede escribir un script usando el openssl s_client.


2





Nmap ssl-enum-cifra el script puede listar los sistemas de cifrado compatibles y las versiones SSL / TLS, así como también los compresores compatibles.


2



Tu respuesta fue anterior, pero Clint Pachl  responder explica ssl-enum-ciphers mucho más comprensivamente. - sampablokuper