
Uno strumento di rilevamento MITM (monster-in-the-middle). Utilizzato per costruire MALCOLM:
L'obiettivo di questo progetto è consentire un rilevamento accurato dell'intercettazione HTTPS e un robusto fingerprinting TLS. Questo progetto si basa su The Security Impact of HTTPS Interception ed è nato come porting in Go dei loro script di elaborazione e impronte digitali.
Maggiori informazioni su MITMEngine sono disponibili in questo post sul blog di Cloudflare. Collegamenti rapidi:
wireshark -v per verificare)La documentazione dettagliata si trova nel codice (copiare il pacchetto in $(GOPATH)/src/github.com/cloudflare/mitmengine prima).
godoc -http=:6060
http://localhost:6060/pkg/github.com/cloudflare/mitmengine
In questo progetto, le impronte digitali corrispondono a istanze concrete di un oggetto, mentre le firme possono rappresentare più oggetti. Usiamo questa convenzione perché un'impronta digitale è solitamente una proprietà intrinseca di un oggetto, mentre una firma può essere scelta. Allo stesso modo, una richiesta client reale vista da un server avrebbe un'impronta digitale, mentre il software che genera la richiesta può scegliere la propria firma (ad esempio, scegliendo quali suite di cifratura supporta).
Un'impronta digitale di una richiesta client è derivata da una richiesta client a un server e contiene caratteristiche sia TLS che HTTP. Una firma di richiesta client rappresenta tutte le possibili impronte digitali che un software può generare. L'obiettivo è rendere ogni firma sufficientemente specifica da identificare univocamente un software.
Una firma User Agent rappresenta un insieme di User Agent generati da un browser. Una firma User Agent per un browser consente un intervallo di versioni del browser e permette di specificare il nome del sistema operativo, la piattaforma del sistema operativo, l'intervallo di versioni del sistema operativo e il tipo di dispositivo per creare firme più granulari.
Una firma browser contiene sia una firma User Agent sia una firma di richiesta client. Ciò consente a una firma di rappresentare tutte le possibili impronte digitali generate, ad esempio, da Chrome 31-38 su Windows 10.
Una firma MITM contiene una firma di richiesta client insieme a dettagli aggiuntivi sul software MITM, inclusi un grado di sicurezza che può essere influenzato da fattori esterni alla richiesta client, come se il software convalida o meno i certificati.
Consideriamo una connessione HTTPS intercettata quando c'è una discrepanza tra la firma di richiesta client attesa corrispondente al browser identificato dallo User Agent e l'impronta digitale effettiva della richiesta client.
Se una firma è imprecisa o obsoleta per un determinato software client, è possibile che la firma segnali erroneamente una connessione come intercettata.
Se un proxy imita fedelmente la richiesta del client, potremmo non rilevare una discrepanza. Se le firme del browser sono eccessivamente ampie, non riusciremo nemmeno a rilevare l'intercettazione.
Le impronte digitali di riferimento dei browser e del software MITM utilizzate in MALCOLM si trovano in reference_fingerprints/mitmengine/.
Questo set di impronte digitali è una combinazione di ciò che viene estratto dai pcaps TLS Client Hello in reference_fingerprints/pcaps/, nonché delle prime 500 coppie User Agent + TLS Client Hello
osservate sulla rete di Cloudflare e etichettate con un alto indice di affidabilità (ovvero traffico corrispondente ad attività umana e bot amichevoli).
Idealmente, non dovremmo fare affidamento sulle impronte digitali di riferimento campionate dalla rete di Cloudflare; invece, avremmo un set completo di pcaps per costruire il nostro set di riferimenti di TLS Client Hello. Ti interessa aiutarci a espandere il nostro set di dati? Vedi come puoi contribuire!
Innanzitutto, un utente deve creare una struct mitmengine.Config da passare a mitmengine.NewProcessor. Una struct mitmengine.Config
può specificare i nomi dei file contenenti le impronte digitali del browser, le impronte digitali MITM e le intestazioni
MITM. In alternativa, può anche specificare un file di configurazione per leggere i file menzionati in precedenza da qualsiasi altra
fonte; al momento, MITMEngine supporta la lettura di questi file da database compatibili con il client Amazon S3 (inclusi
Amazon S3 e Ceph). Ulteriori lettori di file per database (che chiamiamo "loader") possono essere definiti nel pacchetto loaders
e, fintanto che i nuovi loader implementano l'interfaccia Loader, dovrebbero funzionare con il resto di MITMEngine senza
ulteriori modifiche.
Il punto di ingresso previsto per il pacchetto MITMEngine è attraverso la funzione Processor.Check, che accetta uno User Agent e un'impronta digitale di richiesta client e restituisce un report di rilevamento mitm. Ulteriori funzioni API verranno aggiunte in futuro per consentire, ad esempio, l'aggiunta di nuove firme a un processo in esecuzione.
Di seguito è riportato un esempio di utilizzo dell'API. Un'applicazione più completa è disponibile in cmd/demo/main.go e può essere compilata eseguendo make bin/demo.
rawUa := "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36"
requestFingerprintString := "303:dada,1301,1302,1303,c02b,c02f,c02c,c030,cca9,cca8,c013,c014,9c,9d,2f,35,a:aaaa,0,17,ff01,a,b,23,10,5,d,12,33,2d,2b,1b,dada,15:9a9a,1d,17,18:0::"
uaFingerprintString := "1:72.0.3626:2:3:10.14.3:1:"
requestFingerprint, _ := fp.NewRequestFingerprint(requestFingerprintString)
uaFingerprint, _ := fp.NewUAFingerprint(uaFingerprintString)
report := mitmProcessor.Check(uaFingerprint, rawUa, requestFingerprint)
La requestFingerprintString TLS ha il seguente formato:
<tls_version>:<cipher_suites>:<extension_names>:<curves>:<ec_point_fmts>:<http_headers>:<quirks>
La uaFingerprint ha il seguente formato:
# <browser_name>:<browser_version>:<os_platform>:<os_name>:<os_version>:<device_type>:<quirks>
Un esempio di come analizzare gli User Agent nel formato per uaFingerprint si trova nel file cmd/demo/main.go.
Per utilizzare MITMEngine, ricordati di importare le sue dipendenze. Probabilmente vorrai eseguire la logica di vendoring o gomod prima di eseguire i test su MITMEngine.
Per testare, esegui make test e per vedere la copertura del codice, esegui make cover.
Poiché le impronte digitali dei browser e dei mitm diventano rapidamente obsolete, stiamo cercando attivamente di aggiornare il repository di impronte digitali con nuovi campioni.
Contribuendo con un campione di impronta digitale (il "Campione"), tu (per tuo conto o per conto dell'organizzazione che rappresenti o da cui sei sponsorizzato (se del caso)) concedi a Cloudflare, Inc. e alle sue filiali e affiliate una licenza perpetua, irrevocabile, non esclusiva, esente da royalty, mondiale e valida su tutti i diritti di proprietà intellettuale nel Campione, per: (1) copiare, pubblicare, visualizzare e distribuire il Campione; e (2) preparare opere derivate basate sul Campione o che ne facciano parte."
Per contribuire con campioni di impronte digitali, segui questi passaggi:
(testato su macOS Mojave 10.14.3)
Crea una coppia di certificato e chiave RSA del server:
openssl req -new -x509 -sha256 -out server.crt -nodes -keyout server.pem -subj /CN=localhost
Avvia il server sulla porta 4433:
openssl s_server -www -cipher AES256-SHA -key server.pem -cert server.crt
Avvia la cattura TShark per decrittografare le intestazioni HTTP (TShark >= 3.0.0):
tshark -i loopback -o tls.keys_list:"127.0.0.1,4433,http,server.pem" -Tjson -e http.request.line -Y http > header.json
Avvia la cattura TShark del TLS Client Hello:
tshark -i loopback -f "tcp port 4433" -w handshake.pcap
Visita https://localhost:4433 dal client TLS che desideri fingerprintare. Per esempio,
echo -e "GET /test HTTP/1.1\r\nHost:example.com\r\n\r\n" | openssl s_client -connect localhost:4433
Genera un campione di impronta digitale (header.json, handshake.pcap) come descritto sopra e posizionalo nella directory reference_fingerprints/pcaps/<desc>, dove <desc> è un nome univoco e descrittivo.
Aggiungi una riga a reference_fingerprints/fingerprint_metadata.jsonl con i campi seguenti. Le opzioni riconosciute per i campi os, device, platform e browser sono quelle definite nel pacchetto uasurfer. Le opzioni riconosciute per mitm_fingerprint.type sono elencate di seguito. Vedi reference_fingerprints/fingerprint_metadata.jsonl per esempi; eventuali campi sconosciuti possono essere lasciati vuoti o omessi.
{ "desc": "", "comment": "", "handshake_pcap": "", "header_json": "<(opzionale) percorso del file contenente la richiesta HTTP del client>", "ua_fingerprint": {"raw_ua": "", "os": "<WindowsPhone|Windows|MacOSX|iOS|Android|...>", "os_version": "..", "device": "<Windows|Mac|Linux|...>", "platform": "<Computer|Tablet|Phone|...>", "browser": "<Chrome|IE|Safari|Firefox|...>", "browser_version": ".."}, "mitm_fingerprint": { "name": "", "type": "<Antivirus|FakeBrowser|Malware|Parental|Proxy>" }}
Sono benvenuti anche altre PR e richieste di funzionalità!
mergeDB (in cmd/mergedb) è un'utilità per unire impronte digitali simili di TLS ClientHello tra più versioni vicine di browser o software MITM.
Usa mergeDB per consolidare grandi elenchi di impronte digitali di User Agent / Client Hello:
go run cmd/mergedb/main.go
Per impostazione predefinita, mergeDB verrà eseguito sulle impronte digitali nella directory reference_fingerprints/mitmengine.
Invia una pull request con le modifiche di cui sopra.