
Erzeugt eindeutige Fingerabdrücke von Malware-HTTP-Anfragen aus pcap-Dateien mithilfe von Tshark und ermöglicht die Identifizierung und Gruppierung von Malware-Familien durch Analyse der Anfragestruktur, Header und Nutzlastmerkmale.
Werkzeug zum Fingerprinting von HTTP-Anfragen von Malware. Basiert auf Tshark und in Python3 geschrieben. Prototyp-Stadium :-)
Das Hauptziel ist die Erstellung eindeutiger Darstellungen (Fingerabdrücke) von Malware-Anfragen, die bei deren Identifizierung helfen. Eindeutig bedeutet hier, dass jeder Fingerabdruck nur in einer bestimmten Malware-Familie vorkommen sollte, dennoch kann eine Familie mehrere Fingerabdrücke haben. Hfinger stellt die Anfrage in einer kürzeren Form dar als die gesamte Anfrage auszugeben, bleibt aber für Menschen interpretierbar.
Hfinger kann in der manuellen Malware-Analyse, aber auch in Sandbox-Systemen oder SIEMs eingesetzt werden. Die generierten Fingerabdrücke sind nützlich, um Anfragen zu gruppieren, Anfragen bestimmten Malware-Familien zuzuordnen, verschiedene Operationen einer Familie zu identifizieren, oder unbekannte bösartige Anfragen zu entdecken, die von anderen Sicherheitssystemen übersehen werden, aber denselben Fingerabdruck teilen.
Ein wissenschaftlicher Artikel begleitet die Arbeit an diesem Werkzeug und beschreibt zum Beispiel die Motivation der Designentscheidungen, sowie die Evaluierung des Werkzeugs im Vergleich zu p0f, FATT und Mercury.
Die grundlegende Annahme dieses Projekts ist, dass HTTP-Anfragen verschiedener Malware-Familien mehr oder weniger einzigartig sind, sodass sie fingerprinted werden können, um eine Art Identifikation zu ermöglichen. Hfinger behält Informationen über die Struktur und Werte einiger Header, um Mittel für weitere Analysen bereitzustellen. Zum Beispiel die Gruppierung ähnlicher Anfragen – dies ist momentan noch in Arbeit.
Nach der Analyse von HTTP-Anfragen und Headern von Malware haben wir einige Teile der Anfragen als am meisten unterscheidend identifiziert. Diese umfassen:
Zusätzlich wurden einige Standardmerkmale der Anfrage-URL berücksichtigt. All diese Teile wurden in einen Satz von Merkmalen übersetzt, die detailliert hier beschrieben sind.
Die oben genannten Merkmale werden in eine Darstellung variabler Länge übersetzt, den eigentlichen Fingerabdruck. Je nach Berichtsmodus werden verschiedene Merkmale zum Fingerprinting der Anfragen verwendet. Weitere Informationen zu diesen Modi finden Sie unten. Der Merkmalsauswahlprozess wird in einem kommenden wissenschaftlichen Artikel beschrieben.
Mindestanforderungen vor der Installation:
Python >= 3.3,Tshark >= 2.2.0.Installation über PyPI verfügbar:
pip install hfinger
Hfinger wurde auf Xubuntu 22.04 LTS mit dem tshark-Paket in Version 3.6.2 getestet,
sollte aber auch mit älteren Versionen wie 2.6.10 auf Xubuntu 18.04 oder 3.2.3 auf Xubuntu 20.04 funktionieren.
Bitte beachten Sie, dass Sie Hfinger wie bei jedem PoC in einer abgeschotteten Umgebung ausführen sollten, zumindest mit einer Python-Virtualenvironment. Deren Einrichtung wird hier nicht behandelt, aber Sie können dieses Tutorial ausprobieren.
Nach der Installation können Sie das Werkzeug direkt von der Kommandozeile mit hfinger aufrufen
oder als Python-Modul mit python -m hfinger.
Zum Beispiel:
foo@bar:~$ hfinger -f /tmp/test.pcap
[{"epoch_time": "1614098832.205385000", "ip_src": "127.0.0.1", "ip_dst": "127.0.0.1", "port_src": "53664", "port_dst": "8080", "fingerprint": "2|3|1|php|0.6|PO|1|us-ag,ac,ac-en,ho,co,co-ty,co-le|us-ag:f452d7a9/ac:as-as/ac-en:id/co:Ke-Al/co-ty:te-pl|A|4|1.4"}]
Hilfe kann mit der kurzen -h oder der langen --help-Option angezeigt werden:
usage: hfinger [-h] (-f FILE | -d DIR) [-o output_path] [-m {0,1,2,3,4}] [-v]
[-l LOGFILE]
Hfinger - Fingerprinting von Malware-HTTP-Anfragen, gespeichert in pcap-Dateien
optionale Argumente:
-h, --help Zeigt diese Hilfemeldung an und beendet das Programm
-f FILE, --file FILE Liest eine einzelne pcap-Datei
-d DIR, --directory DIR
Liest pcap-Dateien aus dem Verzeichnis DIR
-o output_path, --output-path output_path
Pfad zum Ausgabeverzeichnis
-m {0,1,2,3,4}, --mode {0,1,2,3,4}
Fingerprint-Berichtsmodus.
0 - ähnliche Anzahl von Kollisionen und Fingerprints wie Modus 2, aber mit weniger Merkmalen,
1 - Darstellung aller entworfenen Merkmale, aber etwas mehr Kollisionen als Modi 0, 2 und 4,
2 - optimal (Standardmodus),
3 - geringste Anzahl generierter Fingerprints, aber höchste Anzahl von Kollisionen,
4 - höchste Fingerprint-Entropie, aber geringfügig mehr Fingerprints als Modi 0-2
-v, --verbose Meldet Informationen über nicht standardmäßige Werte in der Anfrage
(z.B. Nicht-ASCII-Zeichen, fehlende CRLF-Tags, Werte, die nicht in der Konfigurationsliste vorhanden sind).
Ohne --logfile (-l) wird auf die Standardfehlerausgabe geschrieben.
-l LOGFILE, --logfile LOGFILE
Ausgabe-Logdatei im ausführlichen Modus. Impliziert die Option -v oder --verbose.
Sie müssen einen Pfad zu einer pcap-Datei (-f) oder einem Verzeichnis (-d) mit pcap-Dateien angeben. Die Ausgabe erfolgt im JSON-Format. Sie wird auf die Standardausgabe oder in das angegebene Verzeichnis (-o) unter Verwendung des Namens der Quelldatei ausgegeben. Zum Beispiel wird die Ausgabe des Befehls:
hfinger -f example.pcap -o /tmp/pcap
gespeichert unter:
/tmp/pcap/example.pcap.json
Der Berichtsmodus -m/--mode kann verwendet werden, um den Standardberichtsmodus zu ändern, indem eine ganze Zahl im Bereich 0-4 angegeben wird.
Die Modi unterscheiden sich in den dargestellten Anfragemerkmalen oder Rundungsmodi.
Der Standardmodus (2) wurde von uns gewählt, um alle Merkmale darzustellen, die üblicherweise bei der Analyse von Anfragen verwendet werden,
bietet aber auch eine geringe Anzahl von Kollisionen und generierten Fingerprints.
Mit anderen Modi können Sie unterschiedliche Ziele erreichen.
Zum Beispiel erhalten Sie im Modus 3 eine geringere Anzahl generierter Fingerprints,
aber eine höhere Wahrscheinlichkeit einer Kollision zwischen Malware-Familien. Wenn Sie unsicher sind, müssen Sie nichts ändern.
Weitere Informationen zu den Berichtsmodi finden Sie hier.
Ab Version 0.2.1 ist Hfinger weniger ausführlich. Sie sollten -v/--verbose verwenden, wenn Sie Informationen
über aufgetretene nicht standardmäßige Header-Werte, Nicht-ASCII-Zeichen im Nicht-Payload-Teil der
Anfrage, fehlende CRLF-Tags (\r\n\r\n) und andere Probleme mit analysierten Anfragen, die keine Anwendungsfehler sind, erhalten möchten.
Wenn im ausführlichen Modus solche Probleme auftreten, werden sie auf die Standardfehlerausgabe geschrieben.
Sie können das Log auch mit dem Schalter -l/--log an einem definierten Ort speichern (dies impliziert -v/--verbose).
Die Logdaten werden an die Logdatei angehängt.
Ab Version 0.2.0 unterstützt Hfinger den Import in andere Python-Anwendungen.
Um es in Ihrer App zu verwenden, importieren Sie einfach die Funktion hfinger_analyze aus hfinger.analysis
und rufen Sie sie mit einem Pfad zur pcap-Datei und dem Berichtsmodus auf.
Das zurückgegebene Ergebnis ist eine Liste von Dictionaries mit Fingerprinting-Ergebnissen.
Zum Beispiel:
from hfinger.analysis import hfinger_analyze
pcap_path = "GEBEN_SIE_HIER_DEN_PCAP_PFAD_AN"
reporting_mode = 4
print(hfinger_analyze(pcap_path, reporting_mode))
Ab Version 0.2.1 verwendet Hfinger das logging-Modul zum Protokollieren von Informationen über aufgetretene
nicht standardmäßige Header-Werte, Nicht-ASCII-Zeichen im Nicht-Payload-Teil der Anfrage,
fehlende CRLF-Tags (\r\n\r\n) und andere Probleme mit analysierten Anfragen, die keine Anwendungsfehler sind.
Hfinger erstellt einen eigenen Logger mit dem Namen hfinger, aber ohne vorherige Konfiguration werden Loginformationen in der Praxis verworfen.
Wenn Sie diese Loginformationen erhalten möchten, sollten Sie vor dem Aufruf von hfinger_analyze den hfinger-Logger konfigurieren,
das Log-Level auf logging.INFO setzen, den Log-Handler nach Ihren Bedürfnissen konfigurieren und ihn zum Logger hinzufügen.
Weitere Informationen finden Sie im Docstring der Funktion hfinger_analyze.
Ein Fingerabdruck basiert auf Merkmalen, die aus einer Anfrage extrahiert werden. Die Verwendung bestimmter Merkmale aus der vollständigen Liste hängt vom gewählten Berichtsmodus aus einer vordefinierten Liste ab (weitere Informationen zu den Berichtsmodi finden Sie hier). Die folgende Abbildung zeigt die Erstellung eines beispielhaften Fingerabdrucks im Standardberichtsmodus.

