Esempio n. 1
0
 def INIT_TLS_SESSION(self):
     self.cur_session = tlsSession(connection_end="client")
     self.cur_session.client_certs = self.mycert
     self.cur_session.client_key = self.mykey
     v = self.advertised_tls_version
     if v:
         self.cur_session.advertised_tls_version = v
     else:
         default_version = self.cur_session.advertised_tls_version
         self.advertised_tls_version = default_version
     raise self.CONNECT()
Esempio n. 2
0
 def INIT_TLS_SESSION(self):
     self.cur_session = tlsSession(connection_end="client")
     self.cur_session.client_certs = self.mycert
     self.cur_session.client_key = self.mykey
     v = self.advertised_tls_version
     if v:
         self.cur_session.advertised_tls_version = v
     else:
         default_version = self.cur_session.advertised_tls_version
         self.advertised_tls_version = default_version
     raise self.CONNECT()
Esempio n. 3
0
 def INIT_TLS_SESSION(self):
     """
     XXX We should offer the right key according to the client's suites. For
     now server_rsa_key is only used for RSAkx, but we should try to replace
     every server_key with both server_rsa_key and server_ecdsa_key.
     """
     self.cur_session = tlsSession(connection_end="server")
     self.cur_session.server_certs = [self.mycert]
     self.cur_session.server_key = self.mykey
     if isinstance(self.mykey, PrivKeyRSA):
         self.cur_session.server_rsa_key = self.mykey
     #elif isinstance(self.mykey, PrivKeyECDSA):
     #    self.cur_session.server_ecdsa_key = self.mykey
     raise self.WAITING_CLIENTFLIGHT1()
Esempio n. 4
0
 def INIT_TLS_SESSION(self):
     """
     XXX We should offer the right key according to the client's suites. For
     now server_rsa_key is only used for RSAkx, but we should try to replace
     every server_key with both server_rsa_key and server_ecdsa_key.
     """
     self.cur_session = tlsSession(connection_end="server")
     self.cur_session.server_certs = [self.mycert]
     self.cur_session.server_key = self.mykey
     if isinstance(self.mykey, PrivKeyRSA):
         self.cur_session.server_rsa_key = self.mykey
     #elif isinstance(self.mykey, PrivKeyECDSA):
     #    self.cur_session.server_ecdsa_key = self.mykey
     raise self.WAITING_CLIENTFLIGHT1()
Esempio n. 5
0
    def INIT_TLS_SESSION(self):
        self.cur_session = tlsSession(connection_end="client")
        s = self.cur_session
        s.client_certs = self.mycert
        s.client_key = self.mykey
        v = self.advertised_tls_version
        if v:
            s.advertised_tls_version = v
        else:
            default_version = s.advertised_tls_version
            self.advertised_tls_version = default_version

        if s.advertised_tls_version >= 0x0304:
            if self.tls13_psk_secret:
                s.tls13_psk_secret = binascii.unhexlify(self.tls13_psk_secret)
        raise self.CONNECT()
Esempio n. 6
0
 def INIT_TLS_SESSION(self):
     self.cur_session = tlsSession()
     self.cur_session.client_certs = self.mycert
     self.cur_session.client_key = self.mykey
     raise self.CONNECT()
