Вопрос

Я наткнулся на этот скрипт на Python который проверяет сервер на наличие уязвимости HeartBleed:

Сможет ли кто-нибудь объяснить содержание "привета", что отправляется и как был сконструирован этот контент?

Я не пытаюсь использовать этот скрипт злонамеренно.Меня попросили протестировать сервер Tomcat 7.0.2 на наличие уязвимости:Я проверил, что tcnative-1.dll действительно использует openssl 1.0.1d, но несколько автономных тестовых инструментов, с помощью которых я пробовал тестировать сервер, сообщают, что он не уязвим.

Это было полезно?

Решение

hello и hb определите байтовые строки более удобочитаемым способом.

То h2bin(x) функция выполняет всю работу:

def h2bin(x):
    return x.replace(' ', '').replace('\n', '').decode('hex')

таким образом, в строке из шестнадцатеричных цифр удаляются все пробелы, а затем она декодируется из шестнадцатеричного формата в байты:

>>> '16 03 02 00 dc'.replace(' ', '')
'16030200dc'
>>> '16 03 02 00 '.replace(' ', '').decode('hex')
'\x16\x03\x02\x00\xdc'

Это просто компактный способ указать последовательность байтов, используя шестнадцатеричную запись и дополнительные пробелы.

Сами шестнадцатеричные данные - это просто обычные сообщение протокола сердцебиения, в необработанных байтах.То hello строка содержит TLS 1.1 запись сообщения, идентифицируемый первым байтом (16 шестнадцатеричный, 22 десятичных знака) в качестве записи рукопожатия, отправляющей client_hello (шестой байт - это 01).Это просто настройка сеанса TLS, сообщающего серверу, какие шифры поддерживает клиент.На самом деле не имеет значения, что в нем содержится, кроме того, что оно сообщает серверу, что клиент поддерживает расширение Heartbeat (a 00 0f пара байтов в конце сообщения).

Это hb сообщение это действительно интересно:

hb = h2bin(''' 
18 03 02 00 03
01 40 00
''')

18 является записью типа содержимого heartbeat, 03 02 идентифицирует версию протокола TLS 1.1.То 00 03 указывает, насколько велика полезная нагрузка сообщения;3 байта, или вся вторая строка.

3 байта самого сообщения состоят из типа heartbeat (01, или "запрос"), и длина сообщения (40 00, 16384 байта), за которым следует никакого реального сообщения.Это приводит к тому, что неработающий SSL-сервер отправляет обратно ответ heartbeat, содержащий 16 Кб памяти;повторяется несуществующее сообщение запроса длиной 0 плюс память, чтобы компенсировать длину запроса.

Другие советы

Эта страница много объяснила об этом.

const unsigned char good_data_2[] = {
    // TLS record
    0x16, // Content Type: Handshake
    0x03, 0x01, // Version: TLS 1.0
    0x00, 0x6c, // Length (use for bounds checking)
        // Handshake
        0x01, // Handshake Type: Client Hello
        0x00, 0x00, 0x68, // Length (use for bounds checking)
        0x03, 0x03, // Version: TLS 1.2
        // Random (32 bytes fixed length)
        0xb6, 0xb2, 0x6a, 0xfb, 0x55, 0x5e, 0x03, 0xd5,
        0x65, 0xa3, 0x6a, 0xf0, 0x5e, 0xa5, 0x43, 0x02,
        0x93, 0xb9, 0x59, 0xa7, 0x54, 0xc3, 0xdd, 0x78,
        0x57, 0x58, 0x34, 0xc5, 0x82, 0xfd, 0x53, 0xd1,
        0x00, // Session ID Length (skip past this much)
        0x00, 0x04, // Cipher Suites Length (skip past this much)
            0x00, 0x01, // NULL-MD5
            0x00, 0xff, // RENEGOTIATION INFO SCSV
        0x01, // Compression Methods Length (skip past this much)
            0x00, // NULL
        0x00, 0x3b, // Extensions Length (use for bounds checking)
            // Extension
            0x00, 0x00, // Extension Type: Server Name (check extension type)
            0x00, 0x0e, // Length (use for bounds checking)
            0x00, 0x0c, // Server Name Indication Length
                0x00, // Server Name Type: host_name (check server name type)
                0x00, 0x09, // Length (length of your data)
                // "localhost" (data your after)
                0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x68, 0x6f, 0x73, 0x74,
            // Extension
            0x00, 0x0d, // Extension Type: Signature Algorithms (check extension type)
            0x00, 0x20, // Length (skip past since this is the wrong extension)
            // Data
            0x00, 0x1e, 0x06, 0x01, 0x06, 0x02, 0x06, 0x03,
            0x05, 0x01, 0x05, 0x02, 0x05, 0x03, 0x04, 0x01,
            0x04, 0x02, 0x04, 0x03, 0x03, 0x01, 0x03, 0x02,
            0x03, 0x03, 0x02, 0x01, 0x02, 0x02, 0x02, 0x03,
            // Extension
            0x00, 0x0f, // Extension Type: Heart Beat (check extension type)
            0x00, 0x01, // Length (skip past since this is the wrong extension)
            0x01 // Mode: Peer allows to send requests
};
.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top