
يعمل IPSpinner كوكيل محلي يعيد توجيه الطلبات عبر خدمات خارجية.
IPSpinner هو وكيل محلي يمكن استخدامه لإعادة توجيه جميع الطلبات الواردة عبر موفّرين مختلفين يتم اختيارهم. الغرض هو إنشاء وكيل عبور يقوم بتدوير عنوان IP المصدر لكل طلب. على سبيل المثال، تشغيل عملية تخمين عنيفة (bruteforce) عبر IPSpinner سيساعد في تجنب اكتشافك لأن الخادم سيستقبل الطلبات من مئات عناوين IP المختلفة.
يدعم IPSpinner حاليًا AWS (API Gateway) وAzure (Cloud Shell) وGitHub (GitHub Actions).
الشكل 1: IPSpinner - المخطط العام
يعمل IPSpinner كوسيط محلي يعيد توجيه الطلبات عبر خدمات خارجية. ولتحقيق هذه الغاية، يستعين IPSpinner بالموفّرين والمُطلقات (launchers).
الموفّر (provider) هو موفّر سحابي أو موفّر خدمات عبر الإنترنت (AWS، Azure، GitHub، إلخ)، يقدّم خدمات مختلفة تُسمّى المُطلقات (launchers)، يمكن استخدامها لتوصيل طلبات المستخدم (AWS API Gateway، GitHub Actions، Azure Cloud Shells، إلخ).
وبالتالي، لتشغيل IPSpinner، سيتعين على المستخدم تقديم بيانات اعتماد للموفّرين الذين يريد استخدامها وإعدادات إضافية للمُطلقات. يمكن استخدام أنواع متعددة من المُطلقات في نفس الوقت، وسيختار IPSpinner عشوائيًا واحدًا من المتاح منها لكل طلب.
علاوة على ذلك، يوفّر IPSpinner ميزة التحميل المسبق (preload). يمكن تحميل بعض المُطلقات مسبقًا لتجنب تأخير إعادة الإعداد في حال ظهور مضيف جديد عبر الوسيط. بالنسبة لهذه المُطلقات، يُنصح بالتحميل المسبق لكنه ليس إلزاميًا. أما بالنسبة للباقي، فلا حاجة إلى التحميل المسبق.
يمكن لـ IPSpinner الاستفادة من AWS API Gateway لإرسال الطلبات. يعتمد هذا التنفيذ على FireProx، الذي ينشئ REST API Gateway لإعادة توجيه الطلبات الواردة. ولذلك تم تكييف FireProx للتعامل مع عدة مضيفات لكل API Gateway وتنفيذ ميزات جديدة. باختصار، عندما يستقبل IPSpinner طلبًا، فإنه يختار أو ينشئ مثيل API Gateway المناسب ويوجّه الطلب إليه. ثم يجمع الاستجابة ويعيدها إلى المستخدم. وبذلك، يكون الخادم المستهدف قد استلم الطلب من API Gateway وليس مباشرة من المستخدم. وبما أن API Gateway يدوّر عنوان IP الصادر الخاص به لكل طلب، يستخدم IPSpinner هذه الميزة لتدوير عنوان IP.
الشكل 2: AWS API Gateway - المخطط العام
يوضح الرسم البياني التالي، الذي أُعد في أكتوبر 2024، عدد عناوين IP الفريدة المتاحة لكل منطقة من مناطق AWS وفقًا لعدد الطلبات المرسلة. معظم المناطق توفّر أكثر من 100 عنوان IP، ويمكن استخدام مناطق متعددة في نفس الوقت، مما يسمح للمستخدم بتمرير طلباته عبر آلاف العناوين حول العالم.
الشكل 3: AWS API Gateway - عناوين IP المتاحة لكل منطقة
أخيرًا، يوضح الشكل 4، بمستوى لون أخضر لوغاريتمي، عدد العناوين المتاحة لكل دولة. ويُظهر أن المستخدم لديه إمكانية تزييف عنوان IP المصدر الخاص به باستخدام عناوين من أي قارة.
الشكل 4: AWS API Gateway - عناوين IP لكل دولة
ينفّذ IPSpinner ميزة التدوير التي تحذف وتجدّد مثيلات FireProx التي تم إنشاؤها بانتظام. وكما يوضح الرسم البياني التالي، فإن تدوير مثيل FireProx قد يوفّر مجموعة فرعية جديدة من عناوين IP. ومع ذلك، تمتلك كل منطقة AWS مجموعة محدودة من عناوين IP، وبالتالي في نقطة ما لن يوفر التدوير عناوين IP جديدة.
الشكل 5: AWS API Gateway - عملية التدوير
ينفّذ هذا المُطلق إجراء التحميل المسبق. وكما ذُكر سابقًا، فهو ليس إلزاميًا، لكنه يمكن أن يمنع بعض تأخيرات إعادة الإعداد أو أخطاء المزامنة خلال الثواني الأولى بعد إعادة الإعداد.
بالإضافة إلى ذلك، تضبط API Gateways افتراضيًا ترويسة X-Forwarded-For، التي لا يمكن حذفها ولكن يمكن تجاوزها. وبالتالي، يمكن للمستخدم تحديد نطاق عناوين IP في إعدادات IPSpinner، ومنه سيتم اختيار عنوان IP عشوائي لكل طلب (نطاق IPv4 أو IPv6).
يستعين IPSpinner بـ Azure Cloud Shell لإرسال الطلبات. إن Azure Cloud Shell هو طرفية تفاعلية موثّقة ويمكن الوصول إليها عبر المتصفح لإدارة موارد Azure. يعمل Cloud Shell على مضيف مؤقت يُوفَّر لكل جلسة ولكل مستخدم.
وبالتالي، يستخدم IPSpinner عدة مستخدمين من Azure يتم تجهيز جلسة Cloud Shell لكل منهم. بعد ذلك، ستتم إعادة توجيه كل طلب إلى Cloud Shell تمت تهيئته، ثم يتم تجديده لإعادة تعيين عنوان IP الخاص به.
الشكل 6: Azure Cloud Shell - المخطط العام
كما يوضح الرسم البياني التالي، توفّر المناطق المختلفة المتاحة لنشر جلسات Cloud Shell العشرات من عناوين IP لكل منها. يمكن للمستخدم تكوين مناطق متعددة في نفس الوقت لزيادة مجموعة عناوين IP المتاحة لديه.
الشكل 7: Azure Cloud Shell - عناوين IP المتاحة لكل منطقة
ومع ذلك، فإن عناوين IP أكثر تركزًا مقارنة بـ AWS API Gateway. وكما توضح الخريطة التالية، يقع معظمها في الولايات المتحدة وأوروبا والهند.
الشكل 8: Azure Cloud Shell - عناوين IP لكل دولة
نظرًا لتأخير عملية تجديد Cloud Shell، ننصح بتقييد معدل تدفق الطلبات. مزيد من المعلومات في القسم الفرعي مقارنة المُطلقات.
يمكن لـ IPSpinner أيضًا الاستفادة من GitHub Actions لإرسال الطلبات. هذا التنفيذ مستوحى من git-rotate ولكنه عُدّل بالكامل وجرى تكييفه للتخلص من خادم الالتقاط (catcher server).
ينشئ مستودعًا بقالب سير عمل (workflow) محدد مسبقًا. بعد ذلك، لكل طلب، يشغّل سير العمل عبر تمرير معلومات الطلب من خلال متغيرات البيئة. جميع البيانات مشفرة لتجنب إمكانية قراءتها من قبل مستخدم خارجي. أخيرًا، يجمع IPSpinner بيانات الاستجابة من سجلات سير العمل.
الشكل 9: GitHub Actions - المخطط العام
يوضح الشكل التالي أن GitHub Actions توفّر آلافًا من عناوين IP المختلفة.
الشكل 10: GitHub Actions - عناوين IP المتاحة لكل منطقة
ومع ذلك، توضح الخريطة التالية أن GitHub Actions توفّر عناوين IP أمريكية فقط. وبعد التحليل، يبدو أن العمال (workers) التابعين لها منشورون على بنية تحتية من Azure.
الشكل 11: GitHub Actions - عناوين IP لكل دولة
⚠️ علاوة على ذلك، "تأخذ GitHub مسألة إساءة استخدام Actions والبريد العشوائي على محمل الجد، ولديهم فريق مخصص لتتبع «المستخدمين المزعجين»." وبالتالي، يجب على المستخدم ألا يستخدم هذا الموفّر مع حسابه الشخصي أو حساب الشركة لتجنب أي مشكلة إغلاق للحساب.
نظرًا لحدود GitHub REST API لكل ساعة، يجب تحديد الحد الأقصى لمعدل تدفق الطلبات لتجنب أي انقطاع. مزيد من المعلومات في القسم الفرعي مقارنة المُطلقات.
تم اختبار هذا المشروع مع إصدار go >= 1.21، لكنه قد يعمل مع إصدارات أقل.
انظر وثائق تثبيت Go
بعد التثبيت، تأكد من أن ملف go الثنائي الافتراضي هو الصحيح:
$ go version
go version go1.21.1 linux/amd64
$ git clone https://github.com/synacktiv/IPSpinner.git
$ cd IPSpinner
$ go mod tidy
$ make build-linux # For Linux AMD64 arch
$ make build-windows # For Windows AMD64 arch
سيُطلق على الملف التنفيذي اسم "ipspinner" افتراضيًا على Linux أو "ipspinner.exe" على Windows.
في نهاية الاستخدام، يمكنك تنظيف ملفات البناء بتشغيل
$ make clean
للحصول على مساعدة حول استخدام IPSpinner، يمكنك تشغيل الأمر بدون أي وسيط:
$ ./ipspinner -h
Help will be displayed
جميع المعلومات (باستثناء عمليات إعادة توجيه الطلبات) تُسجَّل في ملف ipspinner.log.
بعض الخيارات الشائعة متاحة كوسائط، بينما يجب تقديم معلومات الإعداد الأخرى في ملف إعدادات بصيغة INI.
يمكن للمستخدم تحديد بعض وسائط سطر الأوامر:
يجب تحديد بعض المعاملات العامة ومعاملات الموفّرين في ملف إعدادات INI. يجب تجهيز ملف الإعدادات قبل تشغيل IPSpinner. سيتم شرح محتواه في الأقسام الفرعية التالية. افتراضيًا، يبحث IPSpinner عن ملف إعدادات باسم config.ini.
للتعامل مع طلبات https، يحتاج IPSpinner إلى شهادة من جهة تصديق (CA) ومفتاح. إذا لم يقدم المستخدم شهادة، فسيقوم IPSpinner بتوليد شهادة ومفتاح ذاتيين التوقيع خاصين به. يمكن للمستخدم طلب استرجاع الشهادة المولّدة باستخدام --export-ca-cert (مثل: لاستيرادها إلى المتصفح). بخلاف ذلك، يمكن للمستخدم توفير شهادة CA ومفتاح خاصين به في ملف الإعدادات (انظر الأجزاء التالية).
يمكن للمستخدم تحديد المضيف والمنفذ للاستماع باستخدام --host و --port.
أخيرًا، تتوفر ثلاثة أوضاع للمخرجات المفصلة (verbose):
بعد ذلك، يتوفر قالب لـ ملف إعدادات INI في مستودع المشروع.
في قسم proxy، يمكن للمستخدم تحديد بعض المعاملات:
جميع الأقسام الأخرى سيتم وصفها في الفصل الخاص بالموفّر المقابل.
من المهم ملاحظة أنه يمكن للمستخدم تفعيل عدة موفّرين ومُطلقات في نفس الوقت. سيقوم IPSpinner بعد ذلك باختيار مُطلق عشوائي من بين جميع المُطلقات المتاحة لكل طلب.
معاملات إعداد AWS، في قسم aws:
معاملات إعداد API Gateways، في قسم aws:
معاملات إعداد Azure، في قسم azure:
معاملات إعداد Azure Cloud Shell، في قسم azure:
معاملات إعداد GitHub، في قسم github:
| Parameter | Mandatory | Default value | Description |
|---|---|---|---|
| username | ✅ | اسم مستخدم GitHub | |
| token | ✅ | رمز GitHub المرتبط باسم المستخدم المقدم |
معاملات إعداد GitHub Actions، في قسم github:
| Parameter | Mandatory (if ga_enabled=true) | Default value | Description |
|---|---|---|---|
| ga_enabled | / | تفعيل مُطلق GitHub Actions |
لا يدعم IPSpinner بروتوكول HTTP/2. نظرًا لأن الوسيط ينهي اتصال TLS الأول، تُفقد مزايا البروتوكول ويظهر كاتصال HTTP/1.1 أساسي.
وبالتالي، لتجنب مشكلات HTTP/2 عند استخدام IPSpinner مع Burp Suite، يرجى إزالة دعم عميل HTTP/2: Settings > Network > HTTP > HTTP/2 > قم بإلغاء تحديد خانة HTTP/2.
| AWS API Gateway | Azure Cloud Shell | GitHub Actions |
|---|
| عناوين IP المتاحة | ≈ 12,418 | ≈ 276 | > 6,000 |
| متوسط زمن الاستجابة | 0.46s | 13.04s | 21.42s |
| متوسط زمن إعادة الإعداد | لا يوجد | 20s | لا يوجد |
| أقصى معدل تدفق نظري | 4,000 to 16,000 req/h | 107 req/h/cloud shell instance | 1,000 req/h |
| هل يمكن/يلزم التحميل المسبق؟ | ✅ | ❌ | ❌ |
| الاستخدام: تصفح | ✅ | ❌ | ❌ |
| الاستخدام: رش كلمات المرور (password spraying) | ✅ | ✅ | ✅ |
| Parameter | Mandatory | Default value |
|---|
| --config | ❌ | config.ini |
| --export-ca-cert | ❌ | |
| --host | ❌ | |
| --port | ❌ | 8080 |
| --v, --vv, --vvv | ❌ |
| Parameter | Mandatory | Default value | Description |
|---|
| preload_hosts_file | ❌ | قائمة بعناوين URLs/المضيفات للتحميل المسبق، وذلك للموفّرين الذين يدعمون تحميل المضيفات مسبقًا | |
| whitelist_hosts_file | ❌ | قائمة بعناوين URLs/المضيفات المسموح بها (جميع العناصر الأخرى ستُدرج في القائمة السوداء افتراضيًا) | |
| blacklist_hosts_file | ❌ | قائمة بعناوين URLs/المضيفات المدرجة في القائمة السوداء (تُتجاهل إذا تم تعيين القائمة البيضاء) | |
| ca_cert_file & ca_cert_key_file | ❌ | شهادة CA مقدمة من المستخدم (إذا أراد المستخدم استبدال الشهادة الافتراضية المولّدة) | |
| user_agents_file | ❌ | قائمة بوكلاء المستخدم (user agents) التي سيتم اختيارها عشوائيًا للطلبات | |
| debug_response_headers | ❌ | false | يضيف ترويستي تصحيح في استجابات الوسيط: X-IPSpinner-Provider و X-IPSpinner-Provider-NbTotalReqSent |
| wait_for_launcher_available_timeout | ❌ | 60 | عدد الثواني قبل انتهاء مهلة الطلب إذا لم يتوفر أي مُطلق |
| Parameter | Mandatory | Default value | Description |
|---|
| regions | ✅ | قائمة بالمناطق، مفصولة بفاصلة، حيث يمكن نشر الموارد | |
| profile | ❌ | ملف تعريف AWS CLI لاستخدامه | |
| access_key | ✅ (or profile) | مفتاح وصول مستخدم AWS | |
| secret_key | ✅ (or profile) | مفتاح سرّي لمستخدم AWS | |
| session_token | ❌ | رمز جلسة مستخدم AWS |
| Parameter | Mandatory (if ag_enabled=true) | Default value | Description |
|---|
| ag_enabled | / | تفعيل مُطلق API Gateway | |
| ag_max_instances | ❌ | 5 | الحد الأقصى لمثيلات API Gateway التي يمكن نشرها (الحد الأقصى الإجمالي، وليس لكل منطقة) |
| ag_rotate_nb_requests | ❌ | 5,000 | عدد الطلبات قبل تدوير API Gateway |
| ag_forwarded_for_range | ❌ | 35.180.0.0/16 | نطاق عناوين IP لترويسة X-Forwarded-For (نطاق IPv4 أو IPv6) |
| ag_instance_title_prefix | ❌ | fpr | تخصيص معلومات API Gateway |
| ag_instance_deployment_description | ❌ | IPSpinner FireProx Prod | تخصيص معلومات API Gateway |
| ag_instance_deployment_stage_description | ❌ | IPSpinner FireProx Prod Stage | تخصيص معلومات API Gateway |
| ag_instance_deployment_stage_name | ❌ | 3 random english words | تخصيص معلومات API Gateway |
| Parameter | Mandatory | Default value | Description |
|---|
| admin_email | ✅ (or accounts_file) | البريد الإلكتروني لمسؤول Azure | |
| admin_password | ✅ (or accounts_file) | كلمة مرور مسؤول Azure | |
| tenant_id | ✅ | معرّف المستأجر (Tenant ID) | |
| subscription_id | ✅ | معرّف الاشتراك | |
| accounts_file | ❌ | قائمة بالحسابات المنشأة مسبقًا (البريد الإلكتروني وكلمة المرور، معلومة واحدة في كل سطر) والتي تتجاوز admin_email و admin_password |
| Parameter | Mandatory (if cs_enabled=true) | Default value | Description |
|---|
| cs_enabled | / | تفعيل مُطلق Cloud Shell | |
| cs_preferred_locations | ✅ | المواقع المفضلة لنشر مثيلات Cloud Shell | |
| cs_nb_instances | ❌ | 5 | عدد مثيلات Cloud Shell التي سيتم نشرها |