Wie liste ich die SSL / TLS-Verschlüsselungssuiten auf, die eine bestimmte Website bietet?


261

Wie kann ich eine Liste der SSL / TLS-Verschlüsselungssuiten abrufen, die eine bestimmte Website anbietet?

Ich habe versucht, openssl, aber wenn Sie die Ausgabe untersuchen:

$ echo -n | openssl s_client -connect www.google.com:443 
CONNECTED(00000003)
depth=1 /C=ZA/O=Thawte Consulting (Pty) Ltd./CN=Thawte SGC 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=ZA/O=Thawte Consulting (Pty) Ltd./CN=Thawte SGC CA
 1 s:/C=ZA/O=Thawte Consulting (Pty) Ltd./CN=Thawte SGC CA
   i:/C=US/O=VeriSign, Inc./OU=Class 3 Public Primary Certification Authority
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIDITCCAoqgAwIBAgIQL9+89q6RUm0PmqPfQDQ+mjANBgkqhkiG9w0BAQUFADBM
MQswCQYDVQQGEwJaQTElMCMGA1UEChMcVGhhd3RlIENvbnN1bHRpbmcgKFB0eSkg
THRkLjEWMBQGA1UEAxMNVGhhd3RlIFNHQyBDQTAeFw0wOTEyMTgwMDAwMDBaFw0x
MTEyMTgyMzU5NTlaMGgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlh
MRYwFAYDVQQHFA1Nb3VudGFpbiBWaWV3MRMwEQYDVQQKFApHb29nbGUgSW5jMRcw
FQYDVQQDFA53d3cuZ29vZ2xlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkC
gYEA6PmGD5D6htffvXImttdEAoN4c9kCKO+IRTn7EOh8rqk41XXGOOsKFQebg+jN
gtXj9xVoRaELGYW84u+E593y17iYwqG7tcFR39SDAqc9BkJb4SLD3muFXxzW2k6L
05vuuWciKh0R73mkszeK9P4Y/bz5RiNQl/Os/CRGK1w7t0UCAwEAAaOB5zCB5DAM
BgNVHRMBAf8EAjAAMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwudGhhd3Rl
LmNvbS9UaGF3dGVTR0NDQS5jcmwwKAYDVR0lBCEwHwYIKwYBBQUHAwEGCCsGAQUF
BwMCBglghkgBhvhCBAEwcgYIKwYBBQUHAQEEZjBkMCIGCCsGAQUFBzABhhZodHRw
Oi8vb2NzcC50aGF3dGUuY29tMD4GCCsGAQUFBzAChjJodHRwOi8vd3d3LnRoYXd0
ZS5jb20vcmVwb3NpdG9yeS9UaGF3dGVfU0dDX0NBLmNydDANBgkqhkiG9w0BAQUF
AAOBgQCfQ89bxFApsb/isJr/aiEdLRLDLE5a+RLizrmCUi3nHX4adpaQedEkUjh5
u2ONgJd8IyAPkU0Wueru9G2Jysa9zCRo1kNbzipYvzwY4OA8Ys+WAi0oR1A04Se6
z5nRUP8pJcA2NhUzUnC+MY+f6H/nEQyNv4SgQhqAibAxWEEHXw==
-----END CERTIFICATE-----
subject=/C=US/ST=California/L=Mountain View/O=Google Inc/CN=www.google.com
issuer=/C=ZA/O=Thawte Consulting (Pty) Ltd./CN=Thawte SGC CA
---
No client certificate CA names sent
---
SSL handshake has read 1777 bytes and written 316 bytes
---
New, TLSv1/SSLv3, Cipher is AES256-SHA
Server public key is 1024 bit
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : TLSv1
    Cipher    : AES256-SHA
    Session-ID: 748E2B5FEFF9EA065DA2F04A06FBF456502F3E64DF1B4FF054F54817C473270C
    Session-ID-ctx: 
    Master-Key: C4284AE7D76421F782A822B3780FA9677A726A25E1258160CA30D346D65C5F4049DA3D10A41F3FA4816DD9606197FAE5
    Key-Arg   : None
    Start Time: 1266259321
    Timeout   : 300 (sec)
    Verify return code: 20 (unable to get local issuer certificate)
---

es zeigt nur, dass die Cipher Suite etwas mit AES256-SHA ist. Ich wusste, dass ich den Hex-Dump der Unterhaltung durchgehen konnte, aber ich hoffte auf etwas Eleganteres.

Ich würde es vorziehen, dies unter Linux zu tun, aber Windows (oder andere) wären in Ordnung. Diese Frage wird durch die Sicherheitstests, die ich für PCI und allgemeine Penetrationstests durchführe, motiviert.

Aktualisieren:

GregS weist darauf hin, dass der SSL-Server aus den Chiffresuiten des Clients wählt. Es scheint also, als müsste ich alle Chiffresuiten einzeln testen. Ich denke, ich kann etwas zusammen hacken, aber gibt es eine einfachere, zukunftssicherere Möglichkeit (z. B. neue Chiffren), dies zu tun?


Vielleicht gnutls-cli?
Grawity

Nach der Titeländerung ist diese Frage wirklich nicht für eine Software-Rec gefragt. Abstimmung zur Wiedereröffnung.
Bob

@ fixer1234 Wenn es dich glücklicher macht, habe ich das Wort "tool" entfernt. Die Kernfrage ist, wie man eine bestimmte Aufgabe überhaupt erledigt. Es ist eine kleine Umformulierung und keine offene Liste mit Fragen vom Typ Software.
Bob,

@ Bob: Ich bin begeistert. :-) Abstimmung zur Wiedereröffnung.
Fixer1234

Antworten:


232

Ich habe ein Bash-Skript geschrieben, um Cipher Suites zu testen. Von OpenSSL wird eine Liste der unterstützten Cipher Suites abgerufen, und es wird versucht, eine Verbindung mit jedem einzelnen herzustellen. Wenn der Handshake erfolgreich ist, wird gedruckt YES. Wenn der Handshake nicht erfolgreich ist, wird er gedruckt NO, gefolgt vom OpenSSL-Fehlertext.

#!/usr/bin/env bash

# OpenSSL requires the port number.
SERVER=$1
DELAY=1
ciphers=$(openssl ciphers 'ALL:eNULL' | sed -e 's/:/ /g')

echo Obtaining cipher list from $(openssl version).

for cipher in ${ciphers[@]}
do
echo -n Testing $cipher...
result=$(echo -n | openssl s_client -cipher "$cipher" -connect $SERVER 2>&1)
if [[ "$result" =~ ":error:" ]] ; then
  error=$(echo -n $result | cut -d':' -f6)
  echo NO \($error\)
else
  if [[ "$result" =~ "Cipher is ${cipher}" || "$result" =~ "Cipher    :" ]] ; then
    echo YES
  else
    echo UNKNOWN RESPONSE
    echo $result
  fi
fi
sleep $DELAY
done

Hier ist eine Beispielausgabe mit 3 nicht unterstützten Chiffren und 1 unterstützten Chiffren:

[@linux ~]$ ./test_ciphers 192.168.1.11:443
Obtaining cipher list from OpenSSL 0.9.8k 25 Mar 2009.
Testing ADH-AES256-SHA...NO (sslv3 alert handshake failure)
Testing DHE-RSA-AES256-SHA...NO (sslv3 alert handshake failure)
Testing DHE-DSS-AES256-SHA...NO (sslv3 alert handshake failure)
Testing AES256-SHA...YES

BEARBEITEN: Flexibilität hinzufügen, da Host und Port als Parameter für das Skript bereitgestellt werden


7
openssl 1.0 muss geändert werden: if [[ "$result" =~ "Cipher :" ]] ; thenstattdessen if [[ "$result" =~ "Cipher is " ]] ; thenteste ich auch auf SSL2 und sichere Neuverhandlung:echo -n Testing ssl2... result=$(echo -n | openssl s_client -ssl2 -connect $SERVER 2>&1) if [[ "$result" =~ "Cipher :" ]] ; then echo supported. INSECURE! else echo no support, OK fi echo -n Testing SSL secure renegotiation... echo -n "" | openssl s_client -connect $SERVER 2>&1 | grep 'Secure Renegotiation'
Hubert Kario

9
Es gibt ein weiteres, sehr ausgefeiltes Shell-Skript, das sslscan und openssl
Robert

2
Ich habe unter einem anderen Skript aufgeführt , die nur erfordert OpenSSL genannt CipherScan
Olivier - interfaSys

1
Beachten Sie, dass dieses Skript Ihnen wahrscheinlich nicht sagt, ob ein Server Cipher Suites unterstützt, die von OpenSSL nicht unterstützt werden.
Sampablokuper

2
Der Vorschlag von @Robert für TLSSLed war fantastisch. Es wurde auf 1.3 aktualisiert und verfügt über viel mehr Funktionen. Ich habe für Sicherheitstests verwendet und muss sagen, dass ich beeindruckt bin.
John Yeary

162

Nmap mit ssl-enum-chiffren

Es gibt keine bessere oder schnellere Möglichkeit, eine Liste der verfügbaren Chiffren von einem Netzwerkdienst abzurufen. Außerdem nmap liefert eine Stärke - Rating von stark, schwach oder unbekannt für jede verfügbare Chiffre.

Laden Sie zunächst das Skript ssl-enum-ciphers.nse nmap herunter ( Erklärung hier ). Führen Sie dann im selben Verzeichnis wie das Skript nmap wie folgt aus:

Liste der von einem HTTP-Server unterstützten Chiffren auf

$ nmap --script ssl-enum-ciphers -p 443 www.example.com

