2016-10-15 4 views
2

Je veux trouver les protocoles supportés par une cible, mais le problème est qu'ils sont un certain nombre de sites Web qui ne supportent pas une version particulière, mais quand j'ai effectué une poignée de main, elle a été couronnée de succès. la version que j'ai donné et exécutée poignée de main sur la version prise en charge [il est arrivé que sur 1 site]Trouver la version SSL après Handshake dans OpenSSL

exemple: je suis passé une version: TLSVersion.TLS_1_2 mais la poignée de main est réalisée à l'aide TLSv1_0 becz il ne supporte pas TLSVersion.TLS_1_2

En raison du problème ci-dessus je veux vérifier la version sur la poignée de main et je ne veux pas utiliser scapy.ssl_tls

version = [SSL.SSLv23_METHOD, 
      SSL.TLSv1_METHOD, 
      SSL.TLSv1_1_METHOD, 
      SSL.TLSv1_2_METHOD] 
context = OpenSSL.SSL.Context(version) 
soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
soc.settimeout(CONNECTION_TIMEOUT) 
connection = OpenSSL.SSL.Connection(context,soc) 
connection.connect((host,port)) 
connection.do_handshake() 
#wants to check version here 

Répondre

1

i want to check the version on handshake

Les fonctions pertinentes pour vérifier la version à la fois l'utilisation du client et le serveur pour la session restante dans pyOpenSSL sont get_protocol_version_name ou get_protocol_version:

connection.do_handshake() 
#wants to check version here 
print(connection.get_protocol_version_name()) 

Notez que ces fonctions ne sont disponibles que depuis pyOpenSSL 0.16.0

Veuillez également ne pas spécifier une liste de méthodes TLS lors de la création du contexte, mais only a single method qui spécifie essentiellement la version TLS minimale prise en charge par le client. Ainsi,

context = OpenSSL.SSL.Context(SSL.TLSv1_METHOD) 

permet au client d'utiliser TLS 1.0 et mieux. Si vous utilisez plutôt SSL.TLSv1_2_METHOD, le client sera limité à TLS 1.2 et mieux et ne pourra donc pas établir de connexion SSL avec un serveur supportant uniquement TLS 1.0.

+0

Je n'ai pas cette fonction dans ma version. --python-openssl est déjà la version la plus récente (0.15.1-2build1) –

+1

