def test_encode(self): # Type: server_name, Length: 16 data = b"00000010" # Length: 14 data += b"000e" # Type: host_name, Length: 11, Name: example.org data += b"00000b6578616d706c652e6f7267" server_name = ServerNameField() server_name.payload = HostNameField("") server_name.payload.value = b"example.org" tmp_sni = ServerNameIndication() tmp_sni.server_name_list.append(server_name) tmp = Extension() + tmp_sni assert binascii.hexlify(tmp.encode()) == data
def test_encode(self): tmp = Extension() + ApplicationLayerProtocolNegotiation() a = VectorUInt8Field(None) a.value = b"spdy/3" tmp.payload.protocol_name_list.append(a) a = VectorUInt8Field(None) a.value = b"spdy/2" tmp.payload.protocol_name_list.append(a) a = VectorUInt8Field(None) a.value = b"http/1.1" tmp.payload.protocol_name_list.append(a) data = tmp.encode() data_should = self._get_data() assert binascii.hexlify(data) == data_should
def test_decode_empty(self): # Type: server_name, Length: 0 data = b"00000000" (obj, data) = Extension.decode(binascii.unhexlify(data)) assert isinstance(obj, Extension) assert isinstance(obj.payload, ServerNameIndication) assert len(obj.payload.server_name_list) == 0
def test_decode(self): data = self._get_data() (obj, data) = Extension.decode(binascii.unhexlify(data)) assert len(obj.payload.protocol_name_list) == 3 assert obj.payload.protocol_name_list[0].value == b"spdy/3" assert obj.payload.protocol_name_list[1].value == b"spdy/2" assert obj.payload.protocol_name_list[2].value == b"http/1.1"
def hook_alpn(record, protocols=None): tmp = ApplicationLayerProtocolNegotiation() for protocol in protocols: v = VectorUInt8Field(None) v.value = protocol tmp.protocol_name_list.append(v) record.payload.extensions.append(Extension() + tmp) return record
def _hook_tls_client_hello_ec_point_formats(self, record): ext_ec_point_formats = EcPointFormats() a = ext_ec_point_formats.get_field("point_format_list") for tmp_pf in flextls.registry.ec.point_formats: v = a.item_class("unnamed", tmp_pf.id) a.value.append(v) record.payload.extensions.append(Extension() + ext_ec_point_formats) return record
def hook_elliptic_curves(record, elliptic_curves=None): ext_elliptic_curves = EllipticCurves() a = ext_elliptic_curves.get_field("elliptic_curve_list") for i in elliptic_curves: v = a.item_class("unnamed", None) v.value = i a.value.append(v) record.payload.extensions.append(Extension() + ext_elliptic_curves) return record
def test_decode(self): data = self._get_data() (obj, data) = Extension.decode(binascii.unhexlify(data)) assert len(obj.payload.payload) == 6 assert obj.payload.payload[0].value == b"h2" assert obj.payload.payload[1].value == b"h2-15" assert obj.payload.payload[2].value == b"h2-14" assert obj.payload.payload[3].value == b"spdy/3.1" assert obj.payload.payload[4].value == b"spdy/3" assert obj.payload.payload[5].value == b"http/1.1"
def _hook_tls_client_hello_sni(self, record): server_name = ServerNameField() server_name.payload = HostNameField("") server_name.payload.value = self._scanner.handler.hostname.encode( "utf-8") tmp_sni = ServerNameIndication() tmp_sni.server_name_list.append(server_name) tmp_ext_sni = Extension() + tmp_sni record.payload.extensions.append(tmp_ext_sni) return record
def _hook_tls_client_hello_elliptic_curves(self, record): ext_elliptic_curves = EllipticCurves() a = ext_elliptic_curves.get_field("elliptic_curve_list") elliptic_curves = flextls.registry.ec.named_curves.get_ids() for i in elliptic_curves: v = a.item_class("unnamed", None) v.value = i a.value.append(v) record.payload.extensions.append(Extension() + ext_elliptic_curves) return record
def test_decode_name(self): # Type: server_name, Length: 16 data = b"00000010" # Length: 14 data += b"000e" # Type: host_name, Length: 11, Name: example.org data += b"00000b6578616d706c652e6f7267" (obj, data) = Extension.decode(binascii.unhexlify(data)) assert isinstance(obj, Extension) assert isinstance(obj.payload, ServerNameIndication) assert len(obj.payload.server_name_list) == 1 assert obj.payload.server_name_list[0].payload.value == b"example.org"
def _hook_tls_client_hello_signature_algorithms(self, record): ext_signature_algorithm = SignatureAlgorithms() a = ext_signature_algorithm.get_field("supported_signature_algorithms") hash_algorithms = flextls.registry.tls.hash_algorithms.get_ids() sign_algorithms = flextls.registry.tls.signature_algorithms.get_ids() for i in hash_algorithms: for j in sign_algorithms: v = a.item_class("unnamed") v.hash = i v.signature = j a.value.append(v) record.payload.extensions.append(Extension() + ext_signature_algorithm) return record
def test_encode(self): tmp = Extension() + NextProtocolNegotiation() a = VectorUInt8Field(None) a.value = b"h2" tmp.payload.payload.append(a) a = VectorUInt8Field(None) a.value = b"h2-15" tmp.payload.payload.append(a) a = VectorUInt8Field(None) a.value = b"h2-14" tmp.payload.payload.append(a) a = VectorUInt8Field(None) a.value = b"spdy/3.1" tmp.payload.payload.append(a) a = VectorUInt8Field(None) a.value = b"spdy/3" tmp.payload.payload.append(a) a = VectorUInt8Field(None) a.value = b"http/1.1" tmp.payload.payload.append(a) data = tmp.encode() data_should = self._get_data() assert binascii.hexlify(data) == data_should
def _hook_tls_client_hello_session_ticket(self, record): record.payload.extensions.append(Extension() + SessionTicketTLS()) return record
def _hook_tls_client_hello_heartbeat(self, record): hb_ext = HeartbeatExt() hb_ext.mode = 1 record.payload.extensions.append(Extension() + hb_ext) return record
def _send_heartbeat(self, protocol_version, cipher_suites): record_tls = self._build_tls_base_client_hello(protocol_version, cipher_suites) ext_hb = HeartbeatExtension() ext_hb.mode = 1 record_client_hello = record_tls.payload record_client_hello.extensions.append(Extension() + ext_hb) conn = self._scanner.handler.connect() conn.settimeout(2.0) conn.send(record_tls.encode()) time_start = datetime.now() server_hello_done = False heartbeat_supported = False data = b"" while server_hello_done is False: tmp_time = datetime.now() - time_start if tmp_time.total_seconds() > 5.0: return False try: tmp_data = conn.recv(4096) except: return None data += tmp_data while True: try: (record, data) = SSLv3Record.decode(data) except NotEnoughData: break if isinstance(record.payload, Handshake): if isinstance(record.payload.payload, ServerHello): server_hello = record.payload.payload for ext in server_hello.extensions: if isinstance(ext.payload, HeartbeatExtension): heartbeat_supported = True if isinstance(record.payload.payload, ServerHelloDone): server_hello_done = True elif isinstance(record.payload, Alert): if record.payload.level == 2: return None # ToDo: use connection state if protocol_version == flextls.registry.version.SSLv3: ver_minor = 0 elif protocol_version == flextls.registry.version.TLSv10: ver_minor = 1 elif protocol_version == flextls.registry.version.TLSv11: ver_minor = 2 elif protocol_version == flextls.registry.version.TLSv12: ver_minor = 3 record = SSLv3Record() record.version.major = 3 record.version.minor = ver_minor record.payload = binascii.unhexlify(b"014000") record.length = 3 record.content_type = 24 conn.send(record.encode()) time_start = datetime.now() record_with_heartbeat = None data = b"" while record_with_heartbeat is None: tmp_time = datetime.now() - time_start if tmp_time.total_seconds() > 5.0: return heartbeat_supported try: tmp_data = conn.recv(4096) except: return heartbeat_supported data += tmp_data while True: try: (record, data) = SSLv3Record.decode(data, payload_auto_decode=False) except NotEnoughData: break if record.content_type == record.get_payload_pattern( Heartbeat): record_with_heartbeat = record elif isinstance(record.payload, Alert): if record.payload.level == 2: return heartbeat_supported return record_with_heartbeat
def test_encode_empty(self): tmp = Extension() + NextProtocolNegotiation() data = tmp.encode() assert binascii.hexlify(data) == b"33740000"
def _build_dtls_base_client_hello(self, protocol_version, cipher_suites, elliptic_curves=None): ver_major, ver_minor = flextls.helper.get_tls_version(protocol_version) hash_algorithms = flextls.registry.tls.hash_algorithms.get_ids() sign_algorithms = flextls.registry.tls.signature_algorithms.get_ids() comp_methods = flextls.registry.tls.compression_methods.get_ids() hello = DTLSv10ClientHello() for i in cipher_suites: cipher = CipherSuiteField() cipher.value = i hello.cipher_suites.append(cipher) for comp_id in comp_methods: comp = CompressionMethodField() comp.value = comp_id hello.compression_methods.append(comp) server_name = ServerNameField() server_name.payload = HostNameField("") server_name.payload.value = self._scanner.handler.hostname.encode( "utf-8") tmp_sni = ServerNameIndication() tmp_sni.server_name_list.append(server_name) tmp_ext_sni = Extension() + tmp_sni hello.extensions.append(tmp_ext_sni) ext_elliptic_curves = EllipticCurves() a = ext_elliptic_curves.get_field("elliptic_curve_list") if elliptic_curves is None: elliptic_curves = flextls.registry.ec.named_curves.get_ids() for i in elliptic_curves: v = a.item_class("unnamed", None) v.value = i a.value.append(v) hello.extensions.append(Extension() + ext_elliptic_curves) ext_ec_point_formats = EcPointFormats() a = ext_ec_point_formats.get_field("point_format_list") for tmp_pf in flextls.registry.ec.point_formats: v = a.item_class("unnamed", tmp_pf.id) a.value.append(v) hello.extensions.append(Extension() + ext_ec_point_formats) ext_signature_algorithm = SignatureAlgorithms() a = ext_signature_algorithm.get_field("supported_signature_algorithms") for i in hash_algorithms: for j in sign_algorithms: v = a.item_class("unnamed") v.hash = i v.signature = j a.value.append(v) hello.extensions.append(Extension() + ext_signature_algorithm) hello.extensions.append(Extension() + SessionTicketTLS()) hb_ext = HeartbeatExt() hb_ext.mode = 1 hello.extensions.append(Extension() + hb_ext) hello.random = os.urandom(32) hello.version.major = ver_major hello.version.minor = ver_minor msg_handshake = DTLSv10Handshake() msg_handshake.set_payload(hello) return msg_handshake
def test_encode_empty(self): tmp = Extension() + SessionTicketTLS() data = tmp.encode() assert binascii.hexlify(data) == b"00230000"
def hook_next_protocol(record): record.payload.extensions.append(Extension() + NextProtocolNegotiation()) return record
def test_decode_empty(self): data = b"00230000" (obj, data) = Extension.decode(binascii.unhexlify(data)) print(obj.payload) assert len(obj.payload.data) == 0