scapy.layers.tls.session

TLS会话处理程序.

class scapy.layers.tls.session.connState(connection_end='server', read_or_write='read', seq_num=0, compression_alg=<class 'scapy.layers.tls.crypto.compression.Comp_NULL'>, ciphersuite=None, tls_version=771)

Bases: object

从RFC 5246的6.1节开始:TLS连接状态是TLS记录协议的操作环境. 它指定了压缩算法,加密算法和MAC算法. 此外,这些算法的参数是已知的:在读取和写入方向上用于连接的MAC密钥和批量加密密钥. 从逻辑上讲,总是有四个未完成的连接状态:当前的读取和写入状态以及挂起的读取和写入状态. 所有记录均在当前读写状态下处理. 挂起状态的安全性参数可以通过TLS握手协议设置,并且ChangeCipherSpec可以有选择地将任一挂起状态设置为当前状态,在这种情况下,适当的当前状态将被处置并替换为挂起状态; 然后将待处理状态重新初始化为空状态. 将尚未使用安全性参数初始化的状态设为当前状态是非法的. 初始当前状态始终指定不使用加密,压缩或MAC.

(出于实际原因,Scapy通过使用TLS_NULL_WITH_NULL_NULL实现伪密码和MAC来刮掉最后两行.)

这些属性和行为大多在此类中映射. 另外,请注意,Scapy可能会使当前状态超出已用虚拟安全性参数初始化的未决状态. 我们需要这样做,以便知道TLS消息的内容何时被加密,是否拥有正确的密钥来解密/验证它. 例如,当Scapy解析CKE时不知道任何秘密,然后解析CCS时,它需要知道以下Finished已根据新的密码套件进行了加密和签名,即使它无法解密消息或验证其完整性也是如此.

debug_repr(name, secret)
derive_keys(client_random=b'', server_random=b'', master_secret=b'')
snapshot()

This is used mostly as a way to keep the cipher state and the seq_num.

sslv2_derive_keys(key_material)

实际上只有一个密钥,即CLIENT-READ-KEY或-WRITE-KEY.

请注意,skip_first与使用SSLv3派生的相反.

另外,如果需要,IV应该设置在其他位置.

tls13_derive_keys(key_material)
class scapy.layers.tls.session.readConnState(**kargs)

Bases: scapy.layers.tls.session.connState

class scapy.layers.tls.session.tlsSession(ipsrc=None, ipdst=None, sport=None, dport=None, sid=None, connection_end='server', wcs=None, rcs=None)

Bases: object

这是我们的TLS上下文,它从TLS连接的两端收集信息. 这些方面由readConnState实例和writeConnState实例表示. 除了总体网络属性外,tlsSession对象还保存协商的共享信息,例如密钥交换参数和主密钥(如果可用).

默认的connection_end为"服务器". 这与静态交换分析的预期行为相对应(首先解析ClientHello).

compute_master_secret()
compute_ms_and_derive_keys()
compute_sslv2_key_material()
compute_sslv2_km_and_derive_keys()
compute_tls13_early_secrets(external=False)

此函数计算Early Secret,binder_key,client_early_traffic_secret和early_exporter_master_secret(请参阅RFC8446,第7.1节).

参数external用于计算binder_key:

  • 对于在TLS之外配置的外部PSK,参数external必须为True.

  • 要恢复PSK,参数external必须为False.

如果未指定任何参数,则默认情况下将使用标签" resinder".

密码密钥和IV会针对0-RTT数据进行相应更新. self.handshake_messages应该仅是ClientHello.

compute_tls13_handshake_secrets()

密码和IV会相应更新,以用于握手数据. self.handshake_messages应该是ClientHello…ServerHello.

compute_tls13_next_traffic_secrets(connection_end, read_or_write)

密码密钥和IV会相应更新.

compute_tls13_resumption_secret()

self.handshake_messages应该是ClientHello…ClientFinished.

compute_tls13_traffic_secrets()

密码密钥和IV会相应地针对应用程序数据进行更新. self.handshake_messages应该是ClientHello…ServerFinished.

compute_tls13_traffic_secrets_end()
compute_tls13_verify_data(connection_end, read_or_write)
consider_read_padding()
consider_write_padding()
eq(other)
hash()
mirror()

该函数接受一个tlsSession对象,并交换IP地址,端口,连接端和连接状态. 还交换了Triggerd_commit(尽管这可能是过大的,但这种方式更干净).

对于静态分析来自客户端和服务器的一系列消息很有用. 在这种情况下,每当正在读取的消息来自与之前读取的消息不同的一侧时,都应使用该消息,因为读取状态变为写入状态,反之亦然. 例如,您可以执行以下操作:

client_hello = open('client_hello.raw').read()<阅读其他消息>

m1 = TLS(client_hello)m2 = TLS(server_hello,tls_session = m1.tls_session.mirror())m3 = TLS(server_cert,tls_session = m2.tls_session)m4 = TLS(client_keyexchange,tls_session = m3.tls_session.mirror()

use_explicit_iv(version, cipher_type)
class scapy.layers.tls.session.writeConnState(**kargs)

Bases: scapy.layers.tls.session.connState