scapy.layers.tls.record

常见的TLS字段和绑定.

该模块覆盖记录层,以及ChangeCipherSpec,Alert和ApplicationData子消息. 有关握手类型,请参阅tls_handshake.py.

有关更多信息,请参见TLS类文档.

class scapy.layers.tls.record.TLS(*args, **kargs)

Bases: scapy.layers.tls.session._GenericTLSSessionInheritance

通用TLS记录消息,基于RFC 5246的6.2节.

在读取TLS消息时,我们会尝试尽可能多地解析. 在.pre_dissect()中,根据当前密码算法的类型(self.tls_session.rcs.cipher.type),我们提取" iv"," mac"," pad"和" padlen". 这些字段中的某些字段可能保持空白:例如,使用流密码时,没有IV或任何填充. " len"应始终保留加密消息的长度; 对于纯文本版本,应依靠附加的'deciphered_len'属性.

XXX修复AEAD解密失败时不应定义的'deciphered_len'. 这与下面的" decryption_success"有关. 此外,在record_sslv2.py和record_tls13.py中遵循此行为

一旦我们隔离了加密的消息聚合(应该是一个或多个相同类型的TLS消息),我们便尝试对其进行解密. 我们要么成功并将清除的数据存储在" msg"中,要么我们因CipherError失败而将加密的数据存储在" msg"中.

除非用户通过传递" tls_session"来手动提供会话机密,否则显然不会解密已加密的消息. 确实,当试图解析清晰的握手消息时,也可能需要适当的上下文.

例如,假设您嗅探了DHE-RSA协商的开始:

t1 = TLS(<client_hello>)
t2 = TLS(<server_hello | certificate | server_key_exchange>)
t3 = TLS(<server_hello | certificate | server_key_exchange>,
         tls_session=t1.tls_session)

(请注意,要正确执行操作,此处的" t1.tls_session"实际上应为" t1.tls_session.mirror()".有关说明,请参见session.py.)

由于没有上下文传递给t2,因此也没有任何client_random. 因此,Scapy将无法在t2内验证server_key_exchange的签名. 但是,由于tls_session,它应该能够在t3时这样做. 如前所述,在尝试解析加密内容时,没有完整的TLS上下文的后果更加明显.

因此,为了与Scapy解析受TLS保护的通信:_任一个Scapy都会从TLS连接的一侧读取每条消息,并从另一侧构建每条消息(因此,它应该知道生成pre_master_secret所需的秘密) ,同时传递相同的tls_session上下文(这是我们automaton.py大部分工作的方式); _或,如果Scapy没有构建任何TLS消息,则它必须创建TLS上下文并使用通过任何技术检索到的机密提供给它. 请注意,如果使用PFS密码套件,仅知道服务器证书的私钥是不够的. 但是,如果您以某种方式获得了master_secret,请将其与tls_session.(w | r)cs.derive_keys()结合使用,然后将其余部分留给Scapy.

当使用raw_stateful构建TLS消息时,我们期望tls_session具有正确的密码参数. 否则,.post_build()可能会失败.

aliastypes
deciphered_len
classmethod dispatch_hook(_pkt=None, *args, **kargs)

如果在原始SSLv2数据上调用了TLS类,则我们想返回一个SSLv2记录实例. 我们承认存在msglen为0x1403、0x1503、0x1603或0x1703的SSLv2数据包的风险,这些数据永远不会被转换为SSLv2记录,但会被转换为TLS记录,但是,嘿,我们不能为低头脑的扩展性选择负责.

do_dissect_payload(s)

尝试将以下数据分解为TLS消息. 请注意,重载.guess_payload_class()不够,因为要使用的TLS会话将会丢失.

fields_desc
TLS字段

type

ByteEnumField

None

version

_TLSVersionField

None

len

_TLSLengthField

None

iv

_TLSIVField

None

msg

_TLSMsgListField

[]

mac

_TLSMACField

None

pad

_TLSPadField

None

padlen

_TLSPadLenField

None

post_build(pkt, pay)

根据写入密码类型应用先前的方法.

post_dissect(s)

如果已触发挂起的读/写状态(例如,通过基础TLSChangeCipherSpec或SSLv2ClientMasterKey),则将其提交. 如果未设置prcs,我们什么也不更新,因为这可能意味着我们正在上下文外工作(并且我们需要保留默认的rcs).

pre_dissect(s)

解密,验证和解压缩消息,即根据读取密码类型应用先前的方法. 如果解密成功,则" len"将是TLSPlaintext.fragment的长度. 否则,它应该是_TLSEncryptedContent的长度.

class scapy.layers.tls.record.TLSAlert(_pkt='', post_transform=None, _internal=0, _underlayer=None, tls_session=None, **fields)

Bases: scapy.layers.tls.session._GenericTLSSessionInheritance

aliastypes
fields_desc
TLSAlert字段

level

ByteEnumField

None

descr

ByteEnumField

None

post_build_tls_session_update(msg_str)
post_dissection_tls_session_update(msg_str)
class scapy.layers.tls.record.TLSApplicationData(_pkt='', post_transform=None, _internal=0, _underlayer=None, tls_session=None, **fields)

Bases: scapy.layers.tls.session._GenericTLSSessionInheritance

aliastypes
fields_desc
TLSApplicationData字段

data

StrField

b''

post_build_tls_session_update(msg_str)
post_dissection_tls_session_update(msg_str)
class scapy.layers.tls.record.TLSChangeCipherSpec(_pkt='', post_transform=None, _internal=0, _underlayer=None, tls_session=None, **fields)

Bases: scapy.layers.tls.session._GenericTLSSessionInheritance

Note that, as they are not handshake messages, the ccs messages do not get appended to the list of messages whose integrity gets verified through the Finished messages.

aliastypes
fields_desc
TLSChangeCipherSpec字段

msgtype

ByteEnumField

1

post_build_tls_session_update(msg_str)
post_dissection_tls_session_update(msg_str)