Создание пакетов SSL/TLS с помощью Scapy (python)

Я пытаюсь подделать несколько пакетов SSL/TLS, но пока не нашел никаких библиотек в Scapy. Существуют ли общедоступные библиотеки SSL/TLS для Scapy или эквивалентов?

Если его нет в Scapy, есть ли эквивалентная программа Scapy, которая помогла бы выполнить те же задачи?

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

OpenSource и свободные программы были бы великолепны, или свободные программы, если их на самом деле нет. Можно ли, например, связать Scapy с OpenSSL?

Вас волнует лицензия? как насчет цен?
Opensource было бы здорово, если бы существовали инструменты. В противном случае, бесплатные программы.

Ответы (3)

Существует Scapy TLS, который реализует некоторые части протокола TLS, такие как:

  • TLSClientПривет
  • TLSServerПривет
  • TLSCertificate
  • TLSServerNameIndication
  • TLSChangeCipherSpec
  • TLSHeartBeat

Пример кода:


import scapy
from scapy.layers.ssl_tls import *

import socket

target = ('target.local',443)

# create tcp socket
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(target)

p = TLSRecord(version="TLS_1_1")/TLSHeartBeat(length=2**14-1,data='bleed...')

s.sendall(p)
resp = s.recv(1024)
print "resp: %s"%repr(resp)
s.close()

Расширение можно найти здесь:

https://github.com/tintinweb/scapy-ssl_tls

Вы можете попробовать tls_prober (точнее, pytls ). Он утверждает, что может создавать различные сообщения TLS, хотя я обнаружил, что код в презентации не работает так, как рекламируется. Однако такой код работает:

def make_heartbeat():
    heartbeat = HeartbeatMessage.create(HeartbeatMessage.HeartbeatRequest,
                                        'X', 0x4000)

    record = TLSRecord.create(content_type=TLSRecord.Heartbeat,
                              version=TLSRecord.TLS1_0,
                              message=heartbeat.bytes)

    #hexdump(record.bytes)
    return record.bytes

Существует tlsfuzzer , который не только имеет генераторы для различных сообщений [ 1 , 2 ], он также может проверять, соответствуют ли ответы сервера ожидаемым [ 3 , 4 ] (отправленные сообщения, их содержимое, наличие предупреждений и т. д.), он имеет поддержка согласования (и повторного согласования) [ 5 ] полного сеанса TLS, а также его возобновления [ 6 ].

Из основных функций TLS не поддерживаются только ECDSA и билеты сеанса, все остальное, например, сам протокол от SSLv3 до TLSv1.2, ECDHE, RSA, DHE, AES-GCM, ChaCha20, клиентские сертификаты и многие другие, работает должным образом. В то же время он не зависит от внешних криптографических библиотек, поэтому все эти функции поддерживаются как в старых дистрибутивах, таких как RHEL/CentOS 5 (при условии, что установлен Python 2.6 от EPEL), так и в новых, как текущий Archlinux с Python 3.5.

Чтобы генерировать совершенно произвольные сообщения, вы можете использовать RawMessageGenerator, например:

node = Connection('example.com', 443)  # TCP level connection
node.add_child(RawMessageGenerator(ContentType.application_data,
                                   bytearray(b'Raw data in message')))
runner = Runner(node)
runner.run()

Полное раскрытие: я основной разработчик tlsfuzzer.