Liste der von einem IMAP-Server unterstützten Chiffren auf

$ nmap --script ssl-enum-ciphers -p 993 mail.example.com

Hier ist ein Ausschnitt der Ausgabe von einem Dovecot IMAP-Server:

993/tcp open  imaps
| ssl-enum-ciphers:
|   SSLv3:
|     ciphers:
|       TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA - strong
|       TLS_DHE_RSA_WITH_AES_128_CBC_SHA - strong
|       TLS_DHE_RSA_WITH_AES_256_CBC_SHA - strong
|       TLS_RSA_WITH_IDEA_CBC_SHA - weak
...
|   TLSv1.0:
|     ciphers:
|       TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA - strong
|       TLS_DHE_RSA_WITH_AES_128_CBC_SHA - strong
|       TLS_DHE_RSA_WITH_AES_256_CBC_SHA - strong
|       TLS_RSA_WITH_IDEA_CBC_SHA - weak
...
|_  least strength: weak

Nmap done: 1 IP address (1 host up) scanned in 1.03 seconds

2
Gibt es eine Möglichkeit, dieses Skript in IMAP mit STARTTLS zu verwenden? STARTTLS auf SMTP scheint zu funktionieren, aber auf IMAP scheint das Skript nicht einmal ausgeführt zu werden.
Giel

Einige Dinge: Möglicherweise führen Sie das Skript in Ihrer nmap-Distribution aus und nicht in der, die Sie heruntergeladen haben. Überprüfen Sie, indem Sie Ihre umbenennen. Überprüfen Sie dann die "Portrule", die in einigen Versionen nach häufig verwendeten Portnummern sucht. Ersetzen durchportrule = function() \n return true \n end
slim

... und es müsste gehackt werden, um mit IMAP STARTTLS, FTPS AUTH TLSusw. zu arbeiten, aber es ist möglich.
Slim

1
Eine Einschränkung ist, dass ältere Skripte, die möglicherweise in Ihrer Distribution / Ihrem Paket enthalten sind, die Chiffren in alphabetischer Reihenfolge und nicht in der vom Server (oder Client) bevorzugten Reihenfolge auflisten. Siehe den obigen Kommentar von @slim
Clint Pachl

3
In den 2 Jahren seit dieser Antwort hat Nmap die Unterstützung für STARTTLS über FTP, NNTP, IMAP, LDAP, POP3, PostgreSQL, SMTP, XMPP, VNC und MS SQL hinzugefügt .
Bonsaiviking

104

Gibt es ein Tool, mit dem Sie testen können, welche SSL / TLS-Verschlüsselungssuiten eine bestimmte Website bietet?

Ja, Sie können das Online-Tool auf der Website von SSL Labs verwenden , um die öffentliche SSL-Serverdatenbank abzufragen.

Hier ist ein Auszug der darin enthaltenen Informationen:

Alt-Text

(Screenshot von Ergebnissen von google.com)


Das ist genau das, was ich gesucht habe! Danke vielmals!
Jeremy Powell

11
Leider unterstützt es nur HTTPS auf dem Standard-Port. Es kann nicht verwendet werden, um POP3S, IMAPS oder IMAP mit TLS zu überprüfen
Hubert Kario

1
Und obwohl es nur HTTPS unterstützt, fehlt ihm die Unterstützung für SNI.
Gurken Papst

12
Und während es für öffentlich zugängliche Sites großartig ist, können Sie es nicht für Sites in Netzwerken verwenden, die vom Internet isoliert sind.
Iszi

53

sslscan ist ein nettes kleines Dienstprogramm.

Es testet die Verbindung mit TLS und SSL (und das Build-Skript kann eine Verbindung mit seiner eigenen OpenSSL-Kopie herstellen, sodass auch veraltete SSL-Versionen überprüft werden) und meldet die Verschlüsselungssammlungen und Zertifikate des Servers.

Beispielausgabe für google.com(aus Gründen der Lesbarkeit verkleinert):

$ sslscan google.com
Testing SSL server google.com on port 443

 TLS renegotiation:
Secure session renegotiation supported

  TLS Compression:
Compression disabled

  Heartbleed:
TLS 1.2 not vulnerable to heartbleed
TLS 1.1 not vulnerable to heartbleed
TLS 1.0 not vulnerable to heartbleed

  Supported Server Cipher(s):