Drei Teile der Anfrage werden analysiert, um Informationen zu extrahieren: URI,
Header-Struktur (einschließlich Methode und Protokollversion) und Payload.
Bestimmte Merkmale des Fingerabdrucks werden mit | (Pipe) getrennt. Der endgültige Fingerabdruck, der für die POST-Anfrage
aus dem Beispiel generiert wurde, lautet:
2|3|1|php|0.6|PO|1|us-ag,ac,ac-en,ho,co,co-ty,co-le|us-ag:f452d7a9/ac:as-as/ac-en:id/co:Ke-Al/co-ty:te-pl|A|4|1.4
Die Erstellung der Merkmale wird im Folgenden in der Reihenfolge ihres Auftretens im Fingerabdruck beschrieben.
Zuerst werden URI-Merkmale extrahiert:
log10(43)≈2),log10(20/3)≈1),hfinger/configs/extensions.txt enthalten ist,log10(4)≈0.6).Zweitens werden Header-Struktur-Merkmale analysiert:
PO),Um die Reihenfolge der Header in der Anfrage darzustellen, wird jeder Header-Name gemäß dem Schema in
hfinger/configs/headerslow.json codiert, zum Beispiel wird der User-Agent-Header als us-ag codiert.
Codierte Namen werden durch , getrennt. Wenn der Header-Name nicht mit einem Großbuchstaben beginnt
(oder einem seiner Teile bei der Analyse zusammengesetzter Header wie Accept-Encoding),
wird die codierte Darstellung mit ! vorangestellt.
Wenn der Header-Name nicht in der Liste der bekannten Header enthalten ist,
wird er mit FNV1a-Hash gehasht,
und der Hash wird als Codierung verwendet.
Bei der Analyse gängiger Header wird überprüft, ob sie in der Anfrage vorkommen. Diese Header sind:
Wenn der Header in der Anfrage gefunden wird, wird sein Wert gegen eine Tabelle typischer Werte geprüft, um Paare aus Header-Name-Darstellung:Wert-Darstellung zu erstellen.
Der Name des Headers wird gemäß dem Schema in hfinger/configs/headerslow.json codiert (wie zuvor gezeigt),
und der Wert wird gemäß dem Schema codiert, das im Verzeichnis hfinger/configs oder in der Datei configs.py gespeichert ist,
abhängig vom Header. Im obigen Beispiel wird Accept als ac codiert
und sein Wert */* als as-as (Asterisk-Asterisk), was ac:as-as ergibt.
Die Paare werden in der Reihenfolge ihres Auftretens in der Anfrage in den Fingerabdruck eingefügt und mit / getrennt.
Wenn der Header-Wert nicht in der Codierungstabelle gefunden werden kann, wird er mit dem FNV1a-Hash gehasht.
Wenn der Header-Wert aus mehreren Werten besteht, werden sie tokenisiert, um eine Liste von Werten zu erhalten, die mit , getrennt sind,
zum Beispiel würde ergeben. Allerdings wird an diesem Punkt der Entwicklung, wenn der Header-Wert
ein "Qualitätswert"-Tag () enthält, der gesamte Wert mit seinem FNV1a-Hash codiert.
Schließlich werden die Werte der Header und direkt mit ihren FNV1a-Hashes codiert.
Zuletzt werden bei den Payload-Merkmalen:
N, andernfalls mit A,Hfinger arbeitet in fünf Berichtsmodi, die sich in den im Fingerabdruck dargestellten Merkmalen unterscheiden,
also in den Informationen, die aus Anfragen extrahiert werden. Diese sind (mit der in der Tool-Konfiguration verwendeten Nummer):
0 – erzeugt eine ähnliche Anzahl von Kollisionen und Fingerprints wie Modus 2, aber mit weniger Merkmalen,1 – stellt alle entworfenen Merkmale dar, erzeugt aber etwas mehr Kollisionen als die Modi 0, 2 und 4,2 – optimal (der Standardmodus), stellt alle Merkmale dar, die üblicherweise bei der Analyse von Anfragen verwendet werden,
bietet aber auch eine geringe Anzahl von Kollisionen und generierten Fingerprints,3 – erzeugt die geringste Anzahl generierter Fingerprints aller Modi,
erreicht aber die höchste Anzahl von Kollisionen,4 – bietet die höchste Fingerprint-Entropie,
erzeugt aber auch geringfügig mehr Fingerprints als die Modi 0-2.Die Modi wurden gewählt, um Hfingers Fähigkeiten zur eindeutigen Identifizierung von Malware-Familien
im Verhältnis zur Anzahl der generierten Fingerprints zu optimieren. Die Modi 0, 2 und 4 bieten eine ähnliche Anzahl von Kollisionen
zwischen Malware-Familien, jedoch erzeugt Modus 4 etwas mehr Fingerprints als die anderen beiden.
Modus 2 stellt mehr Anfragemerkmale dar als Modus 0 bei vergleichbarer Anzahl generierter Fingerprints und Kollisionen.
Modus 1 ist der einzige, der alle entworfenen Merkmale darstellt, aber er erhöht die Anzahl der Kollisionen um fast das Doppelte
im Vergleich zu den Modi 0, 1 und 4. Modus 3 erzeugt mindestens zweimal weniger Fingerprints als die anderen Modi, aber er
führt zu etwa neunmal mehr Kollisionen. Eine Beschreibung aller entworfenen Merkmale finden Sie hier.
Die Modi bestehen aus Merkmalen (in der Reihenfolge ihres Auftretens im Fingerabdruck):
0:
1:
2:
3:

Accept: */*, text/*ac:as-as,te-asq=4: