Debido a las múltiples vulnerabilidades que se han identificado en las implementaciones de SSL y TLS en los últimos años (BEAST, CRIME, BREACH, HEARTBLEED, POODLE, FREAK, Logjam), una de las principales recomendaciones (adicional a la de actualizar los componentes asociados a estos protocolos) es la de emplear algoritmos de encriptación con longitudes de claves robustas. Para configurarlo, se hace uso de un “conjunto de cifrado” (“cipher suite”), que por lo general involucra cadenas como estas:
SSL_RSA_WITH_RC4_128_SHA
TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA
TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
TLS_RSA_WITH_RC4_128_MD5
TLS_RSA_WITH_3DES_EDE_CBC_SHA
SSL_RSA_EXPORT_WITH_RC2_CBC_40_MD5
TLS_RSA_WITH_3DES_EDE_CBC_SHA
Pero, ¿qué significan exactamente estas líneas? A continuación analizaremos el significado de cada parte.
Descomponiendo el conjunto de cifrado (cipher suite)
Antes de empezar, es necesario recordar que SSL y TLS son protocolos criptográficos ubicados en la capa 5 del modelo OSI (capa de sesión) o, lo que es lo mismo, la capa de transporte en el modelo TCP IP. Estos protocolos ofrecen servicios de autenticación, encriptación, intercambio de claves de cifrado e integridad. Para gestionar cada una de estas características, se puede parametrizar un algoritmo específico en función de las necesidades tanto a nivel de cliente como a nivel de servidor.
Para establecer una comunicación bidireccional, el primer paso es que ambas partes (cliente y servidor) puedan negociar con cuáles algoritmos se va a trabajar y para ello, en el inicio de la comunicación, se presentan una serie de opciones por parte y parte:
En una captura de tráfico usando Wireshark se puede observar con detalle lo que sucede en la comunicación:
En este punto, dependiendo de la configuración, el cliente presenta su conjunto de cifrado a un servidor, que a su vez lo compara con su propio listado y negocian los algoritmos que se usarán para el resto de la transmisión.
La identificación del protocolo, los algoritmos y las longitudes de clave se organizan de la siguiente manera:
Para entenderlo, se analizará cada apartado de este conjunto:
- Protocolo (Protocol): Define el tipo de protocolo a usar, SSL o TLS. Esta primera parte solamente puede tener uno de los siguientes valores (en rojo los que debido a su riesgo no son recomendados):
- SSL1
- SSL2
- SSL3
- TLS1.0
- TLS1.1
- TLS1.2
- TLS1.3 (borrador)
- DTLS1.0
- Intercambio de claves (Key Exchange): Este apartado establece el algoritmo que se empleará para compartir la clave simétrica con la cual se encriptará el tráfico en la sesión. Los valores aceptados son:
- DH (Diffie-Hellman)
- DHE (Diffie-Hellman Ephimeral – claves públicas temporales)
- ECDH (Elliptic curve Diffie–Hellman)
- ECDHE
- RSA (Rivest, Shamir y Adleman)
- PKCS (Public-Key Cryptography Standards)
- DSA (Digital Signature Algorithm)
- CK
- Firma digital (Digital Signature): Este apartado define los algoritmos que se emplearán para garantizar que los datos intercambiados entre cliente y servidor no han sido alterados. Algunas veces RSA puede ser usado para realizar intercambio de claves y firma digital:
- RSA
- ECDSA (Elliptic Curve Digital Signature Algorithm)
- DSS (Digital Signature Standard)
- Algoritmo de encriptación simétrico y longitud de clave (Encryption (Cipher) and key length): El siguiente parámetro es el algoritmo simétrico y la longitud de la clave asociada, empleados para la encriptación de los datos transmitidos. Las opciones son las siguientes:
- AES (Advanced Encryption Standard – 128, 192, 256)
- RC2
- RC4
- RC5
- DES (Data Encryption Standard)
- 3DES
- ARIA
- SEED
- CAMELIA
- IDEA (International Data Encryption Algorithm)
- FORTEZZA
- BLOWFISH
- CAST
- <NULL>
- Modo de encriptación (Encryption Mode) – Opcional: Este parámetro es opcional y depende del tipo de algoritmo de encriptación escogido anteriormente:
- CBC
- GCM
- ECB
- PCBC
- CFB
- OFB
- CTR
- Algoritmo de hash (Hashing Algorithm): En este apartado se escoge el algoritmo para la validación de integridad del mensaje, con el fin de identificar potenciales manipulaciones no autorizadas del contenido:
- SHA (Secure Hash Algorithm)
- SHA256
- SHA384
- AEAD
- HMAC
- MD2
- MD4
- MD5 (Message-Digest Algorithm 5)
- MDC2
- RIPEMD-160
- Tamaño de curva elíptica (Elliptic curve size) – Opcional: Dependiendo del algoritmo de intercambio de claves escogido, en este parámetro se antepone la letra “P” seguida de la curva a ser empleada:
- P256
- P384
Para mayor información acerca de configuraciones recomendadas, revisar el documento NIST Special Publication 800-52 “Guidelines for the Selection, Configuration, and Use of Transport Layer Security (TLS) Implementations”.
EXTRA: ¿Cómo extraer el conjunto de cifrado de un servidor empleando nmap?
nmap es una de las mejores herramientas de escaneo de puertos y obtención de información de configuración de servicios de red. Adicional a sus funcionalidades básicas, cuenta con una serie de scripts (NSE) e inclusive permite la obtención del conjunto de cifrado de un servicio SSL/TLS remoto a través del siguiente comando:
nmap --script ssl-enum-ciphers -p 443 HOST
La salida es similar a la siguiente, en donde se pueden aplicar los conceptos descritos anteriormente:
Host is up (0.058s latency). PORT STATE SERVICE 443/tcp open https | ssl-enum-ciphers: | SSLv3: No supported ciphers found | TLSv1.0: | ciphers: | TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA - strong | TLS_DHE_RSA_WITH_AES_128_CBC_SHA - strong | TLS_DHE_RSA_WITH_AES_256_CBC_SHA - strong | TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA - strong | TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA - strong | TLS_DHE_RSA_WITH_SEED_CBC_SHA - strong | TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA - strong | TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA - strong | TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA - strong | TLS_ECDHE_RSA_WITH_RC4_128_SHA - strong | TLS_RSA_WITH_3DES_EDE_CBC_SHA - strong | TLS_RSA_WITH_AES_128_CBC_SHA - strong | TLS_RSA_WITH_AES_256_CBC_SHA - strong | TLS_RSA_WITH_CAMELLIA_128_CBC_SHA - strong | TLS_RSA_WITH_CAMELLIA_256_CBC_SHA - strong | TLS_RSA_WITH_RC4_128_SHA - strong | TLS_RSA_WITH_SEED_CBC_SHA - strong | compressors: | NULL | TLSv1.1: | ciphers: | TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA - strong | TLS_DHE_RSA_WITH_AES_128_CBC_SHA - strong | TLS_DHE_RSA_WITH_AES_256_CBC_SHA - strong | TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA - strong | TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA - strong | TLS_DHE_RSA_WITH_SEED_CBC_SHA - strong | TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA - strong | TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA - strong | TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA - strong | TLS_ECDHE_RSA_WITH_RC4_128_SHA - strong | TLS_RSA_WITH_3DES_EDE_CBC_SHA - strong | TLS_RSA_WITH_AES_128_CBC_SHA - strong | TLS_RSA_WITH_AES_256_CBC_SHA - strong | TLS_RSA_WITH_CAMELLIA_128_CBC_SHA - strong | TLS_RSA_WITH_CAMELLIA_256_CBC_SHA - strong | TLS_RSA_WITH_RC4_128_SHA - strong | TLS_RSA_WITH_SEED_CBC_SHA - strong | compressors: | NULL | TLSv1.2: | ciphers: | TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA - strong | TLS_DHE_RSA_WITH_AES_128_CBC_SHA - strong | TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 - strong | TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 - strong | TLS_DHE_RSA_WITH_AES_256_CBC_SHA - strong | TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 - strong | TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 - strong | TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA - strong | TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA - strong | TLS_DHE_RSA_WITH_SEED_CBC_SHA - strong | TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA - strong | TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA - strong | TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 - strong | TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 - strong | TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA - strong | TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 - strong | TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 - strong | TLS_ECDHE_RSA_WITH_RC4_128_SHA - strong | TLS_RSA_WITH_3DES_EDE_CBC_SHA - strong | TLS_RSA_WITH_AES_128_CBC_SHA - strong | TLS_RSA_WITH_AES_128_CBC_SHA256 - strong | TLS_RSA_WITH_AES_128_GCM_SHA256 - strong | TLS_RSA_WITH_AES_256_CBC_SHA - strong | TLS_RSA_WITH_AES_256_CBC_SHA256 - strong | TLS_RSA_WITH_AES_256_GCM_SHA384 - strong | TLS_RSA_WITH_CAMELLIA_128_CBC_SHA - strong | TLS_RSA_WITH_CAMELLIA_256_CBC_SHA - strong | TLS_RSA_WITH_RC4_128_SHA - strong | TLS_RSA_WITH_SEED_CBC_SHA - strong | compressors: | NULL |_ least strength: strong Nmap done: 1 IP address (1 host up) scanned in 18.79 seconds
Leave a Reply