Belirli bir web sitesinin sunduğu SSL / TLS şifre takımlarını nasıl listelerim?


261

Belirli bir web sitesi tarafından sunulan SSL / TLS şifre takımlarının listesini nasıl alabilirim?

Openssl'ı denedim, ancak çıktıyı incelerseniz:

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

sadece şifre takımının AES256-SHA ile bir şey olduğunu gösterir. Sohbetteki on altılı boşluğu izleyebileceğimi biliyorum, ama biraz daha zarif bir şey umuyordum.

Bunu Linux'ta yapmayı tercih ederim ama Windows (ya da diğer) iyi olacaktı. Bu soru, PCI ve genel penetrasyon testi için yaptığım güvenlik testleriyle motive oluyor.

Güncelleme:

GregS, SSL sunucusunun müşterinin şifre takımlarından seçtiğinin altını çiziyor. Bu yüzden, tüm şifre takımlarını aynı anda test etmem gerekecek gibi görünüyor. Sanırım birlikte bir şeyleri kesebilirim, ancak bunu yapmanın daha basit, geleceğe yönelik (örneğin yeni şifreler) bir yolu var mı?


Belki gnutls-cli?
Grawity

Başlık değişikliğinden sonra, bu soru gerçekten bir yazılım alıcısı istemiyor. Yeniden açmak için oy kullanma.
Bob

@ fixer1234 Sizi daha mutlu ederse, "araç" kelimesinin herhangi bir oluşumunu kaldırdım. Temel soru, yine de belirli bir görevin nasıl yerine getirileceğini sormak; Bu küçük bir cümle ve daha açık uçlu "yazılım listesi" tipi sorulardan çok uzak.
Bob

@Bob: Ben çok mutluyum. :-) Yeniden açmak için oy kullanma.
fixer1234

Yanıtlar:


232

Şifre takımlarını test etmek için bir bash betiği yazdım. OpenSSL'den desteklenen şifre takımlarının bir listesini alır ve her birini kullanarak bağlanmaya çalışır. El sıkışma başarılı olursa, yazdırır YES. El sıkışma başarılı olmazsa, yazdırır NOve ardından OpenSSL hata metnini izler.

#!/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

İşte desteklenmeyen 3 şifreyi ve 1 desteklenen şifreyi gösteren örnek çıktı:

[@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

EDIT: Ana bilgisayar olarak esneklik ve port, betiğe parametre olarak sağlanmıştır


7
openssl 1.0 değişikliğe ihtiyaç duyuyor: if [[ "$result" =~ "Cipher :" ]] ; thenyerine if [[ "$result" =~ "Cipher is " ]] ; thenSSL2'yi de test ediyorum ve güvenli bir şekilde yeniden müzakere ettim: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

9
Sslscan ve openssl kullanan başka bir çok sofistike shell script var: TLSSLed
Robert


1
Bu betiğin muhtemelen bir sunucunun OpenSSL’nin desteklemediği şifre takımlarını destekleyip desteklemediğini size söylemeyeceğini unutmayın.
sampablokuper

2
@Robert'in TLSSLed için önerisi harikaydı. 1.3'e güncellendi ve çok daha fazla işlevselliğe sahip. Güvenlik testi için kullanıyorum ve etkilendiğimi söylemeliyim.
John Yeary,

162

Ssl-enum- ciphers ile Nmap

Bir şebeke servisinden mevcut şifrelerin listesini almak için daha iyi veya daha hızlı bir yol yoktur. Ayrıca, nmap mevcut her şifre için güçlü, zayıf veya bilinmeyen bir güç derecesi sağlayacaktır.

İlk önce, ssl-enum-ciphers.nse nmap betiğini indirin ( burada açıklama ). Sonra komut dosyasıyla aynı dizinden nmap'i aşağıdaki gibi çalıştırın:

Bir HTTP sunucusu tarafından desteklenen şifreleri listeleme

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

IMAP sunucusu tarafından desteklenen şifreleri listeleme

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

Bir Dovecot IMAP sunucusundan çıktının bir parçası:

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
Bu komut dosyasını IMAP'ta STARTTLS ile birlikte kullanmanın bir yolu var mı? SMTP'de STARTTLS çalışıyor gibi görünüyor, ancak IMAP'ta komut dosyası bile çalışmıyor gibi görünüyor.
Giel

Birkaç şey: Senaryoyu indirdiğinizden ziyade nmap dağıtımınızda çalıştırıyor olabilirsiniz. Kendinizinkini yeniden adlandırarak kontrol edin. Ardından, bazı sürümlerde yaygın olarak kullanılan bağlantı noktası numaralarını denetleyen "bağlantı noktasını" kontrol edin. Değiştirportrule = function() \n return true \n end
ince

... IMAP STARTTLS, FTPS AUTH TLSvb. ile çalışmak için bilgisayar korsanlarına ihtiyaç duyacak , ancak mümkün.
İnce,

1
Bir uyarı, dağıtımınıza / paketinize dahil edilebilecek eski betiklerin şifreleri, sunucu (veya müşteri) tercih sırasına göre değil alfabetik olarak sıralamasıdır. @Slim
Clint Pachl tarafından

3
Bu cevabın yazılmasından sonraki 2 yıl içinde Nmap, FTP, NNTP, IMAP, LDAP, POP3, PostgreSQL, SMTP, XMPP, VNC ve MS SQL üzerinden STARTTLS desteği ve sadece basitçe desteklenen şifreleri listelemenin ötesinde birçok geliştirme eklemiştir. .
bonsaiviking

104

Belirli bir web sitesinin sunduğu SSL / TLS şifre paketlerini test edebilen bir araç var mı?

Evet, Genel SSL Sunucu Veritabanını sorgulamak için SSL Labs web sitesindeki çevrimiçi aracı kullanabilirsiniz .

İşte sağladığı bilgilerin bir parçası:

alt metin

(google.com sonuçlarından ekran görüntüsü)


Bu tam olarak aradığım şeydi! Çok teşekkürler!
Jeremy Powell

11
Ne yazık ki standart portta yalnızca HTTPS'yi destekliyor, POP3S, IMAPS veya IMAP'ı TLS ile kontrol etmek için kullanamıyor
Hubert Kario

1
Sadece HTTPS'yi desteklerken, SNI desteği bile yoktur.
Gurken Papst

12
Halka açık siteler için harika olsa da, internetten izole edilmiş ağlardaki siteler için kullanamazsınız.
Iszi

53

sslscan güzel bir yardımcı programdır.

TLS ve SSL ile bağlanmayı test eder (ve derleme betiği kendi OpenSSL kopyası ile bağlanabilir, böylece eski SSL sürümleri de kontrol edilebilir) ve sunucunun şifre takımları ve sertifikası hakkında raporlar.

İçin örnek çıktı google.com(okunabilirlik için kısaltılmış):

$ 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 sslscanCentOS 6'da çalışıyor
bir kodlayıcı

1
sudo dnf install sslscanFedora 22’de de.
Zayne S Halsall 28:15

2
brew install sslscanOSX
Xiao

sudo apt-get install sslscanUbuntu'da (12.04 - tüm sürümler iyi olmalı).
balu

3
Güncelleme: Bu Debian ve Ubuntu depolarından (2009 şu anda 1.8.2) bulunan sslscan resmi versiyonu unutulmamalıdır gelmez TLS v1.1 ve 1.2 destekleyen, bkz bugs.launchpad.net/ubuntu/+source/sslscan / + böcek / 1372741 . Bu nedenle, OP'nin bağlı olduğu GitHub'taki sürüm kullanılmalıdır.
balu

15

Bu, SSL tarama araçları için harika bir referans ipliği olduğundan, bir yıl önce oluşturulmuş ve anahtar değişim şifreleriyle ilgili sorunları tanımlayabilen CipherScan'i listeleyeceğim. https://github.com/jvehent/cipherscan

SNI ve FreeBSD'yi destekleyen çatalımı istiyorsanız, URL https://github.com/oparoz/cipherscan

openssl s_clientGelecekteki özellikleri veya yeni şifreleri (örneğin, chacha20 + poly1305) test edebilmeniz için kendi OpenSSL ikili sisteminizi kullanarak çağıran ve destekleyen bir komut dosyasıdır .

Ayrıca, istediğiniz herhangi bir bağlantı noktasına bağlanmanıza ve starttls'leri kullanmanıza olanak tanır.

İşte tipik bir çıktı

# ./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

Ve işte seçeneklerin bir listesi

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

Json çıkışı, bunu diğer komut dosyalarından çağırıyorsanız kullanışlıdır.


"big-SSLv3 config desteklenmedi, bağlantı kurulamadı"
kodlayıcı


8

Küçük bir googlingden sonra bu Testi SSL-TLS (OWASP-CM-001) için buldum :

Nmap tarayıcı, “ZF” tarama seçeneği üzerinden SSL hizmetlerini tanımlayabilir. Güvenlik açığı Tarayıcılar, hizmet keşfini yapmaya ek olarak, (örneğin, zayıf şifrelere karşı kontrolleri içerebilir Nessus tarayıcı keyfi bağlantı noktalarında SSL hizmetlerini kontrol etme yeteneğine sahiptir ve zayıf şifrelere bildirir).

ve ayrıca: Foundstone SSL Digger , desteklenen şifreleri test ederek SSL sunucularının gücünü değerlendiren bir araçtır. Bu şifrelerin bir kısmının güvensiz olduğu bilinmektedir.



2

SSLScan harika; SSLDiagnos , Windows için çalışan yeni bir araç veya openssl s_client'i kullanarak sadece bir komut dosyası yazabilirsiniz.



2

Güzel bir grepable çıktı istiyorsanız (ve tüm SSL / TLS sürümlerini kontrol etmeyi destekliyorsanız)

Kullanım: ./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";

Sen performans sergiliyorsun openssl ciphers -tls1.1, openssl ciphers -tls1.2ancak bu paragraflar var gibi görünmüyor ... Sadece var -tls1(en azından denedim platformlarda).
Marki

(Orada şeklinde ek seçenekler gibi görünüyor tls1_1ve tls1_2ancak sadece gösterilir usta sürümü Openssl ve hatta 1.0.2 yılında ....)
Marki

Bu betiğin muhtemelen bir sunucunun OpenSSL’nin desteklemediği şifre takımlarını destekleyip desteklemediğini size söylemeyeceğini unutmayın.
sampablokuper

2

Pentesterscripting.com'da hem SSLScan hem de OpenSSL'den faydalanmak için güzel bir senaryo var :

  • SSL v2;
  • Hafta şifreli elbise;
  • MD5; ve
  • TLS'nin Yeniden Müzakere güvenlik açığı

http://www.pentesterscripting.com/discovery/ssl_tests (İnternet Arşivi Wayback Makinesi ile )

Ana site artık öldüğü için geleceğe yönelik koruma için burada çoğaltıldı:

#!/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

Kullanımı: ./ssltest.sh HOST PORT


2

@ İndiv'nin cevabı ve kendi cevabı olarak yayınladığı önerisine dayanarak, @ indiv'in senaryosunun ince versiyonunu veriyorum. Bir ana makineyi ilk argüman olarak sağlayabilirsiniz ve orijinal komut dosyasıyla aynı sonuçları verir, ancak biraz daha biçimlendirilmiş:

#!/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

Kez'in cevabında belirtilen SSL Labs çevrimiçi aracını geliştiren Ivan Ristić'in (ücretsiz) OpenSSL Yemek Kitabı :

Belirli bir sunucu tarafından desteklenen tüm süitleri belirlemek istiyorsanız openssl ciphers ALL, OpenSSL sürümünüz tarafından desteklenen tüm süitlerin bir listesini almak için çağrı yaparak başlayın . Sonra ayrı ayrı sınamak için onları sunucuya birer birer gönderin. Bunu manuel olarak yapmanızı önermiyorum; Bu, küçük bir otomasyonun uzun bir yol kat ettiği bir durumdur. Aslında, bu, etrafta iyi bir alet aramanın uygun olabileceği bir durumdur .

Ancak bu şekilde test etmenin bir dezavantajı var. Yalnızca OpenSSL'nin desteklediği süitleri test edebilirsiniz. ...

Hiçbir tek SSL / TLS kitaplığı tüm şifre paketlerini desteklememektedir ve bu kapsamlı bir testi zorlaştırmaktadır. SSL Labs için, bu amaç için kısmi el sıkışmalarını kullanmaya ve keyfi paketleri desteklemiş gibi davranan özel bir müşteriyle başvurdum . Aslında tek bir paketi bile pazarlayamaz, ancak yalnızca bir paketi önermek, sunucuların bir paketi destekleyip desteklemediğini size bildirmesi için yeterlidir. Tüm süitleri bu şekilde test etmekle kalmaz, aynı zamanda çok verimli bir şekilde yapabilirsiniz.

(Benim vurgum.)

Diğer cevaplarda bahsetmediğim bir araç, Stephen Bradshaw’un SSLTest’i , diğerlerinin yanı sıra “tespit edilen şifreleri ve protokolleri DSD ISM ve PCI-DSS gibi uyumluluk standartlarıyla karşılaştırmak” anlamına geliyor.

Öyleyse, bunu veya diğer cevaplarda belirtilen araçlardan birini deneyin ya da kendinizinkini oluşturun ve Ristić'in kısmi el sıkışmalarına yaklaşımını kullanarak düşünün.


1

Tam olarak bunu yapan bir araç yazdım. Adı tlsenum ve GitHub'da mevcut .

[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

İşte takımın aleyhine bir örnek çıktı twitter.com.

SSL Laboratuarı'nın yaptıklarına benzer, ancak otomatikleştirip ayrıştırabileceğiniz bir komut satırı aracına sahip olmanın çok daha faydalı olduğunu düşünüyorum.


1

Aslen https://github.com/iSECPartners/sslyze adresindeki SSLyze, şimdi https://github.com/nabla-c0d3/sslyze adresinde . Başka bir cevapta söz edildi , ama fazla ayrıntıya girmeden

SSLyze Python tabanlıdır ve komut satırından Linux / Mac / Windows'ta çalışır. OpenSSL kullanır ve Windows'ta bir paket OpenSSL kopyası ile birlikte gelir.

Protokolleri, şifre takımlarını ve temel ayrıntıları ve bazı genel güvenlik açıkları için testleri listeler. Belirli kontrolleri etkinleştirmek veya devre dışı bırakmak, daha fazla veri almak veya taramayı hızlandırmak mümkündür.


0

Yapabileceğiniz tek şey, hepsini birer birer denemek ve hangilerinin kabul edildiğini görmek. Bunu yapmak için bir aracın farkında değilim, ancak komut dosyası araçlarından birini bir araya getirmek zor olmamalı openssl s_client.

İstemci hangi şifreleri kabul edeceğini ilan ederken, sunucu basitçe bir tane seçer ve onu kullanır veya sevdiği bir şey bulamazsa bağlantıyı keser.


Oh evet ... bir sebepten ötürü bunun tersi olduğunu düşünüyordum. Belki önceden Arnavut kaldırımlı bir araç bulabilirim ... :)
Jeremy Powell

0

Bütün bu cevaplar iyi. Cevabın bir kısmı neden sunucu listesini bulmak için bir araca ihtiyacımız olduğunu açıklayabilir ve doğrudan TLS'den, sunucunun tüm sunuculara bağlandığı zaman TLS istemcisinin yaptığı gibi tüm desteklenen şifre takımlarını vermesini istemediğimizi açıklayabilir.

Cevap, sunucunun hiç bir liste göndermemesi , yalnızca istemci şifreleme listesinde kullanmak istediği şifreyi seçmesidir, bu SSL / TLS protokolünün yazıldığı yoldur: http://wiki.opensslfoundation.com/index.php/ SSL_and_TLS_Protocols # Cipher_Suites

Bu nedenle, istemci sunucu tarafından desteklenenleri bulabilmek için şifreleri numaralandırmalı ve bunun için her şifre paketi için en az bir yeni başlangıç ​​anlaşması (ClientHello) yapmalıdır.


0

AUTH TLSFTP'de bir şey ararken bu aracı keşfettim: ssl-cipher-suite-enum

Hackajar'ın kabuk senaryosunun yaptığı şeyi basitçe yapan, sadece daha karmaşık bir perl betiği.

Ayrıca sunulan şifrelerin ve protokollerin temel bir değerlendirmesini sunar. SSL Labs araçları gibi, sadece ev kullanımı için. :)

Varsayılan olarak, sadece AUTH SSLFTP'yi destekler , ancak basit bir arama ve değiştirme bunu çözebilir. Bonus olarak, SMTP'yi STARTTLSve RDP'yi desteklediğini de iddia ediyor .


0

TestSSLServer tamamen Java tabanlı bir çözümdür. Avantajları:

  • sadece düz Soketler üzerinde çok düşük seviyede çalışıyor, bu yüzden JDK veya OpenSSL'deki olası kullanılamayan şifrelerden bağımsız .

  • herhangi bir ek bağlantı noktasının (ping için ICMP gibi) açılmasını gerektirmez

  • mevcut müşteri sertifikalarıyla çalışıyor

Dezavantajları:

  • 2016'dan itibaren, şifrelerin listesi eski olabilir (bunu yargılama konusunda uzman değildim)

Kişisel deneyimim: sadece HTTPS portu açık (başka bir port yok), müşteri sertifikaları gerekli ve iptables aktif olan sıkı bağlanmış bir sunucu göz önüne alındığında, hala mevcut şifreleri listeleyebildi, oysa en iyi oy alan çözümler değildi (ben küçük kabuk betiğini deniyor, SSL Labs, NMap, sslscan)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.