Esempio n. 7
0
    def INIT_TLS_SESSION(self):
        self.cur_session = tlsSession(connection_end="client")
        s = self.cur_session
        s.client_certs = self.mycert
        s.client_key = self.mykey
        v = self.advertised_tls_version
        if v:
            s.advertised_tls_version = v
        else:
            default_version = s.advertised_tls_version
            self.advertised_tls_version = default_version

        if s.advertised_tls_version >= 0x0304:
            # For out of band PSK, the PSK is given as an argument
            # to the automaton
            if self.tls13_psk_secret:
                s.tls13_psk_secret = binascii.unhexlify(self.tls13_psk_secret)

            # For resumed PSK, the PSK is computed from
            if self.session_ticket_file_in:
                with open(self.session_ticket_file_in, 'rb') as f:

                    resumed_ciphersuite_len = struct.unpack("B", f.read(1))[0]
                    s.tls13_ticket_ciphersuite = \
                        struct.unpack("!H", f.read(resumed_ciphersuite_len))[0]

                    ticket_nonce_len = struct.unpack("B", f.read(1))[0]
                    # XXX add client_session_nonce member in tlsSession
                    s.client_session_nonce = f.read(ticket_nonce_len)

                    client_ticket_age_len = struct.unpack("!H", f.read(2))[0]
                    tmp = f.read(client_ticket_age_len)
                    s.client_ticket_age = struct.unpack("!I", tmp)[0]

                    client_ticket_age_add_len = struct.unpack("!H",
                                                              f.read(2))[0]
                    tmp = f.read(client_ticket_age_add_len)
                    s.client_session_ticket_age_add = struct.unpack("!I",
                                                                    tmp)[0]

                    ticket_len = struct.unpack("!H", f.read(2))[0]
                    s.client_session_ticket = f.read(ticket_len)

                if self.resumption_master_secret:

                    if s.tls13_ticket_ciphersuite not in _tls_cipher_suites_cls:  # noqa: E501
                        warning("Unknown cipher suite %d" %
                                s.tls13_ticket_ciphersuite)  # noqa: E501
                        # we do not try to set a default nor stop the execution
                    else:
                        cs_cls = _tls_cipher_suites_cls[
                            s.tls13_ticket_ciphersuite]  # noqa: E501

                    hkdf = TLS13_HKDF(cs_cls.hash_alg.name.lower())
                    hash_len = hkdf.hash.digest_size

                    s.tls13_psk_secret = hkdf.expand_label(
                        binascii.unhexlify(
                            self.resumption_master_secret),  # noqa: E501
                        b"resumption",
                        s.client_session_nonce,  # noqa: E501
                        hash_len)
        raise self.CONNECT()
Esempio n. 8
0
    def decryptTLSStream(self):
        """
        Generator function that decrypts an RDP stream that uses TLS.
        """

        tpktParser = TPKTParser()
        tls = None
        clientRandom = None
        serverRandom = None
        currentTimeStamp = None
        reconstructingRecord = False
        savedRecord = None
        savedPayload = b""
        tlsKeyGenerated = False

        for packet in self.packets:
            ip = packet.getlayer(IP)
            tcp = packet.getlayer(TCP)

            if len(tcp.payload) == 0 or tcp.flags & TCPFlags.PSH == 0:
                continue

            currentTimeStamp = packet.time
            currentSrc = ip.src
            currentDst = ip.dst

            # The first couple messages don't use TLS. Check if it's one of those messages and output it as is.
            if hasattr(tcp, "load") and tpktParser.isTPKTPDU(tcp.load):
                yield PCAPStream.output(tcp.load, currentTimeStamp, ip.src,
                                        ip.dst)
                continue

            # Create the TLS session context.
            if not tls:
                tls = tlsSession(
                    ipsrc=ip.src,
                    ipdst=ip.dst,
                    sport=tcp.sport,
                    dport=tcp.dport,
                    connection_end="server",
                )

            if tls.ipsrc != ip.src:
                tls = tls.mirror()

            # Pass every TLS message through our own custom session so the state is kept properly
            record = packet[TLS]
            record = TLS(bytes(record), tls_session=tls)

            for msg in record.msg:
                if isinstance(msg, TLSClientHello):
                    clientRandom = pkcs_i2osp(msg.gmt_unix_time,
                                              4) + msg.random_bytes
                elif isinstance(msg, TLSServerHello):
                    serverRandom = pkcs_i2osp(msg.gmt_unix_time,
                                              4) + msg.random_bytes
                elif isinstance(msg, TLSNewSessionTicket):
                    # Session established, set master secret.
                    tls.rcs.derive_keys(
                        client_random=clientRandom,
                        server_random=serverRandom,
                        master_secret=self.masterSecret,
                    )

                    tls.wcs.derive_keys(
                        client_random=clientRandom,
                        server_random=serverRandom,
                        master_secret=self.masterSecret,
                    )

                    tlsKeyGenerated = True
                elif isinstance(msg, TLSApplicationData):
                    yield PCAPStream.output(msg.data, currentTimeStamp, ip.src,
                                            ip.dst)
Esempio n. 9
0
 def INIT_TLS_SESSION(self):
     self.cur_session = tlsSession()
     self.cur_session.client_certs = self.mycert
     self.cur_session.client_key = self.mykey
     raise self.CONNECT()