@hassan_anwer: pour me citer: * "ces fonctions ne sont disponibles que depuis pyOpenSSL 0.16.0" *. Et puisque la [version actuelle est 0.16.2] (https://pypi.python.org/pypi/pyOpenSSL/16.2.0) votre version 0.15.1 n'est évidemment pas la plus récente. Il pourrait être le plus récent livré avec votre système mais c'est une chose différente. –

+0

@hassan_anwer: dans le cas où votre système ne fournit pas la version nécessaire de pyOpenSSL et que vous ne savez pas comment l'installer, vous pouvez installer [anaconda python] (https://www.continuum.io/downloads) qui inclut pyOpenSSL 0.16 . Cela peut être installé séparément de votre python existant. –

1

Find SSL Version after Handshake in OpenSSL...

Si je suis analyse ce que vous voulez bien ... vous voulez la version du protocole comme imprimé par openssl s_client:

$ openssl version 
OpenSSL 1.1.0b 26 Sep 2016 

$ openssl s_client -connect www.google.com:443 -servername www.google.com 
CONNECTED(00000005) 
depth=2 C = US, O = GeoTrust Inc., CN = GeoTrust Global CA 
verify error:num=20:unable to get local issuer certificate 
Server did acknowledge servername extension. 
--- 
... 
--- 
New, TLSv1.2, Cipher is ECDHE-RSA-CHACHA20-POLY1305 
Server public key is 2048 bit 
Secure Renegotiation IS supported 
No ALPN negotiated 
SSL-Session: 
    Protocol : TLSv1.2 
... 

Le premier message de "Nouveau TLSv1.2" vous parle du chiffre. C'est-à-dire, quand ECDHE-RSA-CHACHA20-POLY1305 est arrivé le premier dans TLS. Dans le cas de ECDHE-RSA-CHACHA20-POLY1305, la suite de chiffrement a été vue pour la première fois dans TLS 1.2. Le code source de s_client est situé au <openssl src>/apps/s_client.c. Le code responsable dans OpenSSL 1.0.2 est autour de la ligne 2210:

/* line 2210 */ 
c = SSL_get_current_cipher(s); 
BIO_printf(bio, "%s, Cipher is %s\n", 
      SSL_CIPHER_get_version(c), SSL_CIPHER_get_name(c)); 
... 

Le deuxième message de « Protocole: TLSv1.2 » vous indique la version du protocole utilisé lors de l'échange de clés et la sélection de chiffrement et le transfert ultérieur en vrac.

Le code responsable OpenSSL 1.0.2 est <openssl src>/ssl/ssl_txt.c autour de la ligne 105:

/* line 105 */ 
int SSL_SESSION_print(BIO *bp, const SSL_SESSION *x) 
{ 
    unsigned int i; 
    const char *s; 

    if (x == NULL) 
     goto err; 
    if (BIO_puts(bp, "SSL-Session:\n") <= 0) 
     goto err; 
    if (x->ssl_version == SSL2_VERSION) 
     s = "SSLv2"; 
    else if (x->ssl_version == SSL3_VERSION) 
     s = "SSLv3"; 
    else if (x->ssl_version == TLS1_2_VERSION) 
     s = "TLSv1.2"; 
    else if (x->ssl_version == TLS1_1_VERSION) 
     s = "TLSv1.1"; 
    else if (x->ssl_version == TLS1_VERSION) 
     s = "TLSv1"; 
    else if (x->ssl_version == DTLS1_VERSION) 
     s = "DTLSv1"; 
    else if (x->ssl_version == DTLS1_2_VERSION) 
     s = "DTLSv1.2"; 
    else if (x->ssl_version == DTLS1_BAD_VER) 
     s = "DTLSv1-bad"; 
    else 
     s = "unknown"; 
    if (BIO_printf(bp, " Protocol : %s\n", s) <= 0) 
     goto err; 

    ... 
} 

I want to find out the protocols supported by a target but the problem is that their are quite a number websites which are not supporting a particular version but when i performed handshake ...

C'est un autre problème. Vous devriez regarder le code source pour sslscan à SSLScan - Fast SSL Scanner pour voir comment cela fonctionne. Le Sourceforge semble abandonné. Il manque SNI et d'autres nouvelles fonctionnalités, comme la négociation sécurisée et ALPN.

Vous pouvez essayer ce sslscan de GitHub: rbsec/sslscan. Le GitHub est activement maintenu et semble être plus à jour.


example : i passed a version :TLSVersion.TLS_1_2 but the handshake is performed using TLSv1_0 becz it is not supporting TLSVersion.TLS_1_2

Cela ne se produira pas. TLS spécifie une seule version de protocole. L'idée est votre essai TLS 1.2. Si cela échoue, vous revenez à TLS 1.1. Si cela échoue, vous revenez à TLS 1.0. Ad infinitum.

L'approche try-and-fallback est la raison de RFC 7504, TLS Fallback Signaling Cipher Suite Value (SCSV) for Preventing Protocol Downgrade Attacks. C'était un affreux groupe-aide de la foule du navigateur. Voir, par exemple, Last Call: (TLS Fallback Signaling Cipher Suite Value (SCSV) for Preventing Protocol Downgrade Attacks) to Proposed Standard.

TLS ne pas accepter une gamme de versions de protocole comme beaucoup de gens pensent. Nous avons essayé de le changer plusieurs fois. Voir, par exemple, A new TLS version negotiation mechanism.