web-dev-qa-db-fra.com

Forcer un chiffrement SSL spécifique

Comment puis-je me connecter à un site Web HTTPS à l'aide d'un chiffrement SSL spécifique et afficher la sortie?

Cela serait utile lorsque vous effectuez une analyse de vulnérabilité et éliminez les faux positifs, par exemple lorsqu'un appareil annonce qu'il prend en charge un chiffrement faible mais affiche une page informant qu'un chiffrement fort doit être utilisé.

13
Sonny Ordell

La façon la plus simple de faire ce que vous demandez est simplement d'utiliser openssl s_client pour vous connecter au site avec un chiffrement restreint liste. Et, en fait, la même approche fonctionnera pour un certain nombre d'outils - certainement avec la plupart des langages de programmation ou de script (Python (comme @ terry-chia le suggère), Perl, tcl, C ...) et avec les navigateurs (certains - commentaire utile ici ).

Voyons comment vous pouvez le faire avec openssl.

Déterminez les chiffres que vous souhaitez essayer

Vous pouvez utiliser l'outil sslscan pour déterminer les chiffres qu'un site donné accepte ou rejette:

$ 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
$ 

Et cela nous a indiqué un chiffre que www.google.com rejette et un autre qu'il accepte. Maintenant, nous pouvons tester les deux avec openssl s_client.

Test d'un chiffre rejeté

Utilisez simplement l'argument '-cipher' pour openssl pour limiter la suite de chiffrement que votre client prendra en charge au seul chiffrement que vous souhaitez tester. Ici, je choisis celui qui est marqué Rejeté par 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
---
$

Nous voyons un échec de la poignée de main vers le haut, puis nous voyons "Le chiffrement est (AUCUN)", ce qui indique clairement que le serveur n'était pas disposé à accepter un client qui ne négociait que le seul chiffrement que nous avons spécifié. Je suppose que c'est ce que vous voulez dire lorsque vous dites que vous souhaitez vous connecter avec un chiffrement SSL spécifique et "afficher la sortie".

Test d'un chiffrement accepté

Maintenant, si nous faisons de même avec le chiffrement que nous savons que le serveur prend en charge, nous voyons une connexion complète passer et nous pouvons taper des commandes HTTP. Ci-dessous la sortie, je vais énumérer certaines choses que vous avez remarquées:

$ 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
...

Notez les signes suivants:

  1. Nous ne voyons pas le message d'erreur "Échec de la prise de contact"
  2. Au lieu de "Nouveau, (AUCUN), le chiffre est (AUCUN)", nous voyons "Nouveau, TLSv1/SSLv3, le chiffre est ECDHE-RSA-AES256-SHA"
  3. Nous voyons également le même chiffre répertorié dans la section SSL-Session.
  4. Vous pouvez voir où j'ai tapé une commande HTTP "TRACE/HTTP/1.0", et où Google a répondu "Méthode HTTP/1.0 405 non autorisée". Vous ne seriez pas en mesure de le faire ou de le voir si le chiffre avait été rejeté, évidemment; vous ne pouvez parler au serveur HTTP que si la connexion SSL a été correctement établie.

Mises en garde

C'est relativement facile en ligne de commande openssl. Le faire en code peut être plus difficile, selon la langue et la bibliothèque utilisées. Le faire dans les navigateurs peut être douloureux, car un tel contrôle à grain fin n'est pas facilement accessible - par exemple, si Chrome utilise le système d'exploitation pour SSL sur Windows, vous devez déterminer les clés de registre utilisé pour manipuler SSL.

Un autre problème peut être de déterminer la chaîne de chiffrement que vous souhaitez tester. Si vous étudiez le rapport d'un autre outil, comme votre question le suggère, il ne décrit probablement pas le problème de chiffrement qu'il voit en termes de chaîne de chiffrement OpenSSL. Plus d'une fois, je me suis retrouvé au téléphone avec une assistance demandant "À quoi exactement faites-vous référence lorsque vous dites" chiffrement faible "?"

19
gowenfawr