إطار عمل C2 قائم على السحب مع عشرة ناقلات أصلية، ومعالجات متعددة الملفات الشخصية متزامنة، وتكليفات موقّعة بـ ECDSA، وخادم فريق متعدد المشغلين مع RBAC ووحدات تحكم Qt/CLI.
أداة C2 قائمة على السحب (pull-based) بعشرة ناقلات أصلية، ومعالجات متعددة الملفات الشخصية متزامنة، ونموذج تهديد صريح. الوكيل عبارة عن ملف تنفيذي واحد بلغة Go مع تضمين كل خصائصه السلوكية في وقت البناء — لا ملف تهيئة وقت التشغيل، ولا متغير بيئة، ولا وسائط سطر أوامر. تُوقَّع المهام والنتائج بتوقيع ECDSA من الطرف إلى الطرف. الناقلات هي HTTPS، وQUIC/HTTP/3، وWebSocket، وDNS TXT، وDNS-over-HTTPS، وICMP، وWireGuard، وSMB-pivot، وTCP-bind، وTCP-reverse.
استخدم هذا البرنامج فقط على الأنظمة التي تملكها أو على الأنظمة التي تحمل تفويضًا كتابيًا صريحًا بشأنها. أنت وحدك المسؤول عن الامتثال للقوانين المعمول بها والسياسات التنظيمية. لا يتحمل المؤلفون والمساهمون أي مسؤولية عن سوء الاستخدام أو فقدان البيانات أو العواقب القانونية الناشئة عن استخدام هذا المشروع.
TornadoC2 هو C2 قائم على السحب. لا يحتفظ الوكيل بمقبس حيّ؛ بل يستيقظ وفق جدوله الخاص، ويتحقق مع الخادم، ويسترد الأعمال المصفوفة في قائمة الانتظار، وينفذها، ثم يعود إلى النوم. يقوم المشغّل بصف الأوامر في قائمة الانتظار؛ ويلتقطها البيكون عند تحققه التالي.
يضحي هذا التصميم بالفورية مقابل المرونة. تموت الصدفة الحية عندما تتذبذب الشبكة؛ أما المنارة فت reconnect عند استيقاظها التالي وتستأنف. تترك الصدفة الحية أثرًا دائمًا على الشبكة؛ أما نمط حركة المنارة فيحدده فاصل نومها. صُمم الإطار لعمليات طويلة الأمد حيث يجب أن تنجو الحمولة من إعادة التشغيل، وتعيد المحاولة عند الفشل، وتدمّر نفسها وفق جدول زمني.
الحمولة عبارة عن ملف Go ثنائي واحد، يُترجم تبادليًا من جهاز المشغّل. لا يوجد ملف تهيئة وقت التشغيل، ولا متغير بيئة، ولا مفتاح سجل. عنوان URL للاستدعاء، وفاصل النوم، وتاريخ الإنهاء، وملف C2، ومجموعة التهرب — كلها مدمجة في وقت البناء. يحتوي الملف الثنائي المُلتقط على كل ما يحتاجه للتشغيل، ولا شيء لم يضعه المشغّل هناك.
يُترجم الإطار حاليًا لأنظمة Linux وWindows، على معماريتي amd64 وarm64. دعم macOS على القائمة القريبة، إلى جانب أوامر أصلية إضافية وأوليات تهرب إضافية. يسرد ملخص القدرات أدناه ما هو متاح في الإصدار الحالي.
وحدة تحكم مشغّل PySide6. جدول المنارة في الأعلى، والسجل والدردشة في الأسفل، وشريط أوامر واحد لكليهما. الطرفية REPL هي التنفيذ المرجعي؛ وواجهة المستخدم الرسومية طبقة عرض فوق نفس طرق Client.
استخدمت Sliver لمدة عام. إنها أداة جيدة — ويجب قول ذلك قبل أي شيء آخر، لأن ما يلي ليس انتقادًا لها. كانت المشكلة أنني لم أستطع تغيير شكل الوكيل. تبدو منارة Sliver كمنارة Sliver: بصمة واحدة، وجدول استقصاء واحد، وعائلة بروتوكول واحدة، وتهيئة وقت تشغيل واحدة تستقر على القرص. كان بإمكاني توجيهها إلى عنوان URL مختلف. لم أستطع جعلها شيئًا آخر. تلك هي المقايضة الصحيحة للعمليات التي يكون فيها الشكل العام كافيًا. كانت المقايضة الخاطئة للشبكات التي كنت أعمل عليها.
جرّبت Mythic. الوحداتية حقيقية والعمل المجتمعي وراءها مثير للإعجاب. لم أستطع العمل فيها. كانت كل تفاعلاتي تمر عبر تبويب متصفح. أقضي ثماني ساعات يوميًا في طرفية، ولم تكن الأداة في الطرفية. توقفت بعد أسبوع.
نظرت إلى Cobalt Strike وBrute Ratel. كلتاهما ممتازتان وكلتاهما مسعّرة للفرق والمؤسسات. أنا شخص واحد. ليس لدي ميزانية فريق.
كانت الأدوات الموجودة جيدة في أشياء لم أكن بحاجة إليها. لم تكن الميزات التي تمتلكها هي الميزات التي كنت أبحث عنها، ولم تكن تلك التي كنت أبحث عنها في أي منها. كنت بحاجة إلى وكيل يمكن أن يتخذ شكلًا محددًا لهدف محدد، وطرفية تبقى قريبة من يدي، ومعالج حيث لا يؤدي تدوير ملف تعريف في منتصف العملية إلى قتل كل الجلسات الحية. أردت أيضًا أن يُعامل الجانب الخاص بالمشغّل كجزء حقيقي من الإطار — ليس أداة تضع الوكيل أولًا مع طبقة تنسيق تُضاف لاحقًا، بل خادم فريق يمكن لمجموعة من المشغّلين أن يديروا عليه عملية فعليًا، بالأدوار، وسجل التدقيق، والحالة المشتركة التي يتطلبها العمل الاحترافي.
كان الرد المعقول هو بناء واحد.
خيارات التصميم في هذا الإطار هي نتائج ذلك القرار، وليست تفضيلات مستقلة.
تهيئة وقت الترجمة. كل خاصية مدمجة في الملف الثنائي في وقت البناء. لا ملف تهيئة، ولا متغير بيئة، ولا وسيط سطر أوامر. المدافع الذي يلتقط الوكيل لا يمكنه قراءة تهيئة وتغيير الاستدعاء إلى حفرة امتصاص. المشغّل الذي يفقد أثر الملف الثنائي لا يمكن أن تنحرف تهيئته. الوكيل الجديد لهدف جديد هو أثر لعملية واحدة ولا غيرها.