Preferred TLSv1.2  128 bits  ECDHE-RSA-AES128-GCM-SHA256   Curve P-256 DHE 256
Accepted  TLSv1.2  128 bits  ECDHE-RSA-AES128-SHA          Curve P-256 DHE 256
Accepted  TLSv1.2  128 bits  ECDHE-RSA-RC4-SHA             Curve P-256 DHE 256
Accepted  TLSv1.2  128 bits  AES128-GCM-SHA256
Accepted  TLSv1.2  128 bits  AES128-SHA
<snip>
Preferred TLSv1.1  128 bits  ECDHE-RSA-AES128-SHA          Curve P-256 DHE 256
Accepted  TLSv1.1  128 bits  ECDHE-RSA-RC4-SHA             Curve P-256 DHE 256
Accepted  TLSv1.1  128 bits  AES128-SHA
<snip>
Preferred TLSv1.0  128 bits  ECDHE-RSA-AES128-SHA          Curve P-256 DHE 256
Accepted  TLSv1.0  128 bits  ECDHE-RSA-RC4-SHA             Curve P-256 DHE 256
Accepted  TLSv1.0  128 bits  AES128-SHA
<snip>
Preferred SSLv3    128 bits  RC4-SHA
Accepted  SSLv3    128 bits  RC4-MD5
<snip>

  SSL Certificate:
Signature Algorithm: sha256WithRSAEncryption
RSA Key Strength:    2048

Subject:  *.google.com
Altnames: DNS:*.google.com, DNS:*.android.com, <snip>
Issuer:   Google Internet Authority G2

Not valid before: Apr  7 08:24:31 2016 GMT
Not valid after:  Jun 30 08:20:00 2016 GMT

1
yum install sslscanfunktioniert auf CentOS 6.
ein Programmierer

1
sudo dnf install sslscanauch auf Fedora 22.
Zayne S Halsall

2
brew install sslscanauf OSX
Xiao

sudo apt-get install sslscanauf Ubuntu (12.04 - so sollten alle späteren Versionen in Ordnung sein).
Balu

3
Update: Es sollte beachtet werden, dass die offizielle Version von sslscan in den Debian- und Ubuntu-Repositories (derzeit 1.8.2 ab 2009) TLS v1.1 und 1.2 nicht unterstützt, siehe bugs.launchpad.net/ubuntu/+source/sslscan / + Bug / 1372741 . Man sollte daher die Version auf GitHub verwenden, mit der das OP verlinkt ist.
Balu

15

Da dies ein großartiger Referenz-Thread für SSL-Scan-Tools ist, liste ich CipherScan auf, das vor einem Jahr erstellt wurde und auch Probleme mit Schlüsselaustausch-Chiffren identifizieren kann. https://github.com/jvehent/cipherscan

Wenn Sie möchten, dass mein Fork SNI und FreeBSD unterstützt, lautet die URL https://github.com/oparoz/cipherscan

Es ist ein Skript, das openssl s_clientIhre eigene OpenSSL-Binärdatei aufruft und unterstützt, damit Sie kommende Funktionen oder neue Chiffren testen können (chacha20 + poly1305 pro Beispiel).

Sie können sich auch mit einem beliebigen Port verbinden und starttlss verwenden.

Hier ist eine typische Ausgabe

# ./cipherscan -o ./openssl api.mycompany.com:443
...................
prio  ciphersuite                  protocols              pfs_keysize
1     DHE-RSA-AES256-GCM-SHA384    TLSv1.2                DH,4096bits
2     DHE-RSA-AES256-SHA256        TLSv1.2                DH,4096bits
3     ECDHE-RSA-AES256-GCM-SHA384  TLSv1.2                ECDH,P-384,384bits
4     ECDHE-RSA-AES256-SHA384      TLSv1.2                ECDH,P-384,384bits
5     DHE-RSA-AES128-GCM-SHA256    TLSv1.2                DH,4096bits
6     DHE-RSA-AES128-SHA256        TLSv1.2                DH,4096bits
7     ECDHE-RSA-AES128-GCM-SHA256  TLSv1.2                ECDH,P-384,384bits
8     ECDHE-RSA-AES128-SHA256      TLSv1.2                ECDH,P-384,384bits
9     DHE-RSA-CAMELLIA256-SHA      TLSv1,TLSv1.1,TLSv1.2  DH,4096bits
10    DHE-RSA-AES256-SHA           TLSv1,TLSv1.1,TLSv1.2  DH,4096bits
11    ECDHE-RSA-AES256-SHA         TLSv1,TLSv1.1,TLSv1.2  ECDH,P-384,384bits
12    DHE-RSA-CAMELLIA128-SHA      TLSv1,TLSv1.1,TLSv1.2  DH,4096bits
13    DHE-RSA-AES128-SHA           TLSv1,TLSv1.1,TLSv1.2  DH,4096bits
14    ECDHE-RSA-AES128-SHA         TLSv1,TLSv1.1,TLSv1.2  ECDH,P-384,384bits
15    CAMELLIA256-SHA              TLSv1,TLSv1.1,TLSv1.2
16    AES256-SHA                   TLSv1,TLSv1.1,TLSv1.2
17    CAMELLIA128-SHA              TLSv1,TLSv1.1,TLSv1.2
18    AES128-SHA                   TLSv1,TLSv1.1,TLSv1.2

