Найти версию SSL после рукопожатия в OpenSSL

Я хочу узнать протоколы, поддерживаемые целью, но проблема в том, что их довольно много веб-сайтов, которые не поддерживают определенную версию, но когда я выполнил рукопожатие, оно было успешным, потому что цель превзошла версию, которую я дал, и выполнил рукопожатие на поддерживаемая версия [это произошло только на 1 сайте]

пример: я передал версию: TLSVersion.TLS

version = [SSL.SSLv23_METHOD,
            SSL.TLSv1_METHOD,
            SSL.TLSv1_1_METHOD,
            SSL.TLSv1_2_METHOD]
context = OpenSSL.SSL.Context(version)
soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
soc.settimeout(CONNECTION_TIMEOUT)
connection = OpenSSL.SSL.Connection(context,soc)
connection.connect((host,port))
connection.do_handshake() 
#wants to check version here
2, но рукопожатие выполняется с использованием TLSv1_0, потому что он не поддерживает TLSVersion.TLS
version = [SSL.SSLv23_METHOD,
            SSL.TLSv1_METHOD,
            SSL.TLSv1_1_METHOD,
            SSL.TLSv1_2_METHOD]
context = OpenSSL.SSL.Context(version)
soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
soc.settimeout(CONNECTION_TIMEOUT)
connection = OpenSSL.SSL.Connection(context,soc)
connection.connect((host,port))
connection.do_handshake() 
#wants to check version here
2

Из-за вышеуказанной проблемы я хочу проверить версию при рукопожатии и не хочу использовать scapy.ssl_tls

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

person Hassan Anwer    schedule 15.10.2016    source источник


Ответы (2)


я хочу проверить версию на рукопожатии

Соответствующие функции для проверки версии, используемой клиентом и сервером для оставшегося сеанса в pyOpenSSL, — это get_protocol_version_name или get_protocol_version:

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

Обратите внимание, что эти функции доступны только с версии pyOpenSSL 0.16.0.

Также обратите внимание на то, что вы не можете указать список методов TLS при создании контекста, но только один метод, который по существу указывает минимальную версию TLS, поддерживаемую клиентом. Таким образом

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

позволяет клиенту использовать TLS 1.0 и выше. Если вместо этого вы используете SSL.TLSv1_2_METHOD, клиент будет ограничен TLS 1.2 и выше и, следовательно, не сможет установить SSL-соединение с сервером, поддерживающим только TLS 1.0.

person Steffen Ullrich    schedule 16.10.2016
comment
у меня нет этой функции в моей версии. --python-openssl уже является самой новой версией (0.15.1-2build1) - person Hassan Anwer; 16.10.2016
comment
@hassan_anwer: процитирую себя: эти функции доступны только начиная с pyOpenSSL 0.16.0. И поскольку текущая версия – 0.16.2, ваша версия 0.15.1, очевидно, не самый новый. Это может быть самая новая версия, поставляемая с вашей системой, но это другое дело. - person Steffen Ullrich; 16.10.2016
comment
@hassan_anwer: если ваша система не предоставляет необходимую версию pyOpenSSL и вы не знаете, как ее установить, вы можете установить anaconda python, который включает pyOpenSSL 0.16. Его можно установить отдельно от существующего python. - person Steffen Ullrich; 16.10.2016
comment
понял, спасибо, я обновляюсь с помощью этого apt-get install libssl-dev - person Hassan Anwer; 16.10.2016
comment
sudo pip установить --обновить pyopenssl - person Hassan Anwer; 16.10.2016
comment
Ульрих.. Еще одна проблема, когда я пытаюсь сделать этот контекст = OpenSSL.SSL.Context(OpenSSL.SSL.SSLv3_METHOD), он дает мне OpenSSL.SSL.Error: [('SSL подпрограммы', 'SSL_CTX_new', 'null ssl метод пройден')] - person Hassan Anwer; 16.10.2016
comment
@hassan_anwer: возможно, ваш openssl скомпилирован без поддержки SSL 3.0. См. также askubuntu.com/questions/774760/. - person Steffen Ullrich; 16.10.2016
comment
любой способ включить его? - person Hassan Anwer; 16.10.2016
comment
@hassan_anwer: перекомпилируйте openssl и т. д. Кроме того: это вопрос, отличный от исходного, поэтому, пожалуйста, задавайте его как новый, а не как комментарий. - person Steffen Ullrich; 16.10.2016
comment
pyOpenssl кажется устаревшим. При использовании тайм-аута сокета SSL прерывается. Также сложно ограничить TLS-версии. ssl-library работает лучше. - person Jari Turkia; 03.03.2020

Найти версию SSL после рукопожатия в OpenSSL...

Если я правильно разбираю то, что вы хотите... вы хотите, чтобы версия протокола была напечатана openssl s_client:

$ openssl version
OpenSSL 1.1.0b  26 Sep 2016

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

Первое сообщение "Новое, TLSv1.2" сообщает вам о шифре. То есть, когда ECDHE-RSA-CHACHA20-POLY1305 впервые появился в TLS. В случае с ECDHE-RSA-CHACHA20-POLY1305 набор шифров впервые появился в TLS 1.2.

Исходный код для s_client находится по адресу <openssl src>/apps/s_client.c. Код, ответственный за OpenSSL 1.0.2, находится в строке 2210:

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

Во втором сообщении "Протокол: TLSv1.2" указывается версия протокола, используемая при обмене ключами и последующем выборе шифра и массовой передаче.

Код, ответственный за OpenSSL 1.0.2, находится <openssl src>/ssl/ssl_txt.c вокруг строки 105:

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

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

    ...
}

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

Это другая проблема. Вы должны посмотреть исходный код для sslscan на странице SSLScan – быстрый сканер SSL. чтобы увидеть, как это работает. Sourceforge кажется заброшенным. В нем отсутствует SNI и другие новые функции, такие как безопасное согласование и ALPN.

Вы можете попробовать это sslscan с GitHub: rbsec/sslscan. GitHub активно поддерживается и, кажется, более актуален.


пример: я передал версию: TLSVersion.TLSopenssl s_client2, но рукопожатие выполняется с использованием TLSv1_0, потому что он не поддерживает TLSVersion.TLSopenssl s_client2

Этого не произойдет. TLS указывает только одну версию протокола. Идея заключается в том, чтобы попробовать TLS 1.2. Если это не удается, вы возвращаетесь к TLS 1.1. Если это не удается, вы возвращаетесь к TLS 1.0. До бесконечности.

Подход «попробуй и откажись» является причиной RFC 7504, Ценность набора шифров сигнализации TLS Fallback (SCSV) для предотвращения Атаки на понижение версии протокола. Это был ужасный помощник от толпы Browser. См., например, Последний вызов: (значение комплекта шифров резервной сигнализации TLS) (SCSV) для предотвращения атак с понижением версии протокола) до предлагаемого стандарта.

TLS не поддерживает ряд версий протокола, как думают многие. Мы несколько раз пытались его изменить. См., например, новый механизм согласования версии TLS. .

person jww    schedule 15.10.2016
comment
Спасибо за понимание! это заслуживает большего количества голосов :-) - person ryenus; 01.06.2020