In breve. JA3 è un’impronta del “saluto” TLS (il ClientHello) che identifica lo strumento che apre la connessione cifrata — la sua libreria, non l’utente. Stesso attrezzo, stessa impronta: così riconosci che centinaia di IP diversi che bussano alla tua WAN sono in realtà un solo scanner o una sola botnet che ruota gli indirizzi per non farsi bloccare.

Cos’è JA3?

È un’impronta digitale (un hash) calcolata sul ClientHello, cioè il primo messaggio che un client manda quando apre una connessione TLS (https, o un tunnel cifrato). Il metodo nasce in Salesforce nel 2017: si prendono alcuni campi del ClientHello, si mettono in fila in un ordine preciso, si concatenano e se ne fa un MD5. Il risultato è una stringa di 32 caratteri esadecimali, sempre uguale per lo stesso software.

JA3 = MD5( SSLVersion,Ciphers,Extensions,EllipticCurves,ECPointFormats )
esempio -> a0e9f5d64349fb13191bc781f81f42e1

Perché un’impronta del ClientHello funziona?

Perché quei campi non li sceglie l’utente: li decide la libreria TLS del programma. Nel ClientHello il client dichiara, in chiaro, come sa parlare TLS: la versione, la lista dei cipher suite che offre, le estensioni, le curve ellittiche supportate e i formati dei loro punti. Quali elementi, e soprattutto in che ordine, dipende da chi ha scritto il client: un browser Chrome, curl, la libreria TLS di un malware, uno scanner come zgrab hanno ciascuno la propria sequenza. Cambia lo strumento, cambia l’impronta; resta lo stesso strumento, resta la stessa impronta.

Come smaschera lo stesso “attrezzo” dietro tanti IP (botnet, scanner)?

Questo è il punto che rende JA3 prezioso in difesa. L’impronta dipende dal software, non dall’indirizzo IP: un attaccante può ruotare centinaia di IP, cambiare paese, passare da un proxy all’altro, ma se usa sempre lo stesso attrezzo la JA3 non cambia. Così, quando analizzi il traffico in arrivo, puoi smettere di contare “quanti IP mi stanno tastando” e iniziare a contare quanti strumenti distinti.

  • Una JA3 che si ripete molte volte da poche sorgenti → un singolo tool che martella un servizio.
  • La stessa JA3 condivisa da centinaia di IP in paesi diversi → non sono centinaia di attori indipendenti, ma un’unica famiglia di scanner o una botnet che distribuisce il lavoro su tanti nodi. La rotazione degli indirizzi, pensata per sfuggire alle liste di blocco, viene smascherata dall’impronta comune.

È lo stesso ragionamento che alimenta la mappa Il Dojo sotto assedio: la porta ti dice cosa cercano, l’operatore di rete (AS) da quale rete arrivano, e la JA3 con quale attrezzo — e se è sempre lo stesso dietro IP che cambiano.

Una JA3 vuol dire “cattivo”?

No: dice soltanto “stesso stack”. Tutti i Chrome della stessa versione su Windows hanno la medesima JA3, quindi un’impronta da sola non è una prova di ostilità. Il valore sta nel contesto: una JA3 che sulla tua WAN prova la porta WinBox 143 volte in un’ora è sospetta; la stessa impronta usata da un browser che apre il tuo sito, no. L’impronta raggruppa; sei tu, con cosa chiede e quante volte, a dare il giudizio.

Come la vedo sul mio traffico?

Con uno sniffer: RouterOS non calcola la JA3 da solo, ma puoi specchiare il traffico in arrivo (port mirror o pacchetti TZSP dal /tool sniffer) verso una macchina con Wireshark, tshark o un IDS come Suricata/Zeek, che quel campo lo espongono già pronto.

Quei pacchetti TZSP puoi anche riceverli e decodificarli da codice con dojo.tzsp, la libreria del Dojo che legge lo sniffer remoto di RouterOS (Python e PHP) e ti consegna il frame, pronto da passare a tshark o Suricata.

# Estrai l'impronta JA3 e il nome richiesto (SNI) da una cattura
tshark -r cattura.pcap -Y "tls.handshake.type==1" -T fields \
  -e ip.src -e tls.handshake.ja3 -e tls.handshake.extensions_server_name

⚠️ Attenzione: la JA3 si legge solo sul ClientHello di una sessione TLS. Il traffico in chiaro (HTTP senza cifratura) non ne ha: lì a identificare lo strumento è semmai lo User-Agent. E ricorda che l’impronta è un indizio di raggruppamento, non un IP: non pubblicare mai gli IP di terzi quando racconti un’analisi, lavora sulle impronte e sugli aggregati.

Attenzione alla differenza JA3/JA4 negli strumenti: tshark e Wireshark hanno il campo JA3 nativo, ma non la JA4 — per quella serve il plugin JA4+ di FoxIO. Suricata invece, dalla versione 7.0.3 in poi (se compilata con il supporto JA4, la voce HAVE_JA4 nel --build-info), scrive sia la JA3 sia la JA4 nei suoi log eve.json; lo stesso vale per Zeek con il pacchetto JA4+.

JA3S e JA4: le varianti

JA3S è la stessa idea applicata al ServerHello: impronta la risposta del server, utile per riconoscere il software lato server (compresi certi pannelli di comando-e-controllo). JA4 (2023) è l’evoluzione pensata per il TLS moderno: gestisce meglio i valori casuali GREASE e il TLS 1.3, è più stabile e leggibile. JA3 resta il più diffuso e supportato dagli strumenti, ma se parti oggi da zero vale la pena guardare anche JA4.

