Как мне перечислить наборы шифров SSL / TLS, которые предлагает конкретный веб-сайт?

260

Как я могу получить список наборов шифров 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, и общим тестированием на проникновение.

Обновить:

GregS указывает ниже, что сервер SSL выбирает из комплектов шифров клиента. Так что, похоже, мне нужно будет протестировать все наборы шифров по одному. Я думаю, что могу что-то взломать, но есть ли более простой, более перспективный способ (например, новые шифры) сделать это?

Джереми Пауэлл
источник
Может быть gnutls-cli?
grawity
После смены названия этот вопрос действительно не требует программного обеспечения. Голосование возобновить.
Боб
@ fixer1234 Если это делает вас счастливее, я удалил любое вхождение слова «инструмент». Основной вопрос - как решить конкретную задачу? это небольшая перефразировка и далеко не все более открытые вопросы типа «список программного обеспечения».
Боб
@ Боб: Я в восторге. :-) Голосование возобновить.
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

РЕДАКТИРОВАТЬ: добавить гибкость, так как хост и порт предоставляются в качестве параметра для сценария

Indiv
источник
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
Robert
2
Ниже я перечислил другой скрипт, для которого требуется только OpenSSL, называемый CipherScan
Olivier - interfaSys,
1
Обратите внимание, что этот скрипт, вероятно, не скажет вам, поддерживает ли сервер наборы шифров, которые не поддерживает OpenSSL.
Сампаблокупер 19.09.16
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
За 2 года, прошедшие с момента написания этого ответа, Nmap добавил поддержку STARTTLS по FTP, NNTP, IMAP, LDAP, POP3, PostgreSQL, SMTP, XMPP, VNC и MS SQL, а также многих других улучшений, помимо простого перечисления поддерживаемых шифров. ,
Бонсайвинг 19.09.16
104

Есть ли инструмент, который может проверить, что наборы шифров SSL / TLS предлагает определенный веб-сайт?

Да, вы можете использовать онлайн-инструмент на веб-сайте SSL Labs для запроса к публичной базе данных SSL-сервера.

Вот фрагмент информации, которую он предоставляет:

альтернативный текст

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

Кез
источник
Это именно то , что я искал! Большое спасибо!
Джереми Пауэлл
11
К сожалению, он поддерживает только HTTPS на стандартном порту, не может использовать его для проверки POP3S, IMAPS или IMAP с TLS
Хуберт Карио
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
Indiv
источник
1
yum install sslscanработает на CentOS 6.
кодер
1
sudo dnf install sslscanна Fedora 22 также.
Зейн С. Холсолл,
2
brew install sslscanна OSX
Сяо
sudo apt-get install sslscanна Ubuntu (12.04 - так что все более поздние версии должны быть в порядке).
Балу
3
Обновление: следует отметить, что официальная версия sslscan, найденная в репозиториях Debian и Ubuntu (в настоящее время 1.8.2 из 2009) , не поддерживает TLS v1.1 и 1.2, см. Bugs.launchpad.net/ubuntu/+source/sslscan / + ошибка / 1372741 . Поэтому следует использовать версию на GitHub, с которой связан OP.
Балу
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 полезен, если вы вызываете это из других скриптов.

Оливье - interfaSys
источник
«Конфигурация big-SSLv3 не поддерживается, соединение не установлено»
кодер
8

После небольшого поиска я нашел это Тестирование для SSL-TLS (OWASP-CM-001) :

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

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

fluxtendu
источник
2

SSLScan великолепен; новый инструмент SSLDiagnos работает для Windows, или вы можете просто написать скрипт, используя openssl s_client.

Дуэйн
источник
2

Сценарий Nmap ssl-enum-ciphers может перечислять поддерживаемые шифры и версии SSL / TLS, а также поддерживаемые компрессоры.

bonsaiviking
источник
1
Ваш ответ был ранее, но ответ Клинта Пахла объясняет гораздо более подробно. ssl-enum-ciphers
Сампаблокупер 19.09.16
2

Если вам нужен хороший вывод grepable (и поддержка проверки всех версий 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";
hackajar
источник
Вы выполняете, openssl ciphers -tls1.1и, openssl ciphers -tls1.2тем не менее, эти параметры, кажется, не существуют ... Есть только -tls1(по крайней мере, на платформах, которые я пробовал).
Марки
(Похоже, есть дополнительные опции в виде tls1_1и, tls1_2но они показаны только в основной версии openssl и даже не в 1.0.2 ....)
Marki
Обратите внимание, что этот скрипт, вероятно, не скажет вам, поддерживает ли сервер наборы шифров, которые не поддерживает OpenSSL.
Сампаблокупер 19.09.16
2

На pentesterscripting.com есть небольшой скрипт, который использует SSLScan и OpenSSL для проверки:

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

http://www.pentesterscripting.com/discovery/ssl_tests (через интернет-архив Wayback Machine )

Дублирован здесь для защиты будущего, так как основной сайт уже мертв:

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

Pi3cH
источник
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
insaner
источник
2

(Бесплатно) Поваренная книга OpenSSL Ивана Ристича, который разработал онлайн-инструмент SSL Labs, отмеченный в ответе Кеза , гласит:

Если вы хотите определить все наборы, поддерживаемые определенным сервером, начните с вызова openssl ciphers ALLсписка всех наборов, поддерживаемых вашей версией OpenSSL. Затем отправьте их на сервер один за другим, чтобы проверить их по отдельности. Я не предлагаю вам делать это вручную; Это ситуация, в которой небольшая автоматизация проходит долгий путь. Фактически, это ситуация, в которой поиск подходящего инструмента может быть уместным .

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

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

(Мой акцент.)

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

Итак, попробуйте этот или один из инструментов, упомянутых в других ответах, или создайте свой собственный и подумайте об использовании подхода Ристича по частичному рукопожатию.

sampablokuper
источник
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 Lab, но я считаю, что наличие инструмента командной строки, который вы можете автоматизировать и анализировать, гораздо полезнее.

Ayrx
источник
1

SSLyze, первоначально на https://github.com/iSECPartners/sslyze , теперь находится на https://github.com/nabla-c0d3/sslyze . Это было упомянуто в другом ответе , но без особых подробностей.

SSLyze основан на Python и работает на Linux / Mac / Windows из командной строки. Он использует OpenSSL, а в Windows поставляется в комплекте с копией OpenSSL.

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

CBHacking
источник
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-скрипт, который в основном делает то, что делает shell-скрипт hackajar, только более сложный.

Он также предлагает базовую оценку предлагаемых шифров и протоколов. Это похоже на инструменты SSL Labs, только для домашнего использования. :)

По умолчанию он поддерживает только AUTH SSLFTP, но простой поиск и замена могут это исправить. В качестве бонуса он также утверждает, что поддерживает SMTP с STARTTLSи RDP.

Даниэль Б
источник
0

TestSSLServer - это решение, основанное исключительно на Java. Преимущества:

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

  • не требует открытия дополнительных портов (например, ICMP для ping)

  • работает с сертификатами клиентов

Недостатки:

  • с 2016 года список шифров может устареть (хотя я здесь не эксперт, чтобы судить об этом)

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

mstrap
источник