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:
| Camp | Descripció | Camí JSON |
|---|---|---|
| Cadena JA3 | Entrada en brut de l’empremta | .TLSData.JA3String |
| Empremta JA3 | Hash MD5 | .TLSData.JA3Fingerprint |
| Cadena JA3S | Entrada en brut de l’empremta del servidor | .TLSData.JA3SString |
| Empremta JA3S | Hash MD5 | .TLSData.JA3SFingerprint |
| Empremta JA4 | Format 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_ja4per 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
| Camp | Descripció | Camí JSON |
|---|---|---|
| Tipus de negociació | ClientHello, ServerHello, Certificate | .TLSData.HandshakeType |
| Versió TLS | Versió negociada (p. ex., “TLS 1.3”) | .TLSData.Version |
| SNI | Server Name Indication | .TLSData.SNI |
| Conjunts de xifratge | Conjunts de xifratge oferts (ClientHello) | .TLSData.CipherSuites |
| Xifrat seleccionat | Conjunt de xifratge escollit (ServerHello) | .TLSData.SelectedCipher |
| Protocols ALPN | Protocols d’aplicació (p. ex., h2, http/1.1) | .TLSData.ALPNProtocols |
| Temps de negociació | Latència de ClientHello a ServerHello (ms) | .TLSData.HandshakeTimeMs |
| Puntuació de risc | Avaluació 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'