
في مجال الأمن السيبراني، يُعد التحديد والتحليل الدقيق لخوادم الويب أمرًا بالغ الأهمية لكشف التهديدات وتقييم الثغرات ورسم خرائط الشبكات. نقدم لكم HTTP-Basma، وهي خوارزمية بصمة نشطة مبتكرة تكشف عن ملفات تعريف فريدة للخوادم من خلال نهج متعدد الطبقات.
HTTP-Basma متاح على https://httpbasma.netomize.ca/
في مجال الأمن السيبراني، يُعد التحديد الدقيق وتوصيف خوادم الويب أمرًا بالغ الأهمية لكشف التهديدات، وتقييم الثغرات الأمنية، ورسم خرائط الشبكات. نقدم HTTP-Basma، وهي خوارزمية بصمة نشطة جديدة تكشف ملفات تعريف فريدة للخوادم من خلال نهج متعدد الطبقات، مما يعالج هذا التحدي.
الميزات الرئيسية: طلبات مصممة، استجابات كاشفة: يرسل HTTP-Basma 8 طلبات HTTP مصممة بدقة، مما يستحضر استجابات مميزة تعكس تكوينات الخادم. تجزئة مزدوجة للمرونة. تولد الخوارزمية تجزئتين:
التجميع والاصطياد: تمكن هذه التجزئات من تجميع الخوادم، وتحديد الخوادم الفريدة والمتشابهة، وتعقب الجهات الخبيثة بثقة عالية.
تصميم معياري للتوسع: تعزز بنية الخوارزمية إضافة متغيرات تجزئة جديدة، مما يشجع التعاون والقدرة على التكيف.
في هذه الورقة، نستعرض أولاً الأعمال البارزة القائمة حول بصمة HTTP ثم نستكشف وظيفة الخوارزمية وتصميمها وبنيتها ونتائجها. بالإضافة إلى ذلك، سنعرض نتائج مقنعة من مسح أفضل مليون موقع Majestic، بما في ذلك تحديد وتجميع خوادم HTTP الخاصة بـ C&C لعائلات برمجيات خبيثة متعددة.
تتمحور الفكرة الأساسية لخوارزمية HTTP-Basma حول إرسال 8 طلبات HTTP مصممة خصيصًا بمتطلبات متنوعة لاستحضار استجابات مختلفة من الخادم. بمجرد استرجاع استجابة الخادم، يتم تشريح سطر حالة HTTP بدقة لجميع العناصر وترميزها على النحو الأمثل. بالإضافة إلى ذلك، يتم فحص رؤوس محددة من استجابة الخادم للترميز أيضًا.
الطلبات التي ترسلها هي من الأنواع التالية:
بعد كل طلب، يتم تحليل استجابة الخادم لاستخراج رؤوس وقيم محددة. تخضع هذه البيانات المستخرجة لمزيد من المعالجة، بما في ذلك التشريح والترميز، لتوليد بصمة قابلة للعكس.
التفاصيل التقنية الكاملة لكيفية عمل الخوارزمية موجودة في الورقة المرفقة.
تعامل فلسفة التصميم المعياري هذه بصمة كل طلب ككتلة بناء، مما يسمح بإعادة هيكلة أنيقة، مع إمكانية إضافة وطرح بصمة أي طلب.
عينات من البصمات:
- بصمة verbosus: 011420958a0014514bd5221420958a221420958a221420958a2200001420958a22000000001f
- بصمة pacto: 02464ae8b7d86f82c9918e2c2b9d6b91
- ملاحظة: معدل الإيجابيات الكاذبة (72/986,910)
- بصمة verbosus: 01142494d60914514bd522142494d6221420958a701420958a220000140e04922032c37f1609
- بصمة pacto: 020769322f3d94ac2f258ddf5ce08502
- ملاحظة-1: معدل الإيجابيات الكاذبة 0
- ملاحظة-2: tevedadav.site/43.209.165.126:443 (TLS)
- عينة-(sha-256): 9aa1dec8dd12f8adc7fc1274e1958f3613450109ee8b4ec6442a0fcf06df0972
- بصمة verbosus: 01140a85e40014512f3612140a85e422140a85e422140a85e4220000140a85e4220000000001
- بصمة pacto: 0207292309a7a7e798e417d69df5f2a5
- ملاحظة: معدل الإيجابيات الكاذبة (73/986,910)
- بصمة verbosus: 01140a85e4001320958a22142494d62214254c5e2214254c5e22080014254c5e220000000000
- بصمة pacto: 0202be780e1eaae0eaa6184e20c909b6
- ملاحظة: معدل الإيجابيات الكاذبة (4/986,910)
- بصمة verbosus: 01140a85e4011320958a22142494d67214254c5e2214254c5e22080014254c5e220000000000
- بصمة pacto: 02cc5be6d05192e17de041538508bc22
- ملاحظة: معدل الإيجابيات الكاذبة (38/986,910)
- بصمة verbosus: 01140a85e40914514bd522140a85e4721420958a701420958a220800140a85e4720000001609
- بصمة pacto: 0221b4e46bbd0e5c037f5a852ca3fdc0
- ملاحظة: معدل الإيجابيات الكاذبة (6/986,910)
HTTP-Basma هي أداة بلغة C++ قمت بتطويرها لعرض الجدوى العملية لهذه الخوارزمية. تستفيد من مكتبة Chilkat لجميع تفاعلات مقابس HTTP وتستخدم فئات داعمة أخرى داخل المكتبة. بالإضافة إلى ذلك، تتضمن الأداة ميزة تفكيك يمكنها تشريح وعكس التجزئة الضبابية verbosus، وإخراج كائن JSON شامل، ووظيفة مقارنة تخرج الاختلافات بين بصمتي verbosus.
لاحظ أن بعض مخرجات الأداة قد تستخدم أرقام استطلاع مختلفة قليلاً، لكن الترتيب الأساسي يظل ثابتًا: 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
عند طلب نطاق/عنوان IP معين، يمكن حفظ الاستجابة في ملف CSV أو JSON مع ثروة من المعلومات حول رؤوس استجابة الخادم والبصمة الفريدة لكل استطلاع.
على سبيل المثال، للحصول على بصمة الخادم https://google.com، وحفظ النتائج في ملفي JSON وCSV، مع حفظ رؤوس استجابات HTTP لكل استطلاع:
HTTPBasma.exe -d https://google.com --json --csv --saveh
في مجلد Output، ستجد ملف CSV google_hb_results_2026-05-19_08-35-38_am.csv وملف JSON google_hb_results_2026-05-19_08-35-38_am.json.
تأخذ وظيفة التفكيك "-i/--demangle_json" في الأداة بصمة verbosus وتعيد بناء سمات كل استطلاع، مخرجة كائن JSON شامل. وتجدر الإشارة إلى أنه عند محاولة عكس تجزئات FNV-1a، يستخدم المفكك قاعدتي بيانات محليتين: options.csv لطرق HTTP المسموح بها وstatus_line_db.csv لعبارات سبب سطر الحالة. إذا كانت أي من ملفات قواعد البيانات هذه مفقودة، يتم تعطيل ميزة عكس التجزئة المقابلة تلقائيًا. تم تجميع قواعد البيانات هذه من مسح لأفضل مليون موقع Majestic.
تفكيك بصمة verbosus للنطاق 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
}
}
}
لاحظ أن مصفوفة "status_code" تحتوي على رموز حالة HTTP متعددة. يحدث هذا لأن خوادم مختلفة قد تستخدم نفس عبارة السبب لرموز حالة مختلفة، مما يؤدي إلى تجزئات FNV-1a متطابقة.
يقارن خيار المقارنة "-C/--compare" بين بصمتي verbosus ويطبع الاختلافات عبر المكونات الرئيسية لكل استطلاع.
على سبيل المثال، مقارنة البصمتين التاليتين لـ Google وYouTube:
HTTPBasma.exe --compare 01140a85e4001320958a22142494d62214254c5e2214254c5e22080014254c5e220000000000,01140a85e4011320958a22142494d67214254c5e2214254c5e22080014254c5e220000000000
ينتج عن ذلك المخرجات التالية:
< 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 ]
تكشف المخرجات عن اختلافات تحديدًا في مكون التجزئة لاستطلاع P1، حيث يكون رأس STS موجودًا في البصمة الأولى وليس في الأخرى. علاوة على ذلك، يختلف ترميز "Content-Length" بين البصمتين لاستطلاع P3.
توفر Netomize إصدارات مجمعة من الكود العام في هذا المستودع لأنظمة Windows وLinux x64. علاوة على ذلك، يتم تضمين ملف CSV لبصمات HTTP-Basma لمليون موقع Majestic - مجموعة البيانات في الإصدار الأول.
مفتوح لطلبات السحب والمشكلات. التعليقات والاقتراحات محل تقدير كبير.