it-swarm-eu.dev

Forza un codice SSL specifico

Come posso connettermi a un sito Web HTTPS utilizzando una specifica crittografia SSL e visualizzare l'output?

Ciò sarebbe utile quando si esegue un'analisi di vulnerabilità e si eliminano falsi positivi, ad esempio quando un dispositivo pubblicizza supporta un codice debole ma visualizza una pagina che informa che è necessario utilizzare un codice forte.

13
Sonny Ordell

Il modo più semplice per fare ciò che stai chiedendo è semplicemente usare openssl s_client per connetterti al sito con un codice limitato elenco. E, in effetti, lo stesso approccio funzionerà con una serie di strumenti - certamente con la maggior parte dei linguaggi di programmazione o di scripting (Python (come suggerisce @ terry-chia), Perl, tcl, C ...) e con i browser (alcuni - commento utile qui ).

Vediamo come è possibile farlo con openssl.

Determina le cifre che vuoi provare

Puoi utilizzare lo strumento sslscan per determinare le cifre che un determinato sito accetta o rifiuta:

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

E questo ci ha detto una cifra che www.google.com rifiuta e una che accetta. Ora possiamo testare entrambi con openssl s_client.

Test di un codice rifiutato

Usa semplicemente l'argomento '-cipher' per openssl per limitare la suite di crittografia che il tuo client supporterà all'unica cifra che vuoi testare. Qui scelgo quello che è contrassegnato Rifiutato da 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
---
$

Vediamo un errore di stretta di mano nella parte superiore e quindi vediamo "Cipher is (NONE)" che è un chiaro segno che il server non era disposto a concordare con un client che stava negoziando solo un codice che abbiamo specificato. Presumo che questo sia ciò che intendi quando dici che vuoi connetterti con un codice SSL specifico e "visualizzare l'output".

Test di una cifra accettata

Ora, se facciamo lo stesso con la cifra che sappiamo che il server supporta, vediamo passare una connessione completa e possiamo digitare i comandi HTTP. Sotto l'output elencherò alcune cose da notare:

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

Nota i seguenti segni:

  1. Non viene visualizzato il messaggio di errore "stretta di mano non riuscita"
  2. Invece di "Nuovo, (NESSUNO), Cipher è (NESSUNO)", vediamo "Nuovo, TLSv1/SSLv3, Cipher è ECDHE-RSA-AES256-SHA"
  3. Vediamo anche lo stesso codice indicato nella sezione Sessione SSL.
  4. Puoi vedere dove ho digitato un comando HTTP "TRACE/HTTP/1.0" e dove Google ha risposto "Metodo HTTP/1.0 405 non consentito". Non saresti in grado di farlo o vedere questo se il codice fosse stato rifiutato, ovviamente; puoi parlare con il server HTTP solo se la connessione SSL è stata inchiodata correttamente.

Avvertenze

Questo è relativamente semplice nella riga di comando di openssl. Farlo nel codice può essere più difficile, a seconda della lingua e della libreria utilizzata. Farlo nei browser può essere doloroso, perché tale controllo a grana fine non è facilmente accessibile - ad esempio, se Chrome utilizza il sistema operativo per SSL su Windows, è necessario capire le chiavi del registro usato per manipolare SSL.

Un altro problema può essere capire quale stringa di crittografia si desidera testare. Se stai esaminando il rapporto di un altro strumento, come suggerisce la tua domanda, probabilmente non sta descrivendo il problema di cifratura che vede in termini di una stringa di cifratura OpenSSL. Più di una volta sono finito al telefono con il supporto chiedendo "What esattamente ti riferisci quando dici" cifratura debole "?"

19
gowenfawr