
In the realm of cybersecurity, accurately identifying and characterizing web servers is crucial for threat detection, vulnerability assessment, and network mapping. We introduce HTTP-Basma, a novel active fingerprinting algorithm that unveils unique server profiles through a multi-layered approach.
HTTP-Basma ist live unter https://httpbasma.netomize.ca/
Im Bereich der Cybersicherheit ist die genaue Identifizierung und Charakterisierung von Webservern für die Bedrohungserkennung, Schwachstellenbewertung und Netzwerkkartierung von entscheidender Bedeutung. Wir stellen HTTP-Basma vor, einen neuartigen aktiven Fingerprinting-Algorithmus, der durch einen mehrschichtigen Ansatz einzigartige Serverprofile aufdeckt und so diese Herausforderung angeht.
Hauptmerkmale: Maßgeschneiderte Anfragen, aufschlussreiche Antworten: HTTP-Basma sendet 8 sorgfältig entwickelte HTTP-Probes, die charakteristische Antworten hervorrufen, die Serverkonfigurationen widerspiegeln. Duales Hashing für Vielseitigkeit. Der Algorithmus generiert zwei Hashes:
Clustering und Jagd: Diese Hashes ermöglichen Server-Clustering, die Identifizierung einzigartiger und ähnlicher Server sowie die Verfolgung von Angreifern mit erhöhter Sicherheit.
Modulares Design zur Erweiterung: Die Architektur des Algorithmus fördert das Hinzufügen neuer Hashing-Varianten und begünstigt Zusammenarbeit und Anpassungsfähigkeit.
In diesem Papier betrachten wir zunächst bemerkenswerte bestehende Arbeiten zum HTTP-Fingerprinting und untersuchen dann die Funktionalität, das Design, die Architektur und die Ergebnisse des Algorithmus. Darüber hinaus werden wir überzeugende Ergebnisse aus dem Scannen der Top-1-Million-Majestic-Websites vorstellen, einschließlich der Identifizierung und Clusterung von C&C-HTTP-Servern für verschiedene Malware-Familien.
Der Kern des HTTP-Basma-Algorithmus besteht darin, 8 speziell entwickelte HTTP-Anfragen mit unterschiedlichen Anforderungen zu senden, um verschiedene Antworten vom Server zu erhalten. Sobald die Serverantwort abgerufen ist, wird die HTTP-Statuszeile chirurgisch nach allen Elementen seziert und optimal codiert. Zusätzlich werden ausgewählte Header aus der Serverantwort ebenfalls auf Codierung geprüft.
Die gesendeten Anfragen sind von diesen Typen:
Nach jeder Anfrage wird die Antwort des Servers analysiert, um bestimmte Header und deren Werte zu extrahieren. Diese extrahierten Daten werden weiterverarbeitet, einschließlich Sektion und Codierung, um einen umkehrbaren Fingerabdruck zu erzeugen.
Die vollständigen technischen Details zur Funktionsweise des Algorithmus finden Sie im beigefügten Papier.
Diese modulare Designphilosophie behandelt jeden Anfrage-Fingerabdruck als Baustein, was elegantes Refactoring ermöglicht, mit der Möglichkeit, den Fingerabdruck jeder Anfrage hinzuzufügen oder zu entfernen.
Beispiele für Fingerabdrücke:
- verbosus fp: 011420958a0014514bd5221420958a221420958a221420958a2200001420958a22000000001f
- pacto fp: 02464ae8b7d86f82c9918e2c2b9d6b91
- Hinweis: Falsch-Positiv-Rate (72/986.910)
- verbosus fp: 01142494d60914514bd522142494d6221420958a701420958a220000140e04922032c37f1609
- pacto fp: 020769322f3d94ac2f258ddf5ce08502
- Hinweis-1: Falsch-Positiv-Rate 0
- Hinweis-2: tevedadav.site/43.209.165.126:443 (TLS)
- sample-(sha-256): 9aa1dec8dd12f8adc7fc1274e1958f3613450109ee8b4ec6442a0fcf06df0972
- verbosus fp: 01140a85e40014512f3612140a85e422140a85e422140a85e4220000140a85e4220000000001
- pacto fp: 0207292309a7a7e798e417d69df5f2a5
- Hinweis: Falsch-Positiv-Rate (73/986.910)
- verbosus fp: 01140a85e4001320958a22142494d62214254c5e2214254c5e22080014254c5e220000000000
- pacto fp: 0202be780e1eaae0eaa6184e20c909b6
- Hinweis: Falsch-Positiv-Rate (4/986.910)
- verbosus fp: 01140a85e4011320958a22142494d67214254c5e2214254c5e22080014254c5e220000000000
- pacto fp: 02cc5be6d05192e17de041538508bc22
- Hinweis: Falsch-Positiv-Rate (38/986.910)
- verbosus fp: 01140a85e40914514bd522140a85e4721420958a701420958a220800140a85e4720000001609
- pacto fp: 0221b4e46bbd0e5c037f5a852ca3fdc0
- Hinweis: Falsch-Positiv-Rate (6/986.910)
HTTP-Basma ist ein C++-Tool, das ich entwickelt habe, um die Praktikabilität und Durchführbarkeit dieses Algorithmus zu demonstrieren. Es nutzt die Chilkat-Bibliothek für alle HTTP-Socket-Interaktionen und verwendet andere unterstützende Klassen innerhalb der Bibliothek. Darüber hinaus enthält das Tool eine Demangler-Funktion, die den verbosus-Fuzzy-Hash sezieren und umkehren kann und ein umfassendes JSON-Objekt ausgibt, sowie eine Comparator-Funktion, die die Unterschiede zwischen zwei verbosus-Fingerabdrücken ausgibt.
Beachten Sie, dass einige Ausgaben des Tools leicht unterschiedliche Probennummern verwenden können, aber die zugrunde liegende Reihenfolge bleibt konsistent: P1->P1, P2->P2, P3->P3, P4->P4, P->P5, P6->P6F, P7->P6L, P8->P7a.
Usage:
HTTP-Basma [OPTION...]
-d, --domain arg domains/IPs (you may query multiple domains, comma separated)
-p, --port arg port number
-s, --ssl does the HTTP connection have to be carried over SSL/TLS?
-q, --qpath check domain with url path included (not recommended)
-w, --redirect enable/disable HTTP redirects. If disabled/false, only the next redirect is followed,
otherwise, all redirects are followed (default: true)
-t, --ctimeout arg socket connection timeout value in seconds (default: 1)
-g, --rtimeout arg socket read (from the server) timeout value in seconds (default: 1)
-e, --sleep arg the duration (in milliseconds) to pause between each request (default: 100)
-x, --proxy arg proxy config: <"socks4|socks5|http">,<domain>,<port>,<bool:direct_tls>,<login>,<pass>
all values are comma-separated. <direct_tls> is ignored with a non-HTTP proxy
-f, --file arg file with list of domains/IPs (requires "-c/--csv" or "-j/--json")
-P, --parallel Scan list of domains passed via the "-f/--file" option in parallel
-c, --csv save to csv file; if the option 'n' is not specified, the CSV filename will be auto
generated
-n, --csvfile arg name of the CSV file
-j, --json save to json file; if the option 'l' is not specified, the JSON filename will be auto
generated
-l, --jsonfile arg name of the JSON file
-r, --saveh save request response headers
-o, --pjson display fingerprint dissection to the console as a JSON object
-i, --demangle_json arg demangle a fingerprint into a detailed json format (you can have more than one, comma
separated)
-u, --demangle_txt arg output a concise text format of the fingerprint, comma-separated for multiple results
-C, --compare arg compare two verbosus fingerprints (comma-separated)
-a, --pacto arg obtain the Pacto fingerprint using Verbosus
-h, --help print usage
Wenn eine bestimmte Domain/IP angefragt wird, kann die Antwort in einer CSV- oder JSON-Datei mit einer Vielzahl von Informationen über die Server-Antwort-Header und den eindeutigen Fingerabdruck jeder Probe gespeichert werden.
Um beispielsweise den Fingerabdruck des Servers https://google.com zu erhalten und die Ergebnisse in einer JSON- und CSV-Datei zu speichern, während die HTTP-Antwort-Header jeder Probe gespeichert werden:
HTTPBasma.exe -d https://google.com --json --csv --saveh
Im Ordner Output finden Sie die CSV-Datei google_hb_results_2026-05-19_08-35-38_am.csv und die JSON-Datei google_hb_results_2026-05-19_08-35-38_am.json.
Die Demangler-Funktion des Tools „-i/--demangle_json“ nimmt einen verbosus-Fingerabdruck und rekonstruiert die Attribute jeder Probe, wobei ein umfassendes JSON-Objekt ausgegeben wird. Bemerkenswerterweise verwendet der Demangler beim Versuch, die FNV-1a-Hashes umzukehren, zwei lokale Datenbanken: options.csv für erlaubte HTTP-Methoden und status_line_db.csv für Statuszeilen-Grundphrasen. Wenn eine dieser Datenbankdateien fehlt, wird die entsprechende Hash-Umkehrfunktion automatisch deaktiviert. Diese Datenbanken wurden aus einem Scan der Top-1-Million-Majestic-Websites zusammengestellt.
Das Demangling des verbosus-Fingerabdrucks für die Domain example.com:
HTTPBasma.exe --demangle_json 01140a85e40014514bd522142494d67214254c5e721420958a22020214254c5e720000001609
{
"type": "verbosus",
"fp": "01140a85e40014514bd522142494d67214254c5e721420958a22020214254c5e720000001609",
"p1": {
"type": "get_normal",
"fp": "140a85e400",
"status_line": {
"http_version": {
"fp": "14",
"val_cmt": "HTTP/1.1"
},
"status_code": {
"fp": "0a",
"val_cmt": "200"
},
"http_reason": {
"fp": "85e4",
"val_cmt": "OK"
},
"sl_reversed_db": {
"http_version": "HTTP/1.1",
"status_code": [
200,
404,
403,
500,
204,
999,
888,
603
],
"http_reason": "OK"
}
},
"sts_hdr": {
"fp": "00",
"cmt": "this header is not used"
}
},
"p2": {
"type": "get_invalid_ver_nb",
"fp": "14514bd522",
"status_line": {
"http_version": {
"fp": "14",
"val_cmt": "HTTP/1.1"
},
"status_code": {
"fp": "51",
"val_cmt": "505"
},
"http_reason": {
"fp": "4bd5",
"val_cmt": "HTTP Version Not Supported"
},
"sl_reversed_db": {
"http_version": "HTTP/1.1",
"status_code": [
505
],
"http_reason": "HTTP Version Not Supported"
}
},
"cont_len_hdr": {
"fp": "22",
"name": "Content-Length",
"value": ">1",
"cmt": "content-length/transfer-encoding:chunked header is present with either of the size values: [0,1,>1]"
},
"cnx": {
"ka": false,
"c": true
}
},
"p3": {
"type": "get_rnd_resource",
"fp": "142494d672",
"status_line": {
"http_version": {
"fp": "14",
"val_cmt": "HTTP/1.1"
},
"status_code": {
"fp": "24",
"val_cmt": "404"
},
"http_reason": {
"fp": "94d6",
"val_cmt": "Not Found"
},
"sl_reversed_db": {
"http_version": "HTTP/1.1",
"status_code": [
404,
403,
501,
410,
204,
400,
200,
418
],
"http_reason": "Not Found"
}
},
"cont_len_hdr": {
"fp": "72",
"name": "Transfer-Encoding",
"value": ">1",
"cmt": "content-length/transfer-encoding:chunked header is present with either of the size values: [0,1,>1]"
},
"cnx": {
"ka": true,
"c": false
}
},
"p4": {
"type": "get_rnd_verb",
"fp": "14254c5e72",
"status_line": {
"http_version": {
"fp": "14",
"val_cmt": "HTTP/1.1"
},
"status_code": {
"fp": "25",
"val_cmt": "405"
},
"http_reason": {
"fp": "4c5e",
"val_cmt": "Method Not Allowed"
},
"sl_reversed_db": {
"http_version": "HTTP/1.1",
"status_code": [
405,
403,
204,
418,
404
],
"http_reason": "Method Not Allowed"
}
},
"cont_len_hdr": {
"fp": "72",
"name": "Transfer-Encoding",
"value": ">1",
"cmt": "content-length/transfer-encoding:chunked header is present with either of the size values: [0,1,>1]"
},
"cnx": {
"ka": true,
"c": false
}
},
"p5": {
"type": "get_lowercase_verb",
"fp": "1420958a22",
"status_line": {
"http_version": {
"fp": "14",
"val_cmt": "HTTP/1.1"
},
"status_code": {
"fp": "20",
"val_cmt": "400"
},
"http_reason": {
"fp": "958a",
"val_cmt": "Bad Request"
},
"sl_reversed_db": {
"http_version": "HTTP/1.1",
"status_code": [
400,
422,
405,
401
],
"http_reason": "Bad Request"
}
},
"cont_len_hdr": {
"fp": "22",
"name": "Content-Length",
"value": ">1",
"cmt": "content-length/transfer-encoding:chunked header is present with either of the size values: [0,1,>1]"
},
"cnx": {
"ka": false,
"c": true
}
},
"p6f": {
"type": "get_accept_encoding_full",
"fp": "02",
"cont_enc_hdr": {
"value": "br",
"empty_value": false,
"total_plus": 0
}
},
"p6l": {
"type": "get_accept_encoding_less",
"fp": "02",
"cont_enc_hdr": {
"value": "br",
"empty_value": false,
"total_plus": 0
}
},
"p7a": {
"type": "options_allow_hdr",
"fp": "14254c5e72000000",
"status_line": {
"http_version": {
"fp": "14",
"val_cmt": "HTTP/1.1"
},
"status_code": {
"fp": "25",
"val_cmt": "405"
},
"http_reason": {
"fp": "4c5e",
"val_cmt": "Method Not Allowed"
},
"sl_reversed_db": {
"http_version": "HTTP/1.1",
"status_code": [
405,
403,
204,
418,
404
],
"http_reason": "Method Not Allowed"
}
},
"cont_len_hdr": {
"fp": "72",
"name": "Transfer-Encoding",
"value": ">1",
"cmt": "content-length/transfer-encoding:chunked header is present with either of the size values: [0,1,>1]"
},
"allow_hdr": {
"fp": "000000",
"cmt": "this header is not used"
},
"cnx": {
"ka": true,
"c": false
}
}
}
Beachten Sie, dass das "status_code"-Array mehrere HTTP-Statuscodes enthält. Dies tritt auf, weil verschiedene Server denselben Grundtext für unterschiedliche Statuscodes verwenden können, was zu identischen FNV-1a-Hashes führt.
Die Comparator-Option „-C/--compare“ vergleicht zwei verbosus-Fingerabdrücke und gibt die Unterschiede in den Hauptkomponenten für jede der Proben aus.
Zum Beispiel der Vergleich der folgenden beiden Fingerabdrücke für Google und YouTube:
HTTPBasma.exe --compare 01140a85e4001320958a22142494d62214254c5e2214254c5e22080014254c5e220000000000,01140a85e4011320958a22142494d67214254c5e2214254c5e22080014254c5e220000000000
Ergebnis dieser Ausgabe:
< FPrnt-1 Vs. FPrnt-2 >
[ P1 ]
{Strict-Transport-Security}
sts header: 00 != 01
[ P2 ]
[ P3 ]
{Content-Length}
cl_name: 2 != 7
[ P4 ]
[ P5 ]
[ P6F ]
[ P6L ]
[ P7a ]
Die Ausgabe zeigt Unterschiede speziell in der Hash-Komponente der P1-Probe, wo der STS-Header im ersten Fingerabdruck vorhanden ist und im anderen nicht. Außerdem unterscheidet sich die Codierung von "Content-Length" zwischen den beiden Fingerabdrücken für Probe P3.
Netomize bietet kompilierte Windows- und Linux-x64-Versionen des öffentlichen Codes in diesem Repository an. Darüber hinaus wird die CSV-Datei mit den HTTP-Basma-Fingerabdrücken der 1 Million Majestic-Websites – Datensatz in der ersten Veröffentlichung mitgeliefert.
Offen für Pull-Requests und Issues. Kommentare und Vorschläge sind sehr willkommen.