
Ein MITM (monster-in-the-middle) Erkennungstool. Wird verwendet, um MALCOLM zu erstellen:
Ziel dieses Projekts ist es, eine genaue Erkennung von HTTPS-Abfangen und robustes TLS-Fingerprinting zu ermöglichen. Dieses Projekt basiert auf The Security Impact of HTTPS Interception und begann als Portierung der Verarbeitungsskripte und Fingerabdrücke nach Go.
Weitere Hintergrundinformationen zu MITMEngine finden Sie in diesem Cloudflare-Blogbeitrag. Schnelllinks:
wireshark -v)Ausführliche Dokumentation befindet sich im Code (Paket zuerst nach $(GOPATH)/src/github.com/cloudflare/mitmengine kopieren).
godoc -http=:6060
http://localhost:6060/pkg/github.com/cloudflare/mitmengine
In diesem Projekt bilden Fingerabdrücke konkrete Instanziierungen eines Objekts ab, während Signaturen mehrere Objekte repräsentieren können. Diese Konvention wird verwendet, da ein Fingerabdruck normalerweise eine inhärente Eigenschaft eines Objekts ist, während eine Signatur gewählt werden kann. Analog dazu hätte eine tatsächliche Client-Anfrage, die von einem Server gesehen wird, einen Fingerabdruck, während die Software, die die Anfrage generiert, ihre eigene Signatur wählen kann (z. B. durch die Auswahl der unterstützten Cipher Suites).
Ein Client-Anfrage-Fingerabdruck wird aus einer Client-Anfrage an einen Server abgeleitet und enthält sowohl TLS- als auch HTTP-Merkmale. Eine Client-Anfrage-Signatur repräsentiert alle möglichen Fingerabdrücke, die eine Software generieren kann. Ziel ist es, jede Signatur so spezifisch zu machen, dass sie eine Software eindeutig identifizieren kann.
Eine User-Agent-Signatur repräsentiert eine Menge von User Agents, die von einem Browser generiert werden. Eine User-Agent-Signatur für einen Browser erlaubt einen Bereich von Browserversionen und kann den Betriebssystemnamen, die Betriebssystemplattform, die Betriebssystemversionsspanne und den Gerätetyp für detailliertere Signaturen angeben.
Eine Browser-Signatur enthält sowohl eine User-Agent-Signatur als auch eine Client-Anfrage-Signatur. Dies ermöglicht es einer Signatur, alle möglichen Fingerabdrücke darzustellen, die beispielsweise von Chrome 31-38 unter Windows 10 generiert werden.
Eine MITM-Signatur enthält eine Client-Anfrage-Signatur sowie zusätzliche Details zur MITM-Software, einschließlich einer Sicherheitsbewertung, die durch Faktoren außerhalb der Client-Anfrage beeinflusst werden kann, wie z. B. ob die Software Zertifikate validiert.
Wir betrachten eine HTTPS-Verbindung als abgefangen, wenn eine Diskrepanz zwischen der erwarteten Client-Anfrage-Signatur (die dem durch den User Agent identifizierten Browser entspricht) und dem tatsächlichen Client-Anfrage-Fingerabdruck der Anfrage besteht.
Wenn eine Signatur für eine bestimmte Clientsoftware ungenau oder veraltet ist, kann es vorkommen, dass die Signatur fälschlicherweise eine Verbindung als abgefangen einstuft.
Wenn ein Proxy die Anfrage des Clients sehr genau nachahmt, wird möglicherweise keine Diskrepanz erkannt. Wenn die Browser-Signaturen zu breit gefasst sind, gelingt die Erkennung von Abfangen ebenfalls nicht.
Die Referenz-Fingerabdrücke für Browser und MITM-Software, die in MALCOLM verwendet werden, befinden sich in reference_fingerprints/mitmengine/.
Dieser Satz von Fingerabdrücken ist eine Kombination aus den TLS-Client-Hello-pcaps in reference_fingerprints/pcaps/ sowie den Top-500-User-Agent-/TLS-Client-Hello-Paaren, die im Netzwerk von Cloudflare beobachtet und mit einer hohen Vertrauenswürdigkeit bewertet wurden (d. h. Verkehr, der menschlichen und freundlichen Bot-Aktivitäten entspricht).
Idealerweise müssten wir uns nicht auf Referenzfingerabdrücke stützen, die aus Cloudflares Netzwerk stammen; stattdessen hätten wir einen umfassenden Satz von pcaps, um unseren Satz von Referenz-TLS-Client-Hellos aufzubauen. Interessiert daran, uns beim Aufbau unseres Datensatzes zu helfen? Erfahren Sie, wie Sie beitragen können!
Zunächst muss ein Benutzer eine mitmengine.Config-Struktur erstellen, um sie an mitmengine.NewProcessor zu übergeben. Eine mitmengine.Config-Struktur kann Dateinamen von Dateien angeben, die Browser-Fingerabdrücke, MITM-Fingerabdrücke und MITM-Header enthalten. Alternativ kann sie auch eine Konfigurationsdatei zum Lesen der zuvor genannten Dateien aus einer anderen Quelle angeben; derzeit unterstützt MITMEngine das Lesen dieser Dateien aus Amazon S3-kompatiblen Datenbanken (einschließlich Amazon S3 und Ceph). Zusätzliche Dateileser für Datenbanken (die wir „Loader“ nennen) können im Paket loaders definiert werden, und solange neue Loader das Loader-Interface implementieren, sollten sie ohne weitere Anpassungen mit dem Rest von MITMEngine funktionieren.
Der vorgesehene Einstiegspunkt in das MITMEngine-Paket ist die Funktion Processor.Check, die einen User Agent und einen Client-Anfrage-Fingerabdruck entgegennimmt und einen MITM-Erkennungsbericht zurückgibt. Zukünftig werden weitere API-Funktionen hinzugefügt, um beispielsweise das Hinzufügen neuer Signaturen zu einem laufenden Prozess zu ermöglichen.
Ein Beispiel für die Nutzung der API finden Sie unten. Eine vollständigere Anwendung ist unter cmd/demo/main.go verfügbar und kann durch Ausführen von make bin/demo erstellt werden.
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)
Der TLS-requestFingerprintString hat das folgende Format:
<tls_version>:<cipher_suites>:<extension_names>:<curves>:<ec_point_fmts>:<http_headers>:<quirks>
Der uaFingerprint hat das folgende Format:
# <browser_name>:<browser_version>:<os_platform>:<os_name>:<os_version>:<device_type>:<quirks>
Ein Beispiel zum Parsen von User Agents in das Format für uaFingerprint finden Sie in der Datei cmd/demo/main.go.
Um MITMEngine zu verwenden, denken Sie daran, die Abhängigkeiten einzubinden. Sie sollten vor dem Ausführen von Tests für MITMEngine wahrscheinlich Vendoring oder gomod-Logik ausführen.
Zum Testen führen Sie make test aus, und zur Ansicht der Codeabdeckung führen Sie make cover aus.
Da Browser- und MITM-Fingerabdrücke schnell veralten, sind wir aktiv auf der Suche nach neuen Beispielen zur Aktualisierung des Fingerabdruck-Repositoriums.
Durch das Beitragen eines Fingerabdruck-Beispiels (das „Sample“) gewähren Sie (in eigenem Namen oder im Namen der Organisation, die Sie vertreten oder von der Sie gesponsert werden (falls vorhanden)) Cloudflare, Inc. und seinen Tochtergesellschaften und verbundenen Unternehmen eine unbefristete, unwiderrufliche, nicht exklusive, gebührenfreie, weltweite Lizenz unter allen geistigen Eigentumsrechten an dem Sample, um: (1) das Sample zu kopieren, zu veröffentlichen, anzuzeigen und zu verbreiten; und (2) abgeleitete Werke zu erstellen, die auf dem Sample basieren oder Teil davon sind.
Um Fingerabdruck-Beispiele beizutragen, befolgen Sie bitte diese Schritte:
(getestet unter macOS Mojave 10.14.3)
Server-RSA-Zertifikat und Schlüsselpaar erstellen:
openssl req -new -x509 -sha256 -out server.crt -nodes -keyout server.pem -subj /CN=localhost
Server auf Port 4433 starten:
openssl s_server -www -cipher AES256-SHA -key server.pem -cert server.crt
TShark-Aufzeichnung zur Entschlüsselung von HTTP-Headern starten (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
TShark-Aufzeichnung des TLS-Client-Hello starten:
tshark -i loopback -f "tcp port 4433" -w handshake.pcap
https://localhost:4433 vom gewünschten TLS-Client aus aufrufen. Beispiel:
echo -e "GET /test HTTP/1.1\r\nHost:example.com\r\n\r\n" | openssl s_client -connect localhost:4433
Erzeugen Sie ein Fingerabdruck-Beispiel (header.json, handshake.pcap) wie oben beschrieben und legen Sie es im Verzeichnis reference_fingerprints/pcaps/<desc> ab, wobei <desc> ein eindeutiger und beschreibender Name ist.
Fügen Sie eine Zeile zu reference_fingerprints/fingerprint_metadata.jsonl mit den folgenden Feldern hinzu. Anerkannte Optionen für die Felder os, device, platform und browser sind die im Paket uasurfer definierten. Anerkannte Optionen für mitm_fingerprint.type sind unten aufgeführt. Beispiele finden Sie in reference_fingerprints/fingerprint_metadata.jsonl; unbekannte Felder können leer gelassen oder weggelassen werden.
Andere PRs und Feature-Requests sind willkommen!
mergeDB (in cmd/mergedb) ist ein Dienstprogramm zum Zusammenführen ähnlicher TLS-ClientHello-Fingerabdrücke über mehrere nahe beieinander liegende Versionen von Browsern oder MITM-Software hinweg.
Verwenden Sie mergeDB, um große Listen von User-Agent-/ClientHello-Fingerabdrücken zu konsolidieren:
go run cmd/mergedb/main.go
Standardmäßig führt mergeDB die Fingerabdrücke im Verzeichnis reference_fingerprints/mitmengine aus.
{ "desc": "<eindeutiger und beschreibender Name für das Sample>", "comment": "<zusätzliche Informationen zum Sample>", "handshake_pcap": "", "header_json": "<(optional) Pfad zur Datei mit der Client-HTTP-Anfrage>", "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>" }}
Reichen Sie einen Pull-Request mit den obigen Änderungen ein.