Certificate: trusted, 4096 bit, sha256WithRSAEncryption signature
TLS ticket lifetime hint: 300
OCSP stapling: supported

Und hier ist eine Liste von Optionen

-a | --allciphers   Test all known ciphers individually at the end.
-b | --benchmark    Activate benchmark mode.
-d | --delay        Pause for n seconds between connections
-D | --debug        Output ALL the information.
-h | --help         Shows this help text.
-j | --json         Output results in JSON format.
-o | --openssl      path/to/your/openssl binary you want to use.
-v | --verbose      Increase verbosity.

Die json-Ausgabe ist nützlich, wenn Sie dies von anderen Skripten aus aufrufen.


"Big-SSLv3-Konfiguration nicht unterstützt, Verbindung fehlgeschlagen"
ein Codierer


8

Nach ein wenig googeln fand ich diesen Test für SSL-TLS (OWASP-CM-001) :

Der nmap- Scanner kann über die Scanoption „–sV“ SSL-Dienste identifizieren. Schwachstellenscanner können neben der Dienstermittlung auch Prüfungen auf schwache Chiffren umfassen (z. B. kann der Nessus-Scanner SSL-Dienste an beliebigen Ports prüfen und meldet schwache Chiffren).

und außerdem: Foundstone SSL Digger ist ein Tool zur Bewertung der Stärke von SSL-Servern durch Testen der unterstützten Verschlüsselungen. Einige dieser Chiffren sind als unsicher bekannt.



2

SSLScan ist großartig; ein neues Tool SSLDiagnos funktioniert für Windows, oder Sie können einfach ein Skript mit dem openssl s_client schreiben.



2

Wenn Sie eine schöne grepable Ausgabe wollen (und Unterstützung für die Überprüfung aller SSL / TLS-Versionen)

Verwendung: ./script.sh www.url.com

#!/usr/bin/env bash
ciphers2=$(openssl ciphers -ssl2 'ALL:eNULL' | sed -e 's/:/ /g')
ciphers3=$(openssl ciphers -ssl3 'ALL:eNULL' | sed -e 's/:/ /g')
cipherst1=$(openssl ciphers -tls1 'ALL:eNULL' | sed -e 's/:/ /g')
cipherst11=$(openssl ciphers -tls1.1 'ALL:eNULL' | sed -e 's/:/ /g')
cipherst12=$(openssl ciphers -tls1.2 'ALL:eNULL' | sed -e 's/:/ /g')

SSL2="SSL2("
for cipher in ${ciphers2[@]}
do
result=$(echo -n | openssl s_client -ssl2 -cipher "$cipher" -connect $1:443 2>&1)
if [[ "$result" =~ "Cipher is ${cipher}" ]] ; then
  SSL2="${SSL2}${cipher}:"
fi
done
SSL2=$(echo "${SSL2})" | sed -e 's/:)/)/g')

SSL3="SSL3("
for cipher in ${ciphers3[@]}
do
result=$(echo -n | openssl s_client -ssl3 -cipher "$cipher" -connect $1:443 2>&1)
if [[ "$result" =~ "Cipher is ${cipher}" ]] ; then
  SSL3="${SSL3}${cipher}:"
fi
done
SSL3=$(echo "${SSL3})" | sed -e 's/:)/)/g')
TLS1="TLS1("
for cipher in ${cipherst1[@]}
do
result=$(echo -n | openssl s_client -tls1 -cipher "$cipher" -connect $1:443 2>&1)
if [[ "$result" =~ "Cipher is ${cipher}" ]] ; then
  TLS1="${TLS1}${cipher}:"
fi
done
TLS1=$(echo "${TLS1})" | sed -e 's/:)/)/g')

TLS11="TLS1.1("
for cipher in ${cipherst11[@]}
do
result=$(echo -n | openssl s_client -tls1_1 -cipher "$cipher" -connect $1:443 2>&1)
if [[ "$result" =~ "Cipher is ${cipher}" ]] ; then
  TLS11="${TLS11}${cipher}:"
fi
done
TLS11=$(echo "${TLS11})" | sed -e 's/:)/)/g')

TLS12="TLS1.2("
for cipher in ${cipherst12[@]}
do
result=$(echo -n | openssl s_client -tls1_2 -cipher "$cipher" -connect $1:443 2>&1)
if [[ "$result" =~ "Cipher is ${cipher}" ]] ; then
  TLS12="${TLS12}${cipher}:"
fi
done
TLS12=$(echo "${TLS12})" | sed -e 's/:)/)/g')

echo "$1,$SSL2,$SSL3,$TLS1,$TLS11,$TLS12";

Sie spielen openssl ciphers -tls1.1und openssl ciphers -tls1.2diese Parameter scheinen nicht zu existieren ... Es gibt sie nur -tls1(zumindest auf den Plattformen, die ich ausprobiert habe).
Marki

