使用Scapy制作DTLS ClientHello数据包

时间:2019-09-17 15:56:41

标签: python ssl scapy dtls

我将使用Scapy模拟DTLS初始握手。由于Scapy不支持DTLS,因此我不得不使用scapy-ssl_tls来构建DTLS数据包。我首先使用TLS进行了尝试,然后发送了ClientHello,如下所示:

p = TLSRecord() / TLSHandshakes(handshakes=[TLSHandshake() /
                                            TLSClientHello(compression_methods=list(range(0xff))[::-1],
                                                           cipher_suites=list(range(0xff)))])

它完全可以正常工作。但是,当我尝试发送DTLS ClientHello时,在Wireshark中出现了Fragment runs past the end of message错误。我使用以下代码发送DTLS数据包。

p = DTLSRecord(epoch = 0, sequence = 0) / DTLSHandshake() / DTLSClientHello(cipher_suites=list(range(0xff)))

如果您还有其他制作DTLS数据包的想法,请通知我。

1 个答案:

答案 0 :(得分:0)

scapy-ssl_tls支持对DTLS非常基本的支持。这里可能出问题的是,您没有为ClientHello,CipherSuites和HandShake设置正确的长度。您还需要确保设置正确的片段长度。

target = (dst, port)

suites = [TLSCipherSuite.RSA_WITH_AES_128_CBC_SHA, \
            TLSCipherSuite.RSA_WITH_AES_128_GCM_SHA256]

#Calculate the length of the ciphersuites
suites_length = 2*len(suites)
d1_ch = DTLSClientHello(cipher_suites=suites, cipher_suites_length=suites_length)

#Calculate ClientHello Length
d1_ch_len = len(str(d1_ch))

#Populate the Handshake message
d1_hs = DTLSHandshake(length=d1_ch_len, fragment_offset=0)

#Get the length of the DTL handshake message
d1_hs_len = len(str(d1_hs))

#Construct the DTLS ClientHello Request
record_len = d1_hs_len + d1_ch_len
p = DTLSRecord(length=record_len) / d1_hs / d1_ch

p.show()
print ("sending DTLS payload")
s.sendto(str(p), target)
resp = s.recv(1024 * 8)
print ("received, %s" % repr(resp))
SSL(resp).show()

s.close()