我将使用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数据包的想法,请通知我。
答案 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()