Як перерахувати шифр SSL / TLS для певного веб-сайту?


261

Як я можу отримати список шифрів SSL / TLS для певного веб-сайту?

Я спробував openssl, але якщо вивчити вихід:

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

це просто показує, що набір шифрів - це щось із AES256-SHA. Я знаю, що міг би пролізти через шістнадцятковий дамп розмови, але я сподівався на щось трохи елегантніше.

Я вважаю за краще це робити в Linux, але Windows (або інше) було б добре. Це питання мотивоване тестуванням безпеки, яке я роблю для PCI та загальним тестуванням на проникнення.

Оновлення:

ГрегС вказує нижче, що сервер SSL вибирає з шифрових наборів клієнта. Тому, схоже, мені потрібно було б протестувати всі комплекти шифрів по одному. Я думаю, що я можу щось зламати разом, але чи є простіший, більш надійний (наприклад, нові шифри) спосіб зробити це?


Можливо gnutls-cli?
grawity

Після зміни заголовку це питання насправді не запитує програмне забезпечення. Голосування за повторне відкриття.
Боб

@ fixer1234 Якщо це робить вас щасливішим, я видалив будь-яке виникнення слова "інструмент". Основне питання - це питання, як все-таки виконати конкретне завдання; це незначна перефразовка і далеко не більш відкритий "тип програмного забезпечення" питань.
Боб

@Bob: Я в екстазі. :-) Голосування за повторне відкриття.
fixer1234

Відповіді:


232

Я написав сценарій bash для тестування набір шифрів. Він отримує список підтримуваних пакетів шифрів від OpenSSL і намагається підключитися, використовуючи кожен. Якщо рукостискання успішно, воно друкується YES. Якщо рукостискання не вдалося, воно друкується з NOподальшим текстом помилки OpenSSL.

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

Ось зразок виводу, що показує 3 непідтримувані шифри та 1 підтримуваний шифр:

[@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: Додайте гнучкість, оскільки хост і порт надаються як параметр сценарію


7
openssl 1.0 потребує змін: if [[ "$result" =~ "Cipher :" ]] ; thenзамість того, щоб if [[ "$result" =~ "Cipher is " ]] ; thenя також тестував на SSL2 і безпечний переговор: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'
Хуберт Каріо

9
Є ще один дуже складний скрипт оболонки, який використовує sslscan і openssl: TLSSLed
Роберт

2
Нижче я перелічив ще один сценарій, для якого потрібен лише OpenSSL під назвою CipherScan
Olivier - interfaSys

1
Зауважте, що цей сценарій, ймовірно, не повідомляє вам, чи підтримує сервер шифрові набори, які OpenSSL не підтримує.
sampablokuper

2
Пропозиція від @Robert для TLSSLed була фантастичною. Він був оновлений до 1.3 і має набагато більше функціональних можливостей. Я використовую для тестування безпеки, і треба сказати, що я вражений.
Джон Рік

162

Nmap з ssl-enum-шифрами

Немає кращого або швидшого способу отримати список доступних шифрів від мережевої послуги. Крім того, nmap забезпечить рейтинг міцності сильних, слабких або невідомих для кожного доступного шифру.

Спочатку скачайте скрипт ssl-enum-ciphers.nse nmap ( пояснення тут ). Потім із того самого каталогу, що і сценарій, запустіть nmap так:

Перерахуйте шифри, підтримувані HTTP-сервером

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

Перерахуйте шифри, які підтримуються сервером IMAP

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

Ось фрагмент виводу з сервера Dovecot IMAP:

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
Чи є спосіб використовувати цей скрипт в IMAP за допомогою STARTTLS? STARTTLS на SMTP, здається, працює, але в IMAP сценарій навіть не працює.
Гіель

Кілька речей: сценарій може бути запущений у вашому дистрибутиві nmap, а не той, який ви завантажили. Перевірте, перейменувавши свій. Потім перевірте "portrule", який у деяких версіях перевіряє часто використовувані номери портів. Замініть наportrule = function() \n return true \n end
тонкий

... і для роботи з IMAP STARTTLS, FTPS AUTH TLSі т. д. знадобиться деякий злом , але це можливо.
стрункий

1
Одним із застережень є те, що старіші сценарії, які можуть бути включені у ваш дистрибутив / пакунок, перераховують шифри в алфавітному порядку, а не уподобаний сервер (або клієнт). Дивіться вище коментар від @slim
Клінт Пахл

3
За два роки, відколи ця відповідь була написана, Nmap додав підтримку STARTTLS через FTP, NNTP, IMAP, LDAP, POP3, PostgreSQL, SMTP, XMPP, VNC та MS SQL, а також багато інших удосконалень, крім простого переліку підтримуваних шифрів .
бонсайвінг

104

Чи є інструмент, який може перевірити, що шифр SSL / TLS відповідає конкретному веб-сайту?

Так, ви можете використовувати онлайн-інструмент на веб-сайті лабораторій SSL для запиту загальнодоступної бази даних SSL-сервера.

Ось фрагмент інформації, яку він надає:

alt текст

(скріншот із результатів google.com)


Це саме те , що я шукав! Дуже дякую!
Джеремі Пауелл

11
На жаль, він підтримує лише HTTPS на стандартному порту, не може використовувати його для перевірки POP3S, IMAPS або IMAP за допомогою TLS
Hubert Kario

1
І хоча він підтримує лише HTTPS, йому навіть не вистачає підтримки для SNI.
Гуркен Папст

12
І хоча це чудово для загальнодоступних сайтів, ви не можете використовувати його для сайтів у мережах, ізольованих від Інтернету.
Ізі

53

sslscan - це приємна маленька утиліта.

Він перевіряє з'єднання з TLS та SSL (і сценарій збірки може пов'язувати з власною копією OpenSSL, щоб перевірятись і застарілі версії SSL) та повідомляє про шифрові набори сервера та сертифікат.

