Forjar paquetes SSL/TLS con Scapy (python)

Estoy tratando de falsificar algunos paquetes SSL/TLS, pero hasta ahora no he encontrado ninguna biblioteca en Scapy. ¿Existen bibliotecas SSL/TLS públicas para Scapy o equivalentes?

Si no existe con Scapy, ¿hay algún programa equivalente a Scapy que ayudaría a realizar los mismos objetivos?

Debe poder crear paquetes de registro, protocolo de enlace y error, en lo que me refiero a todo tipo de contenido SSL/TLS.

OpenSource y el software libre serían geniales, o el software libre si en realidad no lo son. ¿Es posible vincular Scapy con OpenSSL, por ejemplo?

¿Te importa la licencia? ¿Qué hay de los precios?
Opensource sería genial, si hay herramientas existentes. De lo contrario, software libre.

Respuestas (3)

Hay Scapy TLS que implementa algunas partes del protocolo TLS como:

  • TLSClientHola
  • ServidorTLSHola
  • Certificado TLS
  • TLSServerNameIndication
  • TLSChangeCipherSpec
  • TLSHeartBeat

Ejemplo de código:


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

La extensión se puede encontrar aquí:

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

Puedes probar tls_prober (o más bien pytls ). Afirma poder crear varios mensajes TLS, aunque descubrí que el código en la presentación no funciona como se anuncia. Sin embargo, un código como este parece funcionar:

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

Está tlsfuzzer que no solo tiene generadores para varios mensajes [ 1 , 2 ], también puede verificar si las respuestas del servidor son las esperadas [ 3 , 4 ] (mensajes enviados, sus contenidos, presencia de alertas, etc.), tiene apoyo para negociar (y renegociar) [ 5 ] la sesión completa de TLS, así como para reanudarla [ 6 ].

De las principales funciones de TLS, solo ECDSA y los tickets de sesión no son compatibles, todo lo demás, como el protocolo en sí, desde SSLv3 a TLSv1.2, ECDHE, RSA, DHE, AES-GCM, ChaCha20, certificados de cliente y muchos otros, funciona como se esperaba. Al mismo tiempo, no depende de bibliotecas criptográficas externas, por lo que todas esas características son compatibles con distribuciones tan antiguas como RHEL/CentOS 5 (siempre que esté instalado Python 2.6 de EPEL) y tan nuevas como Archlinux actual con Python 3.5.

Para generar mensajes completamente arbitrarios, puede usar RawMessageGenerator, como este:

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

Divulgación completa: soy el principal desarrollador de tlsfuzzer.