(Es scheint zusätzliche Optionen in Form zu sein , tls1_1und tls1_2doch sind sie nur auf der gezeigten Master - Version von OpenSSL und nicht einmal in 1.0.2 ....)
Marki

Beachten Sie, dass dieses Skript Ihnen wahrscheinlich nicht sagt, ob ein Server Cipher Suites unterstützt, die von OpenSSL nicht unterstützt werden.
Sampablokuper

2

Auf pentesterscripting.com gibt es ein nettes kleines Skript, mit dem Sie mit SSLScan und OpenSSL nach Folgendem suchen können:

  • SSL v2;
  • Wochenchiffrenanzüge;
  • MD5; und
  • Sicherheitsanfälligkeit in Bezug auf TLS-Neuverhandlung

http://www.pentesterscripting.com/discovery/ssl_tests (über das Internet Archive Wayback Machine )

Dupliziert hier zur Zukunftssicherung, da die Hauptseite nun tot ist:

#!/usr/bin/env bash

# Description:
#       Script to extract the most security relevant details from a 
#       target SSL/TLS implementation by using sslscan.
# Author:  Raul Siles (raul _AT_ taddong _DOT_ com)
#          Taddong (www.taddong.com)
# Date:    2011-05-27
# Version: 1.0
#
# - Current SSL/TLS tests: 
#   SSLv2, NULL cipher, weak ciphers -key length-, strong 
#   ciphers -AES-, MD5 signed cert, SSL/TLS renegotiation
#
# Requires: 
# - sslscan
# https://sourceforge.net/projects/sslscan/
#
# Credits: Based on ssl_test.sh by Aung Khant, http://yehg.net.
# 

#
# /**************************************************************************
# *   Copyright 2011 by Taddong (Raul Siles)                                *
# *                                                                         *
# *   This program is free software; you can redistribute it and/or modify  *
# *   it under the terms of the GNU General Public License as published by  *
# *   the Free Software Foundation; either version 3 of the License, or     *
# *   (at your option) any later version.                                   *
# *                                                                         *
# *   This program is distributed in the hope that it will be useful,       *
# *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
# *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
# *   GNU General Public License for more details.                          *
# *                                                                         *
# *   You should have received a copy of the GNU General Public License     *
# *   along with this program. If not, see <http://www.gnu.org/licenses/>.  *
# *                                                                         *
# **************************************************************************/
#

VERSION=1.0