Приклад виведення для google.com(оброблений для читабельності):

$ 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 sslscanпрацює над CentOS 6.
кодер

1
sudo dnf install sslscanтакож на Fedora 22.
Zayne S Halsall

2
brew install sslscanна OSX
Сяо

sudo apt-get install sslscanна Ubuntu (12.04 - тому всі пізніші версії повинні бути нормальними).
balu

3
Оновлення: Слід зазначити, що офіційна версія sslscan, знайдена у сховищах Debian та Ubuntu (наразі 1.8.2 з 2009 року) , не підтримує TLS v1.1 та 1.2, див. Bugs.launchpad.net/ubuntu/+source/sslscan / + помилка / 1372741 . Тому слід використовувати версію на GitHub, з якою пов'язана ОП.
balu

15

Оскільки це така чудова орієнтир для інструментів сканування SSL, я перерахую CipherScan, який був створений рік тому, і також можна визначити проблеми з шифрами обміну ключами. https://github.com/jvehent/cipherscan

Якщо ви хочете, щоб моя вилка, яка підтримує SNI та FreeBSD, URL-адреса https://github.com/oparoz/cipherscan

Це сценарій, який викликає openssl s_clientта підтримує використання власного бінарного OpenSSL, щоб ви могли протестувати майбутні функції або нові шифри (chacha20 + poly1305 на приклад).

Це також дозволяє підключитися до будь-якого потрібного порту та використовувати starttlss.

Ось типовий вихід

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

А ось список варіантів

-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 корисний, якщо ви викликаєте це з інших сценаріїв.


"Конфігурація big-SSLv3 не підтримується, з'єднання не вдалося"
кодер


8

Після невеликого гуглінгу я виявив тестування на SSL-TLS (OWASP-CM-001) :

Птар сканер, з допомогою опції сканування «-sv», здатний ідентифікувати SSL послуги. Сканери вразливості, на додаток до виявлення послуг, можуть включати перевірки на слабкі шифри (наприклад, сканер Nessus має можливість перевірки служб SSL на довільних портах і повідомляє про слабкі шифри).

а також: Foundstone SSL Digger - це інструмент для оцінки міцності серверів SSL шляхом тестування підтримуваних шифрів. Деякі з цих шифрів, як відомо, є небезпечними.



2

SSLScan - це чудово; новий інструмент SSLDiagnos працює для Windows, або ви можете просто написати сценарій, використовуючи openssl s_client.



2

Якщо ви хочете отримати хороший вихід (та підтримка для перевірки всіх версій SSL / TLS)

Використання: ./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";

Ви виконуєте openssl ciphers -tls1.1і openssl ciphers -tls1.2проте ці Титули , здається, не існує ... Існує тільки -tls1(принаймні , на платформах , я пробував).
Marki

(Там , як видається, додаткові опції у вигляді tls1_1і , tls1_2але вони показані тільки на майстер - версії з OpenSSL і навіть не в 1.0.2 ....)
Marki

Зауважте, що цей сценарій, ймовірно, не повідомляє вам, чи підтримує сервер шифрові набори, які OpenSSL не підтримує.
sampablokuper

2

Існує хороший невеликий скрипт на pentesterscripting.com використовувати як SSLScan і OpenSSL для перевірки:

  • SSL v2;
  • Тижневі костюми шифрів;
  • MD5; і
  • Уразливість TLS для повторних переговорів

http://www.pentesterscripting.com/discovery/ssl_tests (через Інтернет-архів зворотної машини )

Дублюється тут для майбутньої ізоляції, оскільки основний сайт тепер мертвий:

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

Використання: ./ssltest.sh ГОЛОВНИЙ ПОРТ


2

На основі @ Індиві в відповідь і пропозицію , щоб опублікувати його в якості свого власного відповіді, я забезпечую свою подредактірованни версію сценарію @ Індиві в. Ви можете надати хост як перший аргумент, і він видасть ті самі результати, що й оригінальний сценарій, але трохи більше відформатований:

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

У (безкоштовно) кулінарній книзі OpenSSL Івана Рістіча, який розробив онлайн-інструмент Лабораторії SSL, зазначений у відповіді Кеза , зазначено:

