Forza un codice SSL specifico

10

Come posso collegarmi a un sito Web HTTPS utilizzando uno specifico codice SSL e visualizzare l'output?

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

    
posta Sonny Ordell 28.11.2013 - 22:38
fonte

1 risposta

17

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

Esaminiamo come puoi farlo con openssl.

Determina i cipher 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 comunicato una cifra rifiutata da www.google.com 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à per l'unica cifra che vuoi testare. Qui seleziono quello 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 handshake nella parte superiore, e poi vediamo "Cipher is (NONE)" che è un chiaro segno che il server non era disposto a concordare con un client che stava negoziando solo l'unico codice che abbiamo specificato. Presumo che questo è ciò che intendi quando dici di voler connetterti con uno specifico codice SSL e "visualizzare l'output".

Test di un codice accettato

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

$ 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 vediamo il messaggio di errore "handshake non riuscito"
  2. Invece di "Nuovo, (NESSUNO), il codice è (NESSUNO)", vediamo "Nuovo, TLSv1 / SSLv3, Cipher è ECDHE-RSA-AES256-SHA "
  3. Vediamo anche lo stesso codice elencato 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". Tu vorresti non essere in grado di fare questo o vedere questo se il codice fosse stato rifiutato, ovviamente; puoi parlare al server HTTP solo se la connessione SSL è stata bloccata correttamente.

Avvertimenti

Questo è relativamente facile nella riga di comando di openssl. Farlo in codice potrebbe essere più difficile, a seconda della lingua e della libreria utilizzata. Farlo nei browser può essere doloroso, perché un controllo così preciso non è facilmente accessibile, ad esempio, se Chrome utilizza il sistema operativo per SSL su Windows, devi capire le chiavi del registro utilizzate per manipolare SSL.

Un altro problema può essere capire quale stringa di cifrario vuoi testare. Se stai investigando sul rapporto di un altro strumento, come suggerisce la tua domanda, probabilmente non sta descrivendo il problema cifrato che vede in termini di una stringa di cifratura OpenSSL. Più di una volta sono finito al telefono con il supporto che mi chiedeva "A che cosa esattamente stai riferendo quando dici" crittografia debole "?"

    
risposta data 29.11.2013 - 03:45
fonte

Leggi altre domande sui tag