OPENSSLVERSION=$(openssl version)
SSLSCANVERSION=$(sslscan --version | grep version | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g")

echo ------------------------------------------------------
echo " TLSSLed - ($VERSION) based on sslscan and openssl"
echo " by Raul Siles (www.taddong.com)"
echo " ( inspired by ssl_test.sh by Aung Khant )"
echo ------------------------------------------------------
echo + openssl version: $OPENSSLVERSION
echo + $SSLSCANVERSION
echo ------------------------------------------------------
echo

if [ $# -ne 2 ]; then 
   echo Usage: $0 IP PORT
   exit
fi

HOST=$1
PORT=$2

echo  [*] Analyzing SSL/TLS on $HOST:$PORT ...
echo 

# Run sslcan once, store the results to a log file and
# analyze that file for all the different tests:
DATE=$(date +%F_%R:%S)
TARGET=$HOST:$PORT
LOGFILE=sslscan\_$TARGET\_$DATE.log
ERRFILE=sslscan\_$TARGET\_$DATE.err

echo [*] Running sslscan on $HOST:$PORT...
sslscan $HOST:$PORT > $LOGFILE 2> $ERRFILE

echo
echo [*] Testing for SSLv2 ...
cat $LOGFILE | grep "Accepted  SSLv2"
echo
echo [*] Testing for NULL cipher ...
cat $LOGFILE | grep "NULL" | grep Accepted
echo
echo [*] Testing for weak ciphers \(based on key length\) ...
cat $LOGFILE | grep " 40 bits" | grep Accepted
echo 
cat $LOGFILE | grep " 56 bits" | grep Accepted
echo
echo [*] Testing for strong ciphers \(AES\) ...
cat $LOGFILE | grep "AES" | grep Accepted

echo 
echo [*] Testing for MD5 signed certificate ...
#cat $LOGFILE | grep -E 'MD5WithRSAEncryption|md5WithRSAEncryption'
cat $LOGFILE | grep -i 'MD5WithRSAEncryption'

echo 
echo [*] Checking preferred server ciphers ...
cat $LOGFILE | sed '/Prefered Server Cipher(s):/,/^$/!d' | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"

echo
echo [*] Testing for SSLv3/TLSv1 renegotiation vuln. \(CVE-2009-3555\) ...
#echo [*] echo R \| openssl s_client -connect $HOST:$PORT \| grep "DONE"
#
# Renegotiation details go to stderr (2>)
#
# if $OPENSSLVERSION is updated (version?) it supports RFC5746 and will print:
# Secure Renegotiation IS NOT supported
# Secure Renegotiation IS supported
#

echo R | openssl s_client -connect $HOST:$PORT | grep -E "Secure Renegotiation IS|DONE"

echo
echo [*] New files created:
ls -l $LOGFILE
if [ ! -s $ERRFILE ]; then
        # Error file is empty
        rm $ERRFILE
else
        ls -l $ERRFILE
fi

echo
echo 
echo [*] done
echo

Verwendung: ./ssltest.sh HOST PORT


2

Basierend auf der Antwort von @ indiv und dem Vorschlag, sie als eigene Antwort zu veröffentlichen, stelle ich meine optimierte Version des Skripts von @ indiv bereit. Sie können als erstes Argument einen Host angeben, der dieselben Ergebnisse ausgibt wie das ursprüngliche Skript, jedoch etwas formatierter:

#!/usr/bin/env bash
# adapted from https://superuser.com/questions/109213/how-do-i-list-the-ssl-tls-cipher-suites-a-particular-website-offers

# OpenSSL requires the port number.
# SERVER=192.168.1.1:443
SERVER=$1
if [[ -z "$SERVER" ]]; then echo "ERROR: no server specified"; exit 1; fi;

## Set up colors, if possible
if [[ $(tput colors) ]];then
  COLOR_BOLD="$(tput bold)"     # "\e[1;32m"
  COLOR_GREEN="$(tput setaf 2)" # "\e[1;32m"
  COLOR_RESET="$(tput sgr0)"    # "\e[0m"
fi


SERVER=$1:443
echo Server is ${COLOR_BOLD}"$SERVER"${COLOR_RESET}

DELAY=1
ciphers=$(openssl ciphers 'ALL:eNULL' | sed -e 's/:/ /g')

echo Obtaining cipher list from $(openssl version).

for cipher in ${ciphers[@]}
  do
  printf "%-42s" "Testing $cipher... "
  result=$(echo -n | openssl s_client -cipher "$cipher" -connect $SERVER 2>&1)
  if [[ "$result" =~ ":error:" ]] ; then
    error=$(echo -n $result | cut -d':' -f6)
    echo NO \($error\)
  else
    if [[ "$result" =~ "Cipher is ${cipher}" || "$result" =~ "Cipher    :" ]] ; then
      echo ${COLOR_BOLD}${COLOR_GREEN}YES${COLOR_RESET}
    else
      echo UNKNOWN RESPONSE
      echo $result
    fi
  fi
  sleep $DELAY
done

2

Das (kostenlose) OpenSSL-Kochbuch von Ivan Ristić, der das in Kez 'Antwort erwähnte Online-Tool SSL Labs entwickelt hat , besagt:

Wenn Sie alle von einem bestimmten Server unterstützten Suites ermitteln möchten, rufen Sie openssl ciphers ALLzunächst eine Liste aller von Ihrer OpenSSL-Version unterstützten Suites auf. Senden Sie sie dann einzeln an den Server, um sie einzeln zu testen. Ich schlage nicht vor, dass Sie dies manuell tun; Dies ist eine Situation, in der ein wenig Automatisierung viel bewirkt. In der Tat ist dies eine Situation, in der es angebracht sein könnte, sich nach einem guten Werkzeug umzusehen .

Das Testen auf diese Weise hat jedoch einen Nachteil. Sie können nur die von OpenSSL unterstützten Suites testen. ...

Keine einzige SSL / TLS-Bibliothek unterstützt alle Cipher Suites , was umfassende Tests erschwert. Für SSL Labs habe ich zu diesem Zweck teilweise Handshakes verwendet, und zwar mit einem benutzerdefinierten Client, der vorgibt, beliebige Suites zu unterstützen . Es kann nicht einmal eine einzelne Suite verhandeln, aber es reicht aus, wenn die Server Ihnen nur mitteilen, ob sie eine Suite unterstützen oder nicht. Auf diese Weise können Sie nicht nur alle Suiten testen, sondern auch sehr effizient.

(Meine Betonung.)

Ein Tool, das ich in anderen Antworten nicht gesehen habe, ist der SSLTest von Stephen Bradshaw , mit dem unter anderem "die erkannten Chiffren und Protokolle mit Compliance-Standards wie DSD ISM und PCI-DSS verglichen werden" sollen.

Probieren Sie dieses oder eines der in den anderen Antworten genannten Tools aus, oder erstellen Sie ein eigenes, und ziehen Sie Ristićs Ansatz für partielle Handshakes in Betracht.


1

Ich habe ein Tool geschrieben, das genau das tut. Es heißt tlsenum und ist auf GitHub verfügbar .

[ayrx@division tlsenum]$ ./tlsenum.py twitter.com 443
TLS Versions supported by server: 3.0, 1.0, 1.1, 1.2
Supported Cipher suites in order of priority:
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_RSA_WITH_RC4_128_SHA
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
TLS_RSA_WITH_AES_128_GCM_SHA256
TLS_RSA_WITH_RC4_128_SHA
TLS_RSA_WITH_RC4_128_MD5
TLS_RSA_WITH_AES_128_CBC_SHA
TLS_RSA_WITH_AES_256_CBC_SHA
TLS_RSA_WITH_3DES_EDE_CBC_SHA

Hier ist ein Beispiel für die Ausgabe des Tools gegen twitter.com.

Es ist ähnlich wie in SSL Lab, aber ich finde, dass ein Befehlszeilen-Tool, das Sie automatisieren und analysieren können, viel nützlicher ist.


1

SSLyze, ursprünglich unter https://github.com/iSECPartners/sslyze , befindet sich jetzt unter https://github.com/nabla-c0d3/sslyze . Es wurde in einer anderen Antwort erwähnt , aber ohne viel Detail.

SSLyze basiert auf Python und funktioniert unter Linux / Mac / Windows über die Befehlszeile. Es verwendet OpenSSL und wird unter Windows mit einer gebündelten Kopie von OpenSSL geliefert.

Listet Protokolle, Cipher Suites und Schlüsseldetails sowie Tests für einige häufig auftretende Sicherheitsanfälligkeiten auf. Sie können bestimmte Überprüfungen aktivieren oder deaktivieren, um mehr Daten abzurufen oder den Scan zu beschleunigen.


0

Das Einzige, was Sie tun können, ist, alle nacheinander auszuprobieren und festzustellen, welche akzeptiert werden. Ich kenne kein Tool, um dies zu tun, obwohl es nicht schwierig sein sollte, eines aus Skriptwerkzeugen und zusammenzusetzen openssl s_client.

Während der Client angibt, welche Chiffriereinheiten er akzeptiert, wählt der Server einfach eine aus und verwendet sie oder schlägt die Verbindung fehl, wenn er nichts findet, was ihm gefällt.


Oh ja ... aus irgendeinem Grund dachte ich, es sei umgekehrt. Vielleicht kann ich ein vorgefertigtes Werkzeug finden ... :)
Jeremy Powell

0

All diese Antworten sind in Ordnung. Ein Teil der Antwort könnte erklären, warum wir ein Tool benötigen, um die Liste der Server zu ermitteln und nicht direkt in TLS nachzufragen, dass der Server alle unterstützten Chiffresuiten bereitstellt, genau wie der TLS-Client, wenn er eine Verbindung zu einem Server herstellt.

Die Antwort ist, dass der Server niemals eine Liste sendet . Er wählt lediglich in der Client-Verschlüsselungsliste die Verschlüsselung aus, die er verwenden möchte. So ist das SSL / TLS-Protokoll geschrieben: http://wiki.opensslfoundation.com/index.php/ SSL_and_TLS_Protocols # Cipher_Suites

Aus diesem Grund muss der Client Chiffren auflisten, um die vom Server unterstützten zu finden, und dazu mindestens einen neuen Start-Handshake (ClientHello) für jede Chiffrensuite ausführen.


0

Auf der Suche nach etwas, das AUTH TLSauf FTP funktioniert , habe ich folgendes Tool entdeckt: ssl-cipher-suite-enum

Es ist ein Perl-Skript, das im Grunde das tut, was Hackajars Shell-Skript tut, nur raffinierter.

Es bietet auch eine grundlegende Bewertung der angebotenen Chiffren und Protokolle. Es ist etwas wie SSL Labs-Tools, nur für den Heimgebrauch. :)

Standardmäßig wird nur AUTH SSLFTP unterstützt , dies kann jedoch durch einfaches Suchen und Ersetzen behoben werden. Als Bonus behauptet es auch, SMTP mit STARTTLSund RDP zu unterstützen.


0

TestSSLServer ist eine rein Java-basierte Lösung. Vorteile:

  • Es funktioniert auf sehr niedriger Ebene, nur auf einfachen Sockets, sodass es von möglichen nicht verfügbaren Chiffren von JDK oder OpenSSL unabhängig ist .

  • Es müssen keine zusätzlichen Ports (wie ICMP für Ping) geöffnet werden

  • Es funktioniert mit vorhandenen Client-Zertifikaten

Nachteile:

  • Ab 2016 ist die Liste der Chiffren möglicherweise veraltet (obwohl ich hier kein Experte bin, um dies zu beurteilen).

Meine persönliche Erfahrung: Angesichts eines engmaschigen Servers mit nur einem offenen HTTPS-Port (kein anderer Port), erforderlichen Clientzertifikaten und aktiven iptables konnte er immer noch verfügbare Chiffren auflisten, während die von den Top-Votes gewählten Lösungen dies nicht waren (ich war es) versuchen kleines Shell-Skript, SSL Labs, NMap, sslscan)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.