Якщо ви хочете визначити всі набори, що підтримуються на певному сервері, почніть із виклику, openssl ciphers ALLщоб отримати список усіх наборів, підтримуваних вашою версією OpenSSL. Потім подайте їх на сервер по черзі, щоб перевірити їх окремо. Я не пропоную робити це вручну; це ситуація, коли невелика автоматизація проходить довгий шлях. Насправді, це ситуація, коли огляд хорошого інструменту може бути доречним .

Однак, для перевірки цього способу є недолік. Ви можете перевірити лише набори, які підтримує OpenSSL. ...

Жодна бібліотека SSL / TLS не підтримує всі набори шифрів , а це ускладнює всебічне тестування. Для лабораторій SSL я вдався до використання для цього часткових рукостискань із користувацьким клієнтом, який претендує на підтримку довільних наборів . Він насправді не може домовитись навіть про один пакет, але достатньо лише запропонувати переговори, щоб сервери могли сказати вам, підтримують вони пакет чи ні. Ви не тільки можете протестувати всі пакети таким чином, але і можете зробити це дуже ефективно.

(Мій наголос.)

Одним із інструментів, якого я не бачив у інших відповідях, є SSLTest Стівена Бредшова , який, серед іншого, призначений для порівняння "виявлених шифрів та протоколів із стандартами відповідності, такими як DSD ISM та PCI-DSS".

Отже, спробуйте цей або один із інструментів, згаданих в інших відповідях, або ж побудуйте свій власний і подумайте про те, як використовувати підхід Ristić до часткових рукостискань.


1

Я написав інструмент, який робить саме це. Він називається tlsenum, і він доступний на GitHub .

[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

Ось приклад виведення інструменту проти twitter.com.

Це схоже на те, що робить лабораторія SSL, але я вважаю, що набагато корисніше мати інструмент командного рядка, який можна автоматизувати та аналізувати.


1

SSLyze, спочатку на https://github.com/iSECPartners/sslyze , зараз знаходиться на веб- сайті https://github.com/nabla-c0d3/sslyze . Про це було сказано в іншій відповіді , але без особливих деталей.

SSLyze заснований на Python і працює з Linux / Mac / Windows з командного рядка. Він використовує OpenSSL, а в Windows постачається з пакетною копією OpenSSL.

Перелічує протоколи, набір шифрів та ключові деталі, а також тести на деякі загальні вразливості. Можна включити або вимкнути конкретні перевірки, отримати більше даних або прискорити сканування.


0

Єдине, що ви можете зробити - спробувати їх усі, по одному, і подивитися, які з них прийняті. Мені не відомо про інструмент для цього, хоча це не повинно бути важко обмотати один із інструментів сценаріїв і openssl s_client.

У той час як клієнт рекламує, які шифри прийме, сервер просто вибирає його та використовує або припиняє з'єднання, якщо не знаходить нічого, що йому подобається.


О так ... я чомусь думав, що це навпаки. Можливо, я можу знайти заздалегідь оброблений інструмент ... :)
Джеремі Пауелл

0

Усі ці відповіді чудово. Одна частина відповіді може пояснити, чому нам потрібен інструмент для виявлення списку сервера, а не запитувати безпосередньо в TLS, що сервер надає всі підтримувані набори шифрів так, як це робить клієнт TLS, коли він підключається до сервера.

Відповідь полягає в тому, що сервер не надсилає список ніколи , він просто вибирає в списку шифрів клієнта шифр, який він хоче використовувати, саме так пишеться протокол SSL / TLS: http://wiki.opensslfoundation.com/index.php/ SSL_and_TLS_Protocols # Cipher_Suites

Ось чому клієнт повинен перерахувати шифри, щоб можна було знайти тих, які підтримуються сервером, і щоб зробити щонайменше одне нове рукостискання запуску (ClientHello) для кожного набору шифрів.


0

Шукаючи щось AUTH TLSна FTP, я виявив цей інструмент: ssl-cipher-suite-enum

Це сценарій perl, який, в основному, робить те, що робить сценарій оболонки hackajar, лише більш складний.

Він також пропонує базову оцінку пропонованих шифрів та протоколів. Це дещо схоже на інструменти SSL Labs, лише для домашнього використання. :)

За замовчуванням він підтримує лише AUTH SSLFTP, але простий пошук та заміна можуть виправити це. Як бонус, він також претендує на підтримку SMTP з STARTTLSта RDP.


0

TestSSLServer - суто Java-рішення. Переваги:

  • він працює дуже низько, просто на звичайних сокетах, тому він не залежить від можливих недоступних шифрів від JDK або OpenSSL .

  • для цього не потрібно відкривати будь-які додаткові порти (наприклад, ICMP для ping)

  • він працює з наявними сертифікатами клієнтів

Недоліки:

  • станом на 2016 рік, список шифрів може бути застарілим (хоча я тут не знаю, щоб судити про це)

Мій особистий досвід: враховуючи жорсткий сервер із відкритим лише одним портом HTTPS (жодного іншого порту), необхідних сертифікатів клієнта та активних iptables, він все ще міг перелічити доступні шифри, тоді як рішення, проголосовані за версією, не було (я був спробу невеликого сценарію оболонки, SSL Labs, NMap, sslscan)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.