es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Preparando un archivo secreto utilizando las APIs de OpenSSL para descifrar el tráfico TLS 1.3 en Wireshark.

Me gustaría crear un archivo secreto tanto desde mi programa cliente como desde mi programa servidor de TLS (estos son solo programas de prueba por el momento: client.exe y server.exe, en los cuales estoy experimentando con SSL/TLS), que luego se pueda utilizar para descifrar el tráfico en Wireshark.

Para TLS 1.2, creé un archivo CLIENT_RANDOM con el siguiente formato (probando solo una conexión, por lo que hay una sola línea en el archivo):

CLIENT_RANDOM <32 bytes de random del cliente en formato hexadecimal> <48 bytes de clave maestra en formato hexadecimal>

Fragmento de código para leer el random y la clave maestra:

lang-cpp
uint8_t random[SSL3_RANDOM_SIZE];
size_t randomLength = SSL_get_client_random(ssl, random, SSL3_RANDOM_SIZE);

uint8_t masterKey[SSL_MAX_MASTER_KEY_LENGTH];
size_t masterKeyLength = SSL_SESSION_get_master_key(SSL_get_session(ssl), masterKey, sizeof(masterKey));

Importando este archivo secreto (cliente o servidor) en Wireshark como un archivo de registro de Pre-Master-Secret, pude descifrar el tráfico de TLS 1.2, pero según tengo entendido, el CLIENT_RANDOM no se puede utilizar para TLS 1.3 (al menos a mí no me funciona), en su lugar debería usar CLIENT_HANDSHAKE_TRAFFIC_SECRET o SERVER_HANDSHAKE_TRAFFIC_SECRET.

¿Cuál es el formato de ese secreto y cómo podría obtener esos datos utilizando las APIs de OpenSSL para poder descifrar el tráfico de TLS 1.3 en Wireshark?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para crear un archivo secreto para TLS 1.3 que se pueda utilizar para descifrar el tráfico en Wireshark, es necesario seguir un formato diferente al utilizado para TLS 1.2. Para TLS 1.3, debes crear un archivo con el siguiente formato:

    CLIENT_RANDOM
    <32 bytes de cliente aleatorio en formato hexadecimal>
    <48 bytes de secreto de tráfico de apretón de manos del cliente en formato hexadecimal>
    <48 bytes de secreto de tráfico de apretón de manos del servidor en formato hexadecimal>
    

    Para obtener los secretos de tráfico de apretón de manos del cliente y del servidor utilizando las API de OpenSSL, puedes utilizar el siguiente fragmento de código:

    uint8_t random[SSL3_RANDOM_SIZE];
    size_t randomLength = SSL_get_client_random(ssl, random, SSL3_RANDOM_SIZE);
    
    uint8_t client_handshake_traffic_secret[SSL_MAX_MASTER_KEY_LENGTH];
    uint8_t server_handshake_traffic_secret[SSL_MAX_MASTER_KEY_LENGTH];
    
    SSL_export_keying_material(
        ssl,
        client_handshake_traffic_secret,
        sizeof(client_handshake_traffic_secret),
        "c hs traffic",
        strlen("c hs traffic"),
        NULL,
        0,
        0
    );
    
    SSL_export_keying_material(
        ssl,
        server_handshake_traffic_secret,
        sizeof(server_handshake_traffic_secret),
        "s hs traffic",
        strlen("s hs traffic"),
        NULL,
        0,
        0
    );
    

    Este fragmento de código exporta los secretos de tráfico de apretón de manos del cliente y del servidor utilizando la función SSL_export_keying_material, pasando las etiquetas adecuadas para los secretos del cliente y del servidor. Estos secretos luego pueden utilizarse para crear el archivo secreto en el formato especificado anteriormente, que se puede importar en Wireshark como un archivo de registro de secreto previo al maestro para descifrar el tráfico de TLS 1.3.

Comments are closed.