
إطار معياري لاكتشاف وتحليل الدلائل المفتوحة على الويب. يزحف على عناوين URL، يستخرج المحتوى، يطبق مسح YARA/ClamAV، ويخرج النتائج إلى MISP أو SQLite أو وحدة التحكم لاستخبارات التهديدات.
SubCrawl هو إطار عمل تم تطويره بواسطة Patrick Schläpfer وJosh Stroschein وAlex Holland من فريق Threat Research التابع لشركة HP Inc. تم تصميم SubCrawl للعثور على الدلائل المفتوحة وفحصها وتحليلها. الإطار معياري، ويتكون من أربعة مكونات: وحدات الإدخال، وحدات المعالجة، وحدات الإخراج، ومحرك الزحف الأساسي. عناوين URL هي قيم الإدخال الأساسية، والتي يقوم الإطار بتحليلها وإضافتها إلى نظام انتظار قبل الزحف إليها. يُعتبر تحليل عناوين URL خطوة أولى مهمة، حيث يأخذ عنوان URL المُقدم ويُنشئ عناوين URL إضافية ليتم الزحف إليها عن طريق إزلة الدلائل الفرعية، واحدة تلو الأخرى حتى لا يتبقى أي منها. تضمن هذه العملية محاولة فحص أكثر اكتمالاً لخادم الويب ويمكن أن تؤدي إلى اكتشاف محتوى إضافي. من الجدير بالذكر أن SubCrawl لا يستخدم طريقة القوة الغاشمة لاكتشاف عناوين URL. كل المحتوى الممسوح ضوئيًا يأتي من عناوين URL المُدخلة، وعملية تحليل عنوان URL، والاكتشاف أثناء الزحف. عند اكتشاف دليل مفتوح، يستخرج محرك الزحف الروابط من الدليل للتقييم. يحدد محرك الزحف ما إذا كان الرابط دليلاً آخر أم ملفًا. تتم إضافة الدلائل إلى قائمة انتظار الزحف، بينما تخضع الملفات لتحليل إضافي بواسطة وحدات المعالجة. يتم إنشاء النتائج وتخزينها لكل عنوان URL تم فحصه، مثل SHA256 والتجزئة الضبابية للمحتوى، وما إذا تم العثور على دليل مفتوح، أو التطابقات مع قواعد YARA. أخيرًا، تتم معالجة بيانات النتيجة وفقًا لوحدة إخراج واحدة أو أكثر، والتي يوجد منها حاليًا ثلاثة. يوفر الأول التكامل مع MISP، والثاني يطبع البيانات ببساطة إلى وحدة التحكم، والثالث يخزن البيانات في قاعدة بيانات SQLite. نظرًا لأن الإطار معياري، فليس من السهل فقط تكوين وحدات الإدخال والمعالجة والإخراج المرغوبة، بل من السهل أيضًا تطوير وحدات جديدة.
شكل 1 - بنية SubCrawl
يدعم SubCrawl وضعين مختلفين للتشغيل. أولاً، يمكن بدء تشغيل SubCrawl في وضع التشغيل لمرة واحدة. في هذا الوضع، يقوم المستخدم بتوفير عناوين URL المراد فحصها في ملف حيث يتم فصل كل قيمة إدخال بفاصل أسطر. وضع التشغيل الثاني هو وضع الخدمة. في هذا الوضع، يعمل SubCrawl في الخلفية ويعتمد على وحدات الإدخال لتوفير عناوين URL المراد فحصها. يوضح الشكل 1 نظرة عامة على بنية SubCrawl. المكونات المستخدمة في كلا وضعي التشغيل زرقاء، ومكونات وضع التشغيل لمرة واحدة صفراء، ومكونات وضع الخدمة خضراء.
بناءً على وضع التشغيل المختار، يجب استيفاء شروط مسبقة أخرى.
SubCrawl مكتوب بلغة Python3. بالإضافة إلى ذلك، هناك عدة حزم مطلوبة قبل تشغيل SubCrawl. يمكن استخدام الأمر التالي لتثبيت جميع الحزم المطلوبة قبل تشغيل SubCrawl. من دليل crawler، قم بتشغيل الأمر التالي:
$ sudo apt install build-essential
$ pip3 install -r requirements.txt
إذا تم بدء تشغيل SubCrawl في وضع الخدمة، فيمكن القيام بذلك باستخدام Docker. لهذا السبب، يلزم تثبيت Docker و Docker Compose. يمكن العثور على تعليمات تثبيت جيدة مباشرة على موقع Docker.com.
يحتوي SubCrawl على مساعدة مدمجة من خلال الوسيط -h/--help أو ببساطة عن طريق تنفيذ البرنامج النصي بدون أي وسائط.
******** ** ****** **
**////// /** **////** /**
/** ** **/** ** // ****** ****** *** ** /**
/*********/** /**/****** /** //**//* //////** //** * /** /**
////////**/** /**/**///**/** /** / ******* /** ***/** /**
/**/** /**/** /**//** ** /** **////** /****/**** /**
******** //******/****** //****** /*** //******** ***/ ///** ***
//////// ////// ///// ////// /// //////// /// /// ///
~~ جني الويب المفتوح ~~
usage: subcrawl.py [-h] [-f FILE_PATH] [-k] [-p PROCESSING_MODULES] [-s STORAGE_MODULES]
optional arguments:
-h, --help show this help message and exit
-f FILE_PATH, --file FILE_PATH
Path of input URL file
-k, --kafka Use Kafka Queue as input
-p PROCESSING_MODULES, --processing PROCESSING_MODULES
Processing modules to be executed comma separated.
-s STORAGE_MODULES, --storage STORAGE_MODULES
Storage modules to be executed comma separated.
Available processing modules:
- ClamAVProcessing
- JARMProcessing
- PayloadProcessing
- TLSHProcessing
- YARAProcessing
Available storage modules:
- ConsoleStorage
- MISPStorage
- SqliteStorage
هذا الوضع مناسب إذا كنت تريد فحص عدد يمكن التحكم فيه من النطاقات بسرعة. لهذا الغرض، يجب حفظ عناوين URL المراد فحصها في ملف، والذي سيكون بمثابة إدخال للزاحف. فيما يلي مثال على التنفيذ في وضع التشغيل لمرة واحدة، لاحظ استخدام الوسيط -f مع مسار إلى ملف.
python3 subcrawl.py -f urls.txt -p YARAProcessing,PayloadProcessing -s ConsoleStorage
مع وضع الخدمة، يمكن فحص عدد أكبر من النطاقات وحفظ النتائج. بناءً على وحدة التخزين المحددة، يمكن بعد ذلك تحليل البيانات وتقييمها بمزيد من التفصيل. لجعل تشغيل وضع الخدمة سهلاً قدر الإمكان للمستخدم، قمنا ببناء جميع الوظائف في صورة Docker. في وضع الخدمة، يتم الحصول على النطاقات المراد فحصها عبر وحدات الإدخال. بشكل افتراضي، يتم تنزيل عناوين URL جديدة للبرامج الضارة والتصيد الاحتيالي من URLhaus وPhishTank ووضعها في قائمة الانتظار للفحص. يمكن إدخال وحدات المعالجة والتخزين المطلوبة مباشرة في config.yml. بشكل افتراضي، يتم تنشيط وحدات المعالجة التالية، باستخدام تخزين SQLite:
بالإضافة إلى وحدة تخزين SQLite، تم تطوير واجهة ويب بسيطة تتيح عرض وإدارة النطاقات وعناوين URL الممسوحة ضوئيًا.

ومع ذلك، إذا لم تكن هذه الواجهة كافية للتقييم اللاحق للبيانات، فيمكن تنشيط وحدة تخزين MISP بشكل بديل أو إضافي. يجب إجراء الإعدادات المقابلة في config.yml ضمن قسم MISP.
الأمران التاليان كافيان لاستنساخ مستودع GIT، وإنشاء حاوية Docker، وبدء تشغيلها مباشرة. بعد ذلك يمكن الوصول إلى واجهة الويب على العنوان https://localhost:8000/. يرجى ملاحظة أنه بمجرد بدء الحاويات، ستبدأ وحدات الإدخال في إضافة عناوين URL إلى قائمة انتظار المعالجة وسيبدأ المحرك في الزحف إلى المضيفين.
git clone https://github.com/hpthreatresearch/subcrawl.git
docker-compose up --build
تُستخدم وحدات الإدخال فقط في وضع الخدمة. إذا تم بدء تشغيل SubCrawl باستخدام وضع التشغيل لمرة واحدة، فيجب توفير ملف يحتوي على عناوين URL المراد فحصها. تم تنفيذ وحدتي الإدخال التاليتين.
URLhaus هو خدمة ويب بارزة تتتبع عناوين URL الضارة. توفر خدمة الويب أيضًا صادرات تحتوي على عناوين URL جديدة تم اكتشافها. تعمل عناوين URL الخاصة بالبرامج الضارة هذه كمدخل مثالي للزاحف الخاص بنا لأننا نريد بشكل أساسي تحليل النطاقات الضارة. يتم استرداد عناوين URL المقدمة مؤخرًا ولا يتم تحسين نتائج البحث من خلال طلب API (أي من خلال العلامات أو المعلمات الأخرى المتاحة). يمكن تعديل طلب HTTP الذي تم إجراؤه في وحدة الإدخال هذه إلى URLHaus API لتحسين النتائج التي تم الحصول عليها.
PhishTank هو موقع ويب يجمع عناوين URL للتصيد الاحتيالي. لدى المستخدمين إمكانية تقديم صفحات تصيد جديدة تم العثور عليها. يمكن إنشاء تصدير يحتوي على عناوين URL نشطة للتصيد الاحتيالي وتنزيله من خدمة الويب هذه عبر API. لذا فهذه أيضًا مجموعة مثالية للزاحف الخاص بنا.
يأتي SubCrawl مع العديد من وحدات المعالجة. تتبع وحدات المعالجة جميعًا سلوكًا مشابهًا في كيفية تقديم النتائج مرة أخرى إلى المحرك الأساسي. إذا تم العثور على تطابقات، يتم إرجاع النتائج إلى المحرك الأساسي ثم توفيرها لاحقًا لوحدات التخزين. فيما يلي قائمة بوحدات المعالجة.
تُستخدم وحدة معالجة SDHash لحساب تجزئة التشابه لاستجابة HTTP. يجب أن لا يقل الحد الأدنى لحجم المحتوى عن 512 بايت ليتمكن من حساب التجزئة بنجاح. ربما تكون هذه هي وحدة المعالجة الأكثر تعقيدًا في التثبيت، لأنها تتطلب Protobuf واعتمادًا على المضيف الهدف يجب إعادة ترجمتها. لذلك يتم تعطيل وحدة المعالجة هذه افتراضيًا. يمكن العثور على نسخة مترجمة بالفعل في crawler/processing/minisdhash/ والتي تتطلب protobuf-2.5.0 و python3.6. تم تجميع هذه الملفات الثنائية على Ubuntu 18.04.5 LTS x64. اتبع تعليمات التثبيت:
# Protobuf installation
> apt-get update
> apt-get -y install libssl-dev libevent-pthreads-2.1-6 libomp-dev g++
> apt-get -y install autoconf automake libtool curl make g++ unzip
> wget https://github.com/protocolbuffers/protobuf/releases/download/v2.5.0/protobuf-2.5.0.zip
> unzip protobuf-2.5.0.zip
> cd protobuf-2.5.0
> ./configure
> make
> sudo make install
# Python3.6 installation
> apt-get install python3.6-dev
> sudo ldconfig
# SDHash installation
> git clone https://github.com/sdhash/sdhash.git
> cd sdhash
> make
> make install
> ldconfig
JARM هي أداة تقوم ببصمات اتصالات TLS تم تطويرها بواسطة Salesforce. تقوم وحدة معالجة JARM بمسح النطاق وإرجاع تجزئة JARM مع النطاق إلى المحرك الأساسي. اعتمادًا على تكوين خادم الويب، يكون لمصافحة TLS خصائص مختلفة. من خلال حساب تجزئة لسمات هذه المصافحة، يمكن استخدام هذه الاختلافات لتتبع تكوينات خادم الويب.
وحدة معالجة TLSH تشبه وحدة معالجة SDHash المستخدمة لحساب تجزئة التشابه. ميزة TLSH هي أن التثبيت أبسط بكثير وأن الحد الأدنى للإدخال أصغر وهو 50 بايت. نظرًا لأن معظم عمليات تسجيل الدخول إلى webshell صغيرة جدًا وكانت محور بحثنا، فقد قمنا بتنشيط وحدة المعالجة هذه افتراضيًا.
تُستخدم وحدة معالجة YARA لمسح محتوى استجابة HTTP باستخدام قواعد YARA. لاستدعاء وحدة المعالجة هذه، قدم القيمة YARAProcessing كوسيطة لوحدة المعالجة. على سبيل المثال، سيقوم الأمر التالي بتحميل وحدة معالجة YARA وإنتاج مخرجات إلى وحدة التحكم عبر وحدة تخزين ConsoleStorage.
python3 subcrawl.py -p YARAProcessing -s ConsoleStorage
حاليًا، تُستخدم وحدة معالجة YARA لتحديد عمليات تسجيل الدخول إلى webshell ومحتوى آخر مثير للاهتمام. قواعد YARA المضمنة في هذا المشروع:
مخرجات نموذجية:

لإضافة قواعد YARA إضافية، يمكنك إضافة ملفات .YAR إلى مجلد yara-rules، ثم تضمين ملف القاعدة عن طريق إضافة تعليمة include إلى combined-rules.yar.
تُستخدم وحدة معالجة ClamAV لمسح محتوى استجابة HTTP أثناء الفحص باستخدام ClamAV. إذا تم العثور على تطابق، يتم توفيره لوحدات الإخراج المختلفة. لاستدعاء وحدة المعالجة هذه، قدم القيمة ClamAVProcessing كوسيطة لوحدة المعالجة. على سبيل المثال، سيقوم الأمر التالي بتحميل وحدة معالجة ClamAV وإنتاج مخرجات إلى وحدة التحكم عبر وحدة تخزين ConsoleStorage.
python3 subcrawl.py -p ClamAVProcessing -s ConsoleStorage
مخرجات نموذجية:

لاستخدام هذه الوحدة، يجب تثبيت ClamAV. من الطرفية، قم بتثبيت ClamAV باستخدام مدير الحزم APT:
$ sudo apt-get install clamav-daemon clamav-freshclam clamav-unofficial-sigs
بمجرد التثبيت، يجب أن تكون خدمة تحديث ClamAV قيد التشغيل بالفعل. ومع ذلك، إذا كنت تريد التحديث يدويًا باستخدام freshclam، فتأكد من إيقاف الخدمة:
sudo systemctl stop clamav-freshclam.service
ثم قم بتشغيل freshclam يدويًا:
$ sudo freshclam
أخيرًا، تحقق من حالة خدمة ClamAV:
$ sudo systemctl status clamav-daemon.service
إذا كانت الخدمة لا تعمل، يمكنك استخدام systemctl لبدء تشغيلها:
$ sudo systemctl start clamav-daemon.service
تُستخدم وحدة معالجة Payload لتحديد محتوى استجابة HTTP باستخدام مكتبة libmagic. بالإضافة إلى ذلك، يمكن تكوين SubCrawl لحفظ المحتوى المثير للاهتمام، مثل ملفات PE أو الأرشيفات. لاستدعاء وحدة المعالجة هذه، قدم القيمة PayloadProcessing كوسيطة لوحدة المعالجة. على سبيل المثال، سيقوم الأمر التالي بتحميل وحدة معالجة Payload وإنتاج مخرجات إلى وحدة التحكم:
python3 subcrawl.py -p PayloadProcessing -s ConsoleStorage
لا توجد تبعيات إضافية لهذه الوحدة.
مخرجات نموذجية:

يتم استدعاء وحدات التخزين بواسطة محرك SubCrawl بعد فحص جميع عناوين URL من قائمة الانتظار. تم تصميمها بهدفين. أولاً، الحصول على نتائج الفحص فور الانتهاء من قائمة انتظار الفحص، وثانيًا تمكين التخزين والتحليل طويل الأمد. لذلك لم نقم فقط بتنفيذ وحدة ConsoleStorage ولكن أيضًا تكامل مع MISP ووحدة تخزين SQLite.
لتحليل النتائج بسرعة مباشرة بعد فحص عناوين URL، تتم طباعة إخراج منسق جيدًا إلى وحدة التحكم. هذا الإخراج هو الأنسب عند استخدام SubCrawl في وضع التشغيل لمرة واحدة. بينما كان هذا النهج يعمل بشكل جيد لفحص النطاقات الفردية أو إنشاء إخراج سريع، إلا أنه غير عملي للبحث والتحليل طويل الأمد.

التكامل مع كتلة Elastic متاح أيضًا. سيتم فهرسة كل عنوان URL مع بياناته كحدث، وسيشمل ذلك مخرجات من وحدات أخرى مثل Yara. تمت إضافة لوحة معلومات افتراضية أيضًا للمساعدة في البدء باستخدام هذه الوحدة. يجب إجراء تحديثات على قسم elasticsearch، وسيشمل ذلك:
لاستخدام وحدة الإخراج هذه، قدم القيمة ElasticStorage مع الوسيط -s.
نظرًا لأن تثبيت وتكوين MISP قد يستغرق وقتًا طويلاً، قمنا بتنفيذ وحدة أخرى تخزن البيانات في قاعدة بيانات SQLite. لعرض البيانات للمستخدم بأبسط وأوضح طريقة ممكنة، قمنا أيضًا بتطوير واجهة ويب بسيطة. باستخدام تطبيق الويب هذا، يمكن عرض النطاقات وعناوين URL الممسوحة ضوئيًا والبحث فيها بجميع سماتها. نظرًا لأن هذه نسخة مبكرة فقط، لم يتم تنفيذ ميزات المقارنة المعقدة بعد.

MISP هي منصة استخبارات تهديد مفتوحة المصدر مع نموذج بيانات وAPI مرن لتخزين وتحليل بيانات التهديدات. يخزن SubCrawl البيانات التي تم الزحف إليها في أحداث MISP، وينشر حدثًا واحدًا لكل نطاق ويضيف أي أدلة مفتوحة تم تحديدها كسمات. يسمح MISP أيضًا للمستخدمين بتحديد علامات للأحداث والسمات. هذا مفيد لمقارنة الأحداث وتحليل الروابط. نظرًا لأن هذا كان أحد أهدافنا البحثية الرئيسية، قمنا بإثراء البيانات من URLHaus عند تصدير مخرجات SubCrawl إلى MISP. يعلق URLHaus على بياناته باستخدام علامات يمكن استخدامها لتحديد عائلة برامج ضارة أو جهة تهديد مرتبطة بعنوان URL. لكل عنوان URL دليل مفتوح، تقوم الوحدة بالاستعلام عن بيانات URLHaus المخزنة محليًا وتضيف علامات URLHaus إلى حدث MISP إذا تطابقت. لتجنب وجود مجموعة من السمات غير ذات الصلة لكل حدث MISP، قمنا بإنشاء كائن MISP جديد لعناوين URL الممسوحة ضوئيًا، يسمى opendir-url. هذا يضمن بقاء السمات ذات الصلة معًا، مما يسهل الحصول على نظرة عامة على البيانات.

يتم توفير قوالب لوحدات المعالجة والتخزين كجزء من الإطار.
يمكن العثور على وحدات المعالجة ضمن crawler->processing وملف وحدة نموذجية example_processing.py موجود في هذا الدليل. يوفر القالب الوراثة والاستيراد اللازمين لضمان التنفيذ بواسطة الإطار. توفر الدالة init تهيئة الوحدة وتستقبل مثيلًا من المسجل والتكوين العام. يُستخدم المسجل لتوفير معلومات التسجيل من وحدات المعالجة، وكذلك في جميع أنحاء الإطار.
يتم تنفيذ الدالة process لمعالجة كل استجابة HTTP. لهذا الغرض، تستقبل عنوان URL ومحتوى الاستجابة الخام. هذا هو مكان تنفيذ عمل الوحدة. يجب أن تعيد هذه الدالة قاموسًا بالحقول التالية:
يجب تحديد اسم فئة فريد ويستخدم لتعريف هذه الوحدة عند تضمينها عبر الوسيط -p أو كوحدة معالجة افتراضية في ملف التكوين.
أخيرًا، أضف تعليمة استيراد في __init__.py، باستخدام اسم فئتك:
from .<REPLACE>_processing import <REPLACE>Processing
يمكن العثور على وحدات التخزين ضمن crawler->storage وملف وحدة نموذجية example_storage.py موجود في هذا الدليل. على غرار وحدات المعالجة، توفر الدالة init تهيئة الوحدة وتستقبل مثيلًا من المسجل والتكوين العام. تستقبل الدالة store_results بيانات منظمة من المحرك على فترات زمنية يحددها حجم الدفعة في ملف التكوين.
يجب تحديد اسم فئة فريد ويستخدم لتحميل الوحدة عند تضمينها عبر الوسيط -s أو كوحدة معالجة افتراضية في ملف التكوين.
2021:
SubCrawl مرخص بموجب ترخيص MIT