Saltar al contenido principal
es/blog/obscura/research/tls-fingerprinting/

obscura/research/tls-fingerprinting

2 min de lectura

Resumen

El fingerprinting TLS identifica clientes mediante los parámetros que envían durante el handshake TLS (mensaje ClientHello). Diferentes navegadores y sistemas operativos usan diferentes configuraciones TLS.

Fingerprint JA3

JA3 es un hash computado a partir del ClientHello TLS:

JA3 = MD5(Ciphers + Extensions + EllipticCurves + EllipticCurvePointFormats)

Donde cada campo se concatena:

ciphers: 49199,49196,52393,...  (lista de IDs de suites de cifrado)
extensions: 0,23,65281,...       (lista de IDs de tipos de extensión)
curves: 29,23,24,...             (lista de grupos soportados)
formats: 0                       (formatos de punto EC)

Ejemplos de Hashes JA3

Navegador JA3
Chrome 120 (Windows 11) 6734f37431670b3ab4292b8f60f29984
Firefox 121 (Windows 11) d1b8d7e1c7c8b0a6b1a2c3d4e5f6a7b8
Safari 17 (macOS 14) 9a8b7c6d5e4f3a2b1c0d9e8f7a6b5c4d
Chrome 120 (Android 14) b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6

Fingerprint JA4 (Siguiente Generación)

JA4 extiende JA3 analizando también:

  • Versión TLS
  • Presencia de SNI
  • Protocolos ALPN
  • Configuraciones HTTP/2

Formato: tls_version.ciphers.extensions.sni.alpn

Fingerprinting HTTP/2

Las conexiones HTTP/2 revelan fingerprints adicionales mediante:

  • Parámetros de la trama SETTINGS (MAX_CONCURRENT_STREAMS, INITIAL_WINDOW_SIZE, etc.)
  • Tiempo de WINDOW_UPDATE
  • Comportamiento de PING
  • Estructura de trama Priority

Falsificación del Fingerprint TLS

Herramientas como TLSMask y utls pueden modificar el ClientHello para imitar otro navegador:

ClientHello real  [Falsificador TLS]  ClientHello imitado  Servidor

Enfoque

  1. Capturar un ClientHello real del navegador/SO objetivo
  2. Almacenar como plantilla
  3. Modificar el ClientHello saliente para que coincida con los parámetros de la plantilla
  4. Reenviar al destino

Implicaciones para Obscura:

  • La falsificación TLS puede hacerse a nivel de proxy, a diferencia de Canvas/WebGL/audio
  • Go tiene la librería utls (fork de crypto/tls con personalización de ClientHello)
  • Rust tiene tls-parser + implementación TLS personalizada
  • El proxy debe terminar TLS de todos modos para MITM, así que el fingerprint TLS visto por el servidor será la implementación TLS Go/Rust del proxy a menos que se falsifique conscientemente

Conclusiones

  • El fingerprinting TLS (JA3/JA4) es abordable a nivel de proxy
  • La librería utls de Go proporciona manipulación directa de ClientHello
  • Debe ser una funcionalidad principal de Obscura
  • Sin falsificación TLS, la propia librería TLS del proxy filtraría que hay un proxy en uso