
أداة كشف هجوم MITM (وحش في المنتصف). تُستخدم لبناء MALCOLM:
الهدف من هذا المشروع هو السماح بالكشف الدقيق عن اعتراض HTTPS والبصمات القوية لبروتوكول TLS. يعتمد هذا المشروع على التأثير الأمني لاعتراض HTTPS، وبدأ كمنفذ إلى Go لـ برامج المعالجة والبصمات الخاصة بهم.
مزيد من السياق حول MITMEngine متاح في هذا المنشور في مدونة Cloudflare. روابط سريعة:
wireshark -v)التوثيق التفصيلي موجود مع الكود (انسخ الحزمة إلى $(GOPATH)/src/github.com/cloudflare/mitmengine أولاً).
godoc -http=:6060
http://localhost:6060/pkg/github.com/cloudflare/mitmengine
في هذا المشروع، تُعيّن البصمات إلى تجسيدات ملموسة لكائن، بينما يمكن للتوقيعات أن تمثل كائنات متعددة. نستخدم هذه الاتفاقية لأن البصمة عادةً ما تكون خاصية جوهرية لكائن، بينما يمكن اختيار التوقيع. بنفس الطريقة، فإن طلب العميل الفعلي الذي يراه الخادم سيكون له بصمة، بينما يمكن للبرنامج الذي يُنشئ الطلب أن يختار توقيعه الخاص (على سبيل المثال، عن طريق اختيار مجموعات التشفير التي يدعمها).
تُشتق بصمة طلب العميل من طلب العميل إلى الخادم، وتحتوي على ميزات كل من TLS و HTTP. يمثل توقيع طلب العميل جميع البصمات الممكنة التي يمكن لقطعة برمجية إنشائها. الهدف هو جعل كل توقيع محددًا بدرجة كافية بحيث يمكنه تحديد قطعة برمجية بشكل فريد.
يمثل توقيع وكيل المستخدم مجموعة من وكلاء المستخدم التي ينشئها متصفح. يسمح توقيع وكيل المستخدم للمتصفح بمجموعة من إصدارات المتصفح، ويسمح بتحديد اسم نظام التشغيل، ومنصة نظام التشغيل، ونطاق إصدار نظام التشغيل، ونوع الجهاز لإنشاء توقيعات أكثر دقة.
يحتوي توقيع المتصفح على كل من توقيع وكيل المستخدم وتوقيع طلب العميل. يسمح هذا للتوقيع بتمثيل جميع البصمات الممكنة التي ينشئها Chrome 31-38 على Windows 10، على سبيل المثال.
يحتوي توقيع MITM على توقيع طلب العميل بالإضافة إلى تفاصيل إضافية حول برنامج MITM، بما في ذلك درجة الأمان التي يمكن أن تتأثر بعوامل خارج طلب العميل، مثل ما إذا كان البرنامج يتحقق من الشهادات.
نعتبر اتصال HTTPS معترضًا عندما يكون هناك عدم تطابق بين توقيع طلب العميل المتوقع المطابق للمتصفح المحدد بواسطة وكيل المستخدم، وبصمة طلب العميل الفعلية للطلب.
إذا كان التوقيع غير دقيق أو قديم بالنسبة لقطعة برمجية عميلة معينة، فمن الممكن أن يحدد التوقيع بشكل خاطئ أن الاتصال معترض.
إذا قام وكيل بتقليد طلب العميل عن كثب، فقد لا نتوقع اكتشاف عدم تطابق. إذا كانت توقيعات المتصفح واسعة جدًا، فسنفشل أيضًا في اكتشاف الاعتراض.
يمكن العثور على بصمات المتصفح المرجعية وبرامج MITM المستخدمة في MALCOLM في reference_fingerprints/mitmengine/.
هذه المجموعة من البصمات هي مزيج مما يتم استخراجه من بصمات TLS Client Hello في reference_fingerprints/pcaps/، بالإضافة إلى أفضل 500 زوج من وكيل المستخدم + TLS Client Hello
التي تم ملاحظتها على شبكة Cloudflare والموسومة بتصنيف موثوقية عالية (أي، حركة المرور المقابلة لنشاط بشري وروبوتات صديقة).
من الناحية المثالية، لا نضطر للاعتماد على البصمات المرجعية المأخوذة من شبكة Cloudflare؛ بدلاً من ذلك، سيكون لدينا مجموعة شاملة من ملفات pcap لبناء مجموعتنا المرجعية من TLS Client Hellos. هل أنت مهتم بمساعدتنا في بناء مجموعة البيانات الخاصة بنا؟ راجع كيف يمكنك المساهمة!
أولاً، يجب على المستخدم إنشاء بنية mitmengine.Config لتمريرها إلى mitmengine.NewProcessor. يمكن لبنية mitmengine.Config
تحديد أسماء ملفات تحتوي على بصمات المتصفح، وبصمات MITM، ورؤوس MITM.
بدلاً من ذلك، يمكنها أيضًا تحديد ملف تكوين لقراءة الملفات المذكورة أعلاه من أي
مصدر آخر؛ حاليًا، يدعم MITMEngine قراءة هذه الملفات من قواعد بيانات متوافقة مع عميل Amazon S3 (بما في ذلك
Amazon S3 و Ceph). يمكن تعريف قارئات ملفات إضافية لقواعد البيانات (التي نسميها "loaders") في حزمة
loaders، وطالما أن المحملات الجديدة تطبق واجهة Loader، فيجب أن تعمل مع بقية MITMEngine دون
أي مشاكل.
نقطة الدخول المقصودة لحزمة MITMEngine هي من خلال دالة Processor.Check، التي تأخذ وكيل مستخدم وبصمة طلب عميل، وتعيد تقرير كشف MITM. ستتم إضافة دوال API إضافية في المستقبل للسماح بإضافة توقيعات جديدة إلى عملية قيد التشغيل، على سبيل المثال.
مثال على استخدام API موجود أدناه. تطبيق أكثر اكتمالاً متاح في cmd/demo/main.go، ويمكن بناؤه عن طريق تشغيل 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)
سلسلة requestFingerprintString الخاصة بـ TLS لها التنسيق التالي:
<tls_version>:<cipher_suites>:<extension_names>:<curves>:<ec_point_fmts>:<http_headers>:<quirks>
بصمة uaFingerprint لها التنسيق التالي:
# <browser_name>:<browser_version>:<os_platform>:<os_name>:<os_version>:<device_type>:<quirks>
مثال على كيفية تحليل وكلاء المستخدم إلى التنسيق الخاص بـ uaFingerprint موجود في ملف cmd/demo/main.go.
لاستخدام MITMEngine، تذكر سحب تبعياته. من المحتمل أن ترغب في تشغيل منطق vendoring أو gomod قبل تشغيل الاختبارات على MITMEngine.
للاختبار، قم بتشغيل make test ولرؤية تغطية الكود، قم بتشغيل make cover.
نظرًا لأن بصمات المتصفح و MITM تصبح قديمة بسرعة، فإننا نسعى بنشاط لتحديث مستودع البصمات بعينات جديدة.
من خلال المساهمة بعينة بصمة ( "العينة")، أنت (باسمك أو نيابة عن المنظمة التي تمثلها أو التي ترعاك (إن وجدت)) تمنح Cloudflare, Inc. وشركاتها التابعة والزميلة ترخيصًا دائمًا، غير قابل للإلغاء، غير حصري، بدون رسوم، في جميع أنحاء العالم وحقًا بموجب جميع حقوق الملكية الفكرية في العينة، من أجل: (1) نسخ ونشر وعرض وتوزيع العينة؛ و (2) إعداد أعمال مشتقة مبنية على أو جزء من العينة."
للمساهمة بعينات بصمة، يرجى اتباع هذه الخطوات:
(تم اختباره على macOS Mojave 10.14.3)
إنشاء شهادة RSA للخادم وزوج المفاتيح:
openssl req -new -x509 -sha256 -out server.crt -nodes -keyout server.pem -subj /CN=localhost
بدء الخادم على المنفذ 4433:
openssl s_server -www -cipher AES256-SHA -key server.pem -cert server.crt
بدء التقاط TShark لفك تشفير رؤوس 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
بدء التقاط TShark لـ TLS Client Hello:
tshark -i loopback -f "tcp port 4433" -w handshake.pcap
قم بزيارة https://localhost:4433 من عميل TLS الذي ترغب في بصمته. على سبيل المثال،
echo -e "GET /test HTTP/1.1\r\nHost:example.com\r\n\r\n" | openssl s_client -connect localhost:4433
قم بإنشاء عينة بصمة (header.json، handshake.pcap) كما هو موضح أعلاه، وضعها في الدليل reference_fingerprints/pcaps/<desc>، حيث <desc> هو اسم فريد ووصفي.
أضف سطرًا إلى reference_fingerprints/fingerprint_metadata.jsonl مع الحقول أدناه. الخيارات المعترف بها لحقول os، device، platform، و browser هي تلك المعرفة في حزمة uasurfer. الخيارات المعترف بها لـ mitm_fingerprint.type مدرجة أدناه. راجع reference_fingerprints/fingerprint_metadata.jsonl للحصول على أمثلة؛ يمكن ترك أي حقول غير معروفة فارغة أو حذفها.
{ "desc": "<اسم فريد ووصفي للعينة>", "comment": "<معلومات إضافية حول العينة>", "handshake_pcap": "<مسار إلى pcap يحتوي على TLS Client Hello>", "header_json": "<(اختياري) مسار إلى ملف يحتوي على طلب HTTP الخاص بالعميل", "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": "<وصف mitm>", "type": "<Antivirus|FakeBrowser|Malware|Parental|Proxy>" }}
نرحب بطلبات السحب الأخرى وطلبات الميزات!
mergeDB (في cmd/mergedb) هي أداة لدمج بصمات TLS ClientHello المتشابهة عبر إصدارات متقاربة متعددة من المتصفحات أو برامج MITM.
استخدم mergeDB لدمج القوائم الكبيرة لبصمات وكيل المستخدم / Client Hello:
go run cmd/mergedb/main.go
بشكل افتراضي، سيعمل mergeDB على البصمات الموجودة في دليل reference_fingerprints/mitmengine.
قدم طلب سحب مع التغييرات أعلاه.