⚠️ Attenzione: la JA3 non è infallibile. I valori GREASE (byte casuali che i client moderni inseriscono nel ClientHello) possono introdurre rumore, il TLS 1.3 con ClientHello cifrato (ECH) riduce ciò che si vede, e client diversi possono condividere la stessa impronta. Usala per raggruppare e indagare, mai come unico criterio per bloccare.

C’è un database pubblico delle impronte?

Prima una precisazione utile: lo sniffer (Wireshark, Suricata) ti dà l’impronta, non il nome dello strumento. Suricata, per esempio, scrive l’hash JA3/JA4 nei log ma non lo etichetta: il nome lo aggiunge un database (o una regola che riconosce quell’impronta). Il passo “impronta → nome” lo fai tu con una ricerca.

Questi database esistono, con un limite da tenere a mente: catalogano solo impronte già note (malware schedati o applicazioni censite), non sono una rubrica universale “impronta → programma”, e una stessa JA3 può appartenere anche a software legittimo. Servono ad arricchire un’analisi, non come verdetto automatico.

  • abuse.ch SSLBL — una lista di JA3 legate a malware e botnet reali, con la famiglia associata. È storica (il feed JA3 è fermo al 2021, da quando le impronte JA3 hanno iniziato a perdere stabilità), ma resta un ottimo riferimento per i classici. La scarichi e la cerchi così:
    curl -s https://sslbl.abuse.ch/blacklist/ja3_fingerprints.csv | grep -i <impronta>
  • ja4db.com (FoxIO) — il database JA4, moderno e aggiornato ogni giorno: cerchi un’impronta e ti dà l’applicazione/libreria/dispositivo associati e la logica di rilevamento consigliata. È anche scaricabile (https://ja4db.com/api/download/) per incrociarlo in locale: è la controparte viva del vecchio feed JA3 di SSLBL.
  • ja3er.com — il vecchio servizio di “ricerca inversa” (impronta → user-agent visti): oggi è defunto, non farci affidamento.

Qualche JA3 “famosa” presa davvero dal database SSLBL, per dare l’idea di cosa voglia dire riconoscerla sul proprio traffico — se ti arriva questa impronta, dietro c’è:

b386946a5a44d1ddcc843bc75336dfce  ->  Dridex    (trojan bancario)
1aa7bf8b97e540ca5edd75f7b8384bfa  ->  TrickBot  (trojan bancario / botnet)
35c0a31c481927f022a3b530255ac080  ->  Tofsee    (botnet da spam)
c201b92f8b483fa388be174d6689f534  ->  Gozi      (trojan bancario)
3cda52da4ade09f1f781ad2e82dcfa20  ->  QakBot    (trojan bancario / loader)
fc54e0d16d9764783542f0146a98b300  ->  AsyncRAT  (accesso remoto)

E qualche JA4 reale dal database FoxIO: qui l’impronta è anche leggibile (t13d… vuol dire TLS 1.3 su TCP), e trovi affiancati software legittimo e strumenti offensivi — se ti arriva questa:

t13d1517h2_8daaf6152771_cb7bf5808d99    ->  Chrome         (browser legittimo)
t13d190900_9dc949149365_97f8aa674fd9    ->  Sliver         (framework C2 offensivo)
t13d201100_2b729b4bf6f3_9e7b989ebec8    ->  IcedID         (loader / malware)
t13d191000_9dc949149365_e7c285222651    ->  Evilginx       (proxy di phishing)
ge11cn060000_4e59edc1297a_4da5efaf0cbd  ->  Cobalt Strike  (variante JA4H, lato HTTP)

⚠️ Attenzione: trovare una di queste tra le impronte che bussano alla tua WAN non è una condanna automatica — le JA3 datate possono combaciare anche con altro — ma è un segnale forte: la stessa impronta, ripetuta e abbinata a porte e tentativi sospetti, dice che è proprio quel tipo di attrezzo a lavorarti.

Domande frequenti

Le impronte JA3/JA4 cambiano se l’attaccante cambia IP o paese?

No. Dipendono dal software, non dall’indirizzo: è proprio questo che ti fa vedere la stessa botnet dietro IP e nazioni diverse.

Meglio JA3 o JA4?

JA4 è più robusto (gestisce i valori GREASE e il TLS 1.3, ed è leggibile) ed è una famiglia (JA4S lato server, JA4H per l’HTTP…). JA3 resta però il più diffuso e supportato dagli strumenti. Se parti oggi da zero guarda JA4; nella pratica spesso li tieni entrambi.

Posso bloccare un attacco solo in base all’impronta?

Meglio di no da sola: molti client legittimi condividono la stessa JA3/JA4. Usala per raggruppare le sorgenti e come indizio insieme a porta, frequenza e cosa viene richiesto.

RouterOS calcola JA3 o JA4?

Nativamente no, nessuna delle due. Le ottieni specchiando il traffico verso Wireshark/tshark (solo JA3) o verso Suricata/Zeek (JA3 e JA4). Ricorda: tshark ha solo il campo JA3; per la JA4 serve Suricata 7.0.3+ o il plugin FoxIO.

Che differenza c’è tra JA3/JA4 e lo User-Agent?

Lo User-Agent è una stringa che il client dichiara (e può falsificare a piacere) nelle richieste HTTP; JA3 e JA4 derivano da come il client parla TLS, molto più difficili da camuffare.