Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Inspecció de TLS

L’analitzador TLS inspecciona missatges de negociació sense desxifrar el trànsit. Extreu metadades de connexió dels missatges ClientHello i ServerHello, incloent-hi SNI, conjunts de xifratge i empremtes TLS.

Anàlisi de negociacions TLS

sequenceDiagram
    participant Client
    participant Server

    Client->>Server: ClientHello (SNI, cipher suites, extensions)
    Note right of Client: JA3 fingerprint computed
    Server-->>Client: ServerHello (selected cipher, extensions)
    Note right of Server: JA3S fingerprint computed
    Server-->>Client: Certificate (server certificate chain)
    Server-->>Client: ServerHelloDone
    Client->>Server: ClientKeyExchange
    Client->>Server: ChangeCipherSpec
    Client->>Server: Finished
    Server-->>Client: ChangeCipherSpec
    Server-->>Client: Finished
    Note over Client,Server: Encrypted application data

lippycat captura i analitza els missatges de negociació no xifrats a l’inici de cada connexió TLS.

Iniciar la captura TLS:

sudo lc sniff tls -i eth0

Filtrar per Server Name Indication (SNI):

Per a un domini concret:

sudo lc sniff tls -i eth0 --sni example.com

Per a un comodí:

sudo lc sniff tls -i eth0 --sni "*.example.com"

Per a filtratge massiu des d’un fitxer:

sudo lc sniff tls -i eth0 --sni-file domains.txt

Empremtes JA3 i JA3S

JA3 crea una empremta d’un client TLS calculant el hash dels camps següents del missatge ClientHello:

TLS Version | Cipher Suites | Extensions | Elliptic Curves | EC Point Formats

Aquests camps es concatenen i se’n calcula el hash MD5 per produir una empremta de 32 caràcters. Com que les diferents aplicacions construeixen el ClientHello de manera diferent (ordres diferents dels conjunts de xifratge, extensions diferents), l’empremta JA3 identifica el programari client independentment de l’adreça IP.

JA3S aplica el mateix concepte a ServerHello, generant l’empremta de la resposta del servidor (versió TLS, conjunt de xifratge seleccionat i extensions).

lippycat calcula totes dues automàticament:

CampDescripcióCamí JSON
Cadena JA3Entrada en brut de l’empremta.TLSData.JA3String
Empremta JA3Hash MD5.TLSData.JA3Fingerprint
Cadena JA3SEntrada en brut de l’empremta del servidor.TLSData.JA3SString
Empremta JA3SHash MD5.TLSData.JA3SFingerprint
Empremta JA4Format modern d’empremta.TLSData.JA4Fingerprint

Nota de compatibilitat JA4: les compilacions que inclouen la correcció de conformitat amb l’estàndard utilitzen SHA-256 (truncat a 12 caràcters hexadecimals) i la transformació del primer/últim caràcter ALPN requerida per JA4. Les empremtes produïdes per compilacions antigues de lippycat utilitzaven un valor MD5 truncat no estàndard i també poden codificar ALPN de manera diferent. Substituïu les empremtes JA4 emmagatzemades i els filtres tls_ja4 per valors generats per una implementació JA4 conforme. lippycat no compara silenciosament tots dos formats. No s’emet cap avís de compatibilitat en temps d’execució perquè els valors heretats i estàndard tenen la mateixa sintaxi i no es poden distingir de manera fiable.

Filtrar per una empremta coneguda:

Capturar trànsit que coincideixi amb una empremta JA3 coneguda de programari maliciós:

sudo lc sniff tls -i eth0 --ja3 "e7d705a3286e19ea42f587b344ee6865"

Carregar diverses empremtes d’un fitxer d’intel·ligència d’amenaces:

sudo lc sniff tls -i eth0 --ja3-file known-bad-ja3.txt

Crear un inventari d’empremtes:

Llistar empremtes JA3 úniques amb SNI:

sudo lc sniff tls -i eth0 2>/dev/null | \
  jq -r 'select(.TLSData.HandshakeType == "ClientHello") |
    [.SrcIP, .TLSData.SNI, .TLSData.JA3Fingerprint] | @tsv' | \
  sort -u

Camps de metadades TLS

CampDescripcióCamí JSON
Tipus de negociacióClientHello, ServerHello, Certificate.TLSData.HandshakeType
Versió TLSVersió negociada (p. ex., “TLS 1.3”).TLSData.Version
SNIServer Name Indication.TLSData.SNI
Conjunts de xifratgeConjunts de xifratge oferts (ClientHello).TLSData.CipherSuites
Xifrat seleccionatConjunt de xifratge escollit (ServerHello).TLSData.SelectedCipher
Protocols ALPNProtocols d’aplicació (p. ex., h2, http/1.1).TLSData.ALPNProtocols
Temps de negociacióLatència de ClientHello a ServerHello (ms).TLSData.HandshakeTimeMs
Puntuació de riscAvaluació del risc de seguretat (0,0–1,0).TLSData.RiskScore

Investigacions TLS habituals

Detectar versions TLS febles:

sudo lc sniff tls -i eth0 2>/dev/null | \
  jq -r 'select(.TLSData.Version == "TLS 1.0" or .TLSData.Version == "TLS 1.1") |
    [.Timestamp, .SrcIP, .DstIP, .TLSData.SNI, .TLSData.Version] | @tsv'

Correlacionar ClientHello amb ServerHello:

lippycat correlaciona parelles de negociació quan --track-connections està activat (per defecte). Les parelles correlacionades inclouen la latència de negociació:

sudo lc sniff tls -i eth0 2>/dev/null | \
  jq -r 'select(.TLSData.CorrelatedPeer) |
    [.Timestamp, .TLSData.SNI, (.TLSData.HandshakeTimeMs|tostring) + "ms"] |
    @tsv'

Connexions d’alt risc:

sudo lc sniff tls -i eth0 2>/dev/null | \
  jq -r 'select(.TLSData.RiskScore > 0.5) |
    [.Timestamp, .SrcIP, .TLSData.SNI, .TLSData.Version,
     "risk=" + (.TLSData.RiskScore|tostring)] | @tsv'