Forzar un cifrado SSL específico

10

¿Cómo puedo conectarme a un sitio web HTTPS utilizando un cifrado SSL específico y ver el resultado?

Esto sería útil cuando se realiza un análisis de vulnerabilidad y se eliminan falsos positivos, como cuando un dispositivo anuncia que admite un cifrado débil pero muestra una página que informa que se debe usar un cifrado sólido.

    
pregunta Sonny Ordell 28.11.2013 - 22:38
fuente

1 respuesta

17

La forma más sencilla de hacer lo que está pidiendo es simplemente usar openssl s_client para conectarse al sitio con una lista de cifrado restringida. Y, de hecho, el mismo enfoque funcionará con varias herramientas, ciertamente con la mayoría de los lenguajes de programación o de secuencias de comandos (Python (como sugiere @ terry-chia), Perl, tcl, C ...) y con navegadores (algunos comentario útil aquí ).

Veamos cómo puedes hacer esto con openssl.

Determine los cifrados que desea probar

Puede usar la herramienta sslscan para determinar las cifras que un sitio determinado acepta o rechaza:

$ sslscan www.google.com | grep Rejected | head -1
    Rejected  SSLv3  256 bits  ECDHE-ECDSA-AES256-SHA
$ sslscan www.google.com | grep Accepted | head -1
    Accepted  SSLv3  256 bits  ECDHE-RSA-AES256-SHA
$ 

Y esto nos ha dicho un código que www.google.com rechaza y otro que acepta. Ahora podemos probar ambos con openssl s_client.

Probando un cifrado rechazado

Simplemente use el argumento '-cipher' para openssl para limitar el conjunto de cifrado que su cliente admitirá al único cifrado que desea probar. Aquí escojo el que está marcado Rechazado por sslscan:

$ openssl s_client -cipher 'ECDHE-ECDSA-AES256-SHA' -connect www.google.com:443
CONNECTED(00000003)
140465833367232:error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure:s23_clnt.c:741:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 7 bytes and written 127 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
---
$

Vemos una falla en el apretón de manos cerca de la parte superior, y luego vemos "Cipher is (NONE)", que es una clara señal de que el servidor no estaba de acuerdo con un cliente que estaba negociando solo el cifrado que especificamos. Supongo que esto es lo que quiere decir cuando dice que quiere conectarse con un cifrado SSL específico y "ver el resultado".

Probando un cifrado aceptado

Ahora, si hacemos lo mismo con el cifrado que sabemos que soporta el servidor, vemos que se realiza una conexión completa y podemos escribir comandos HTTP. Debajo de la salida voy a enumerar algunas cosas que han notado:

$ openssl s_client -cipher 'ECDHE-RSA-AES256-SHA' -connect www.google.com:443
CONNECTED(00000003)
depth=2 C = US, O = GeoTrust Inc., CN = GeoTrust Global 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=US/O=Google Inc/CN=Google Internet Authority G2
 1 s:/C=US/O=Google Inc/CN=Google Internet Authority G2
   i:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
 2 s:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
   i:/C=US/O=Equifax/OU=Equifax Secure Certificate Authority
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIEdjCCA16gAwIBAgIIRYUpUVjSfHQwDQYJKoZIhvcNAQEFBQAwSTELMAkGA1UE
...
OEK3nH1sBk2Hy5ZBcyludHyUzqTHsXSjnIjwZNPpihVmFrs5I1Ma7iEj
-----END CERTIFICATE-----
subject=/C=US/ST=California/L=Mountain View/O=Google Inc/CN=www.google.com
issuer=/C=US/O=Google Inc/CN=Google Internet Authority G2
---
No client certificate CA names sent
---
SSL handshake has read 3750 bytes and written 277 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-SHA
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : TLSv1.1
    Cipher    : ECDHE-RSA-AES256-SHA
    Start Time: 1385691323
    Timeout   : 300 (sec)
    Verify return code: 20 (unable to get local issuer certificate)
---
TRACE / HTTP/1.0

HTTP/1.0 405 Method Not Allowed
Content-Type: text/html; charset=UTF-8
Content-Length: 960
Date: Fri, 29 Nov 2013 02:15:31 GMT
Server: GFE/2.0
...

Tenga en cuenta los siguientes signos:

  1. No vemos el mensaje de error "Fallo en el intercambio de manos"
  2. En lugar de "Nuevo, (NINGUNO), el Cifrado es (NINGUNO)", vemos "Nuevo, TLSv1 / SSLv3, el cifrado es ECDHE-RSA-AES256-SHA "
  3. También vemos el mismo Cifrado listado en la sección de sesión SSL.
  4. Puede ver dónde escribí un comando HTTP "TRACE / HTTP / 1.0", y donde Google respondió "HTTP / 1.0 405 Método no permitido". Lo harías no poder hacer esto o ver esto si el cifrado ha sido rechazado, obviamente; solo puede hablar con el servidor HTTP si la conexión SSL se ha establecido correctamente.

Caveats

Esto es relativamente fácil en la línea de comandos de openssl. Hacerlo en código puede ser más difícil, dependiendo del idioma y la biblioteca que se use. Hacerlo en los navegadores puede ser doloroso, ya que no se puede acceder fácilmente a un control tan detallado, por ejemplo, si Chrome usa el sistema operativo para SSL en Windows, debe averiguar las claves de registro que se utilizan para manipular SSL.

Otro problema puede ser averiguar qué cadena de cifrado desea probar. Si está investigando el informe de otra herramienta, como sugiere su pregunta, es probable que no describa el problema de cifrado que ve en términos de una cadena de cifrado OpenSSL. Más de una vez terminé en el teléfono con soporte preguntando "¿A qué exactamente te refieres cuando dices 'cifrado débil'?"

    
respondido por el gowenfawr 29.11.2013 - 03:45
fuente

Lea otras preguntas en las etiquetas