محمد حسن پزشکیان
عاشق امنیت و نفوذ ، رد تیم و دوستدار بزن بکش :)

تفاوت بین WebShell - ShellCode - ShellShock - ShellBag چیست؟

در این مطلب میخواییم تعاریف 4 تا واژه Shell Bag ، Shell Code ، Shell Shock  و Web Shell رو بگیم و بعدش تفاوتاشونو بررسی کنیم

دوره های شبکه، برنامه نویسی، مجازی سازی، امنیت، نفوذ و ... با برترین های ایران

اول از همه ، شل یا Shell یعنی پوسته ، یعنی ارتباط دهنده بین سطح خارجی با هسته با Kernel (به عنوان مثال پوست بدن شما ارتباط بین دنیای خارجیه و گوشت و استخون شما)

منظور از Web Shell چیست ؟

وب شل یا شل سمت وب ، یه اسکریپتیه که روی وب سرور آپلود میشه تا ما دسترسی بگیریم به سرور و بتونیم روی سرور کنترل داشته باشیم ، درواقع وب شل یه فایلی که به زبان اون وب اپلیکیشن نوشته شده ( PHP , ASP و..) و وقتی اون فایل روی سرور آپلود میشه و ما اون فایلو فراخوانی میکنیم ، میتونیم به فایل های سرور دسترسی داشته باشیم ، و نسبت به سطح دسترسی هایی که داریم ، دیگه هر کاری بکنیم :)

سروری که ما روش شل میریزیم ، میتونه روبه اینترنت باشه یا روبه شبکه داخلی ، با وب شل حتی میشه عملیات Pivoting رو انجام داد و از طریق سرور آلوده به وب شل به شبکه نفوذ کرد و به دستگاه های دیگه ای که توی شبکه داخلی هم وجود دارن نفوذ کرد

از چه طریق هایی میتوان وب شل ریخت ؟ از هر آسیب پذیری ای که بتونیم روی سرور فایل آپلود کنیم (LFI , RFI , SQLi , XSS و ..)

حالا یه سری نکات درباره وب شل ها ، که اگر بدونید بد نیست :

سطح دسترسی وب شل ما به سطح دسترسی چند چیز بستگی داره :

  1. سطح دسترسی اون Directory ای که توش فایل وب شل آپلود میشه
  2. سطح دسترسی خود آپلودر
  3. سطح دسترسی ای که خود آپلودر بهت میده

(موارد دیگه ای هم در سطح دسترسی فایل وب شما دخیله ولی این 3 تا مهم ترین ها هستن ) در کل سطح دسترسی 644 - 755 خوبه ، و میشه مانور داد

نکته : ما در مباحث پیشرفته بحث بایپس سطوح دسترسی رو هم داریم و اینکه کامل نشه کاری کرد برای افراد حرفه ای خیلی مطرح نیست

حالت اجرای وب شل هم خیلی مهمه ، وقتی فایلی روی سایت آپلود میشه در کل 3 تا حالت ممکنه براش اتفاق بیفته ( وب سرور اون فایلو بخونه ، وب سرور اون فایلو اجرا کنه (Run کنه) و وب سرور اون فایلو بزاره برای دانلود)

در حالت عادی فایلی که آپلود میشه باید ران بشه ، منتها میشه برای وب سرور میشه تعریف کرد که توی یه مسیر خاص اگر فایلی آپلود شد ران نکنه و فقط بخونه ، یا اینکه WAF اجازه اجرای فایل رو نده ، یا در نهایت نه اجازه خوندن بدی نه اجرا شدن ، پس فقط اجازه دانلود شدن بدی

نکته : وقتی که ما وب شل رو آپلود کردیم ، ممکنه WAF اونو بشناسه و مانع اجراش بشه پس واسه اینکه WAF نتونه وب شل مارو بشناسه ما میتونیم اونو Obfuscate یا مبهم سازیش کنیم که در مباحث پیشرفته امنیت مطرحه

اینجا هم تصویر نمونه از یک وب شل رو میتونید ببینید :

تفاوت بین WebShell - ShellCode - ShellShock - ShellBag چیست؟

منظور از Shell Bag چیست ؟

شل بگز ها یا (کیف های پوست 😂) یه دسته از کلید های ریجستری در ویندوز هستن که در NTUser.dat و USRClass.dat قرار دارن که حتی وضعیت View ، ایکون ها ، موقعیت و سایز فولدر هارو وقتی دارید از Windows Explorer استفاده میکنید در خودشون نگه میدارن

تمام جابجایی بین دایرکتوری ها (Directory Traversal) در ویندوز در ریجستری نگه داری میشه ، پس فهمیدید دلیل اهمیت Shell Bag ها چیه ؟ میتونید از فعالیت یوزر رو در حین استفاده از ویندوز با این ریجستری ها مطلع بشید

ارزش هایی که Shell Bag ها برای فارنزیک کار ها دارن :

  • اطلاعات از دایرکتوری های اصلی و فایلاشون و اسم و مشخصات دستگاه های فیزیکی ای که این دیتا هارو توشون داشتن میمونه حتی اگر از سیستم حذف بشن (چه دستگاه فیزیکی جدا بشه چه تمام دیتاها پاک بشن) (خود فایل نه ، Metadata)
  • میشه بعنوان History ازش استفاده کرد ، تمام اسم و متادیتای فایل هایی که روی سیستم بوده توشون هست حتی اگر فایل ها پاک شده باشن
  • حتی آیتم هایی که توی دسکتاپ بودن ، پنل های کنترل پنل ، اسامی و حروف درایو ها ، یا اسامی دایرکتوری ها ..
  • میشه فعالیت های مهاجمی رو ردگیری و ردیابی کرد ، اگر مثلا مهاجم حتی از RDP یا سایر ابزار های اتصال از راه دور استفاده کرده باشه ، یا با Windows Explorer فایلی رو جابجا کرده باشه ( ARE = Add,Remove,Edit) ، یا از طریق شبکه متصل شده باشه به کامپیوتر و...

مسیری هم که این Shell Bag ها قرار دارن در ویندوز ویستا به بالا :

  • HKCU\Software\Microsoft\Windows\Shell\Bags
  • HKCU\Software\Microsoft\Windows\Shell\BagMRU(ntuser.dat)
  • HKCU\Software\Microsoft\Windows\ShellNoRoam\Bags
  • HKCU\Software\Classes\LocalSettings\Software\Microsoft\Windows\Shell\BagMRU
  • HKCU\Software\Classes\LocalSettings\Software\Microsoft\Windows\Shell\Bags

و فرمت این فایل های Shell Bag هم باینری هست (در قالب Hex یا مبنای 16 نمایش داده میشن برای فهم بیشتر) ، بعضی از Shell Bag ها هم استرینگ دارن ( چه در فرمت Unicode چه ANSI )

فک کنم تا همینجا کافی باشه ، واسه درک بیشتر یه تصویر میزارم که یه دیدی از کیف های پوستی داشته باشید :

تفاوت بین WebShell - ShellCode - ShellShock - ShellBag چیست؟

منظور از Shell Code چیست ؟

شل کد یه قطعه کده که به عنوان پیلود برای اکسپلویت کردن برنامه ها استفاده میشه ، وقتی که یه مهاجم یه آسیب پذیری از یه برنامه پیدا کرد ، اولین هدفش اینه که یه کدی به اون برنامه تزریق کنه که برنامه رو وادار کنه اونطوری که میخواد رفتار کنه (شل کد رو تزریق کنه) ; و وقتی شل کد با موفقیت تزریق شد ریجستر EIP طوری تنظیم میشه که به شل کد اشاره کنه ، پس در اینجا شل کد بدون محدودیت اجرا میشه (البته ریجستر EIP تنها راه اجرای شل کد نیست و راه های دیگه ای هم هست مثل اجرای شل کد در حالت SEH که توضیح مفصلی داره و از اهداف این مقایسه خارجه)

در واقع اگر بخوام دوباره شل کد رو تعریف کنم میتونم بگم دستورالعمل هایی (Instructions) که مخرب هستن و تزریق میشن به یه نرم افزار اسیب پذیر ، و وقتی نرم افزار اسیب پذیر اجراشون میکنه ما به هدفامون میرسیم ، این هدفارو جلوتر توضیح میدم (دلیل اینکه شل کد باید به زبان سطح پایین نوشته بشه خیلی مفصله ولی اینو بدونید که اگر به زبان سطح بالا نوشته بشه در زمان اجرا ممکنه به مشکل بر بخوریم و شل کد کامل با موفقیت اجرا نشه)

شل کد به دو طریق میتونه کار کنه : از طریق شبکه ارسال بشه یا از طریق متغییر های بومی (Environment Variables)

به صورت خلاصه ما دو نوع شل کد داریم : Remote Shell Code و Local Shell Code :

Local Shell Code : برای اکسپلویت کردن یه روند (Process) محلی (Local) استفاده میشه که هدفش افزایش سطح دسترسیه ( منظور اکسپلویت کردن یه پردازش روی سیستم خودمونه) (این فرایند همچنین Privilege Escalation Shell codes هم شناخته میشه و در فرایند LCE استفاده میشه (Local Code Execution))

Remote Shell Code : از طریق شبکه ارسال میشه همراه اکسپلویت ، اکسپلویت میاد و فرایند تزریق شل کد رو به پراسس انجام میده و اونو اجرا میکنه (یه اسم دیگه این نوع اکسپلویت کردن RCE یا Remote Code Execution هست)

هدف این شل کد اینه که دسترسی بده به مهاجم از راه دور به مهاجم ، توسط پروتوکل های معمول مثل TCP

Remote Shell Code ها بر اساس نوع ارتباطی که برقرار میکنن به سه دسته تقسیم میشن :

  • Connect Back : این نوع شل کد وقتی اجرا بشه روی سیستم قربانی، میاد و به سیستم مهاجم وصل میشه (کامپیوتر قربانی وصل میشه به سیستم مهاجم(مثل Reverse_tcp در متااسپلویت))
  • Bind Shell : (اصطلاح Bind یا بایند یا Wrap میشه چسبوندن یچیزی به یه چیزی) این نوع شل کد میاد و شل رو بایند میکنه به یه پورت خاص (در سیستم قربانی) که مهاجم باهاش میتونه وصل بشه
  • Socket Reuse : این نوع شل کد میاد و یه اتصال ایجاد میکنه با یه پردازش (Process) آسیب پذیر در سیستم قربانی که این اتصال بسته نمیشه تا زمانی که شل کد اجرا شده باشه و شل کد بعدا میتونه مجددا استفاده کنه از اتصال و ارتباط با سیستم قربانی ، ولی چون این روش یکم سخته معمولا استفاده نمیشه
  • Staged : برای زمانیست که سایز شل کد ما خیلی بزرگتر از سایزیه که مهاجم در اختیار داره برای تزریق به برنامه
  • و...

برای درک بیشتر این عکس رو ببینید ، در ساده ترین حالت ما یه برنامه به زبان c داریم که اسیب پذیره و ما از این برنامه استفاده میکنیم واسه اینکه ببینیم ایا شل کد ما اجرا میشه یا نه ، همونطور که میبینید ما شل کد رو داخل کد c میزاریم و کامپایلش میکنیم و وقتی اجراش میکنیم ، ماشین حساب ویندوز کرش میکنه (این برنامه صرفا جهت تست نوشته شده و فرایند Shell Code Injection کلا فرایند جداییه)

تفاوت بین WebShell - ShellCode - ShellShock - ShellBag چیست؟

منظور از Shell Shock چیست؟

اجرای یه استرینگ به عنوان دستور مخرب از راه دور ، یه تعریف خیلی ساده و ابتداییه ولی بزارید یکم با توضیح ، واضح تر بیانش کنم

فکر کنید ما در شل بش ، یه متغیر تعریف میکنیم و یه استرینگ رو بهش اختصاص میدیم مثلا :

x = 'this is a single line content'

حالا ، این استرینگ در نظر گرفته میشه ، ولی فک کنید ما همچین چیزی رو به عنوان متغییر میخوایم بنویسیم :

y = 'rm -rf /'

خب الان شما میگید اگر ما این متغیر رو با echo $y فراخوانی کنیم فقط یه استرینگ ساده رو نمایش میده و درستم میگید ولی اگر این استرینگ ساده تبدیل به دستور بشه و اجرا بشه چی؟

z = '() { :;} ; rm -rf /'

و عبارت قبل ; باعث بشه اون قطعه کد که استرینگ در نظر گرفته شده ، یدفعه بعنوان دستور اجرا بشه ؟

خب حالا بزارید یکم بیشتر دربارش صحبت کنیم ، این باگ به صورت 25 سال بوده که کشف نشده در شل معروف (Bash) سیستم عامل های مبتنی بر Unix وجود داشته و خب ممکنه بگید این که مشکلی نیست ، باید بهتون بگم از این دید نگاه کنید که سیستم عامل های مبتنی بر یونیکس (لینوکس ، یونیکس و ..) در خیلی جاها وجود دارن ، به عنوان سیستم عامل Embeded حتی در خیلی از چیز ها هستن و دارن از یه سری دستورات استفاده میکنن واسه انجام کار ها ، حالا یه سریاشون از یوزر ورودی میگیرن و اون ورودی فقط استرینگه (حالا یا عدد) و اون استرینگ چیز خطر ناکی نیست ولی اگر اون استرینگی که از کاربر میگیرن دستور باشه و استرینگ نباشه ؟ باعث بوجود آمدن خرابی میشه (ممکنه دوباره یاد RCE یا Remote Code Execution بیفتید و خب واقعا یاد چیز درستی افتادید، یه نوع اجرای کد از راه دور محسوب میشه)

این مشکل از اونجایی نشئت میگیره که بش میخواد تابع هایی رو مدیریت کنه که توسط متغیر های محلی/بومی تعریف میشن و بعد اون تابع ها منشعب میشن به پروسس های فرزند (Bash Child Process) که این پروسس های فرزند میان و اون تابع هارو در Environment خودشون وارد میکنن و در نظر میگیرن ، حالا از اونجایی که این نوع مدیریت تابع در لینوکس مجازه ، وقتی یک مهاجم قطعه کدشو میده به سیستم عامل و اون قطعه کد توسط بش مورد قبوله و در Environment وارد میشه و اجرا میشه ، خب اگر این قطعه کد مخرب باشه که کار تمومه !

ربط این اسیب پذیری به پلتفرم های سمت وب از اونجایی میاد که این پلتفرم ها دارن از دستورات بش استفاده میکنن و مبتنی هستن بر شل لینوکس !! مثلا CGI داره از بش استفاده میکنه : bin/bash/!#

یا به گفته مایکل زالوسکی کاشف این آسیب پذیری ، توابعی مانند ()system یا ()popen در زبان های برنامه نویسی php , python , c++ , java محتمل آسیب پذیر بودن هستن

حالا میخوایم در CGI عملیات Shell Shock Injection رو انجام بدیم :

باید بدونیم که هرجایی که ما یه اطلاعاتی رو میتونیم به عنوان یه کاربر وارد کنیم و از اونم CGI میتونه به عنوان یه متغیر محلی/بومی در نظرش بگیره برای ما کار سازه ، مثلا به عنوان value جلوی مقدار http user agent در هدر HTTP Response یا به عنوان value جلوی مقدار cookie بازم در HTTP Response  و..

مثلا ما اینجا میاییم و از HTTP Useragent استفاده میکنیم چون همیشه در تبادلاتمون با سرور حضوری داره و اینبار بجای فرستادن اطلاعات خودمون بهش کد مخرب میدیم :

 HTTP_USER_AGENT=‘() { 42;};echo;/usr/bin/id’ 

در وهله اول سمیکالن ";" یه نوع جدا کننده دستوره و ما وقتی میخوایم در یک خط چند دستور بنویسیم ازش استفاده میکنیم

حالا میخوایم این قطعه کدی که نوشتیم رو قسمت قسمت کنیم :

قسمت پیشوند یا (Prefix) : شامل این قطعه کد میشه :

 () { 42;} 

این قسمت به این معناعه که به شل بش بگه که HTTP_USER_AGENT صرفا یک متغیر بومی و محلی نیست بلکه یک تابعه که بش باید اونو ذخیره کنه به عنوان متغیر محلی ، پرانتز ها "()" به این معنیه که این عبارت یه تابعس ، بریس ها "{}" میگن تابع در حقیقت چیکار میخواد بکنه ، 42 یک arbitrary هست ، ما بجاش میتونستیم دستورات شل رو بنویسیم ولی قطعه کدی که میخوایم اجراش کنیم رو اگر بزاریم داخل این اجرا نمیشه ، هدف از گذاشتن 42 این بوده که دستور بدون خطا اجرا بشه ، در فرم اصلی دستور Shell Shock ما عبارت دو نقطه رو میبینیم ":" که به معنی اینه که هیچ کاری نکن که اگر از اون استفاده کنیم ، حملمون بی اثر میشه !

قسمت لایه گذاری یا (Padding) :

 ;echo 

در این قسمت ما باز هم هدفمون اینه که سرور گیر نده به تزریق ما و این مقدار رو میتونید حذف کنید و ضروری نیست گذاشتنش ولی اگر بزارید احتمال اینکه سرور بهتون گیر بده کمتره

میریم سراغ دستور اصلیمون (Command) :

 ;/usr/bin/id 

هرچیزی که بعد ";" در این قسمت بزاریم مستقیما در سرور اجرا میشه

واسه اینکه بیشتر قسمت سومو درک کنید و حمله Blind Shell Shock رو هم دیده باشید ، به این مثال توجه کنید که ما دستور میدیم سرور پکت پینگ رو بفرسته به سمت گوگل :

 () { 42;};echo; ping -c 4 google.com

بیشتر از این جلو نمیرم که گیج کننده نشه و از هدف این مقاله خارج نشیم

تفاوت بین WebShell - ShellCode - ShellShock - ShellBag چیست؟

به صورت خلاصه و برای جمع بندی :

  •  Shell Bag یه کیفیه پر پوست که واسه فارنزیک کار ها و جرم یاب ها (به قول مهندس تنگسیری : پزشکی قانونی دیجیتال) که یه جاییه تو ریجستری که کمک میکنه بفهمیم مهاجم به کجاها رفته و چیکار کرده
  • Web Shell یه فایلیه به زبانی که وب اپلیکیشن قربانی باهاش نوشته شده و ما با اسیب پذیری هایی که از اون وب اپلیکیشن و وب سرور (قربانی) داریم میتونیم این شل هارو آپلود کنیم روی سرور و هرکاری میخوایم باهاش بکنیم از قبیل حذف و اضافه فایل و ...
  • Shell Code یه قطعه کده که ما در برنامه آسیب پذیر تزریق میکنیم که به ما اجازه میده سطح دسترسی مونو بالا ببریم در اون سیستم عامل و یا از راه دور به اون برنامه (برنامه ای که روی سیستم قربانیه) وصل بشیم و باز اعمال خبیثانه انجام بدیم
  • Shell Shock یه آسیب پذیریه درشل لینوکس که اجازه میده به مهاجم که هر دستوری رو به عنوان متغیر محلی در نظر بگیره و اجراش کنه

اگر سوالی چیزی بود درخدمتم :)



محمد حسن پزشکیان
محمد حسن پزشکیان

عاشق امنیت و نفوذ ، رد تیم و دوستدار بزن بکش :)

کارشناس تست نفوذ سنجی ، علاقه مند به امنیت تهاجمی و رد تیمینگ | عضو انجمن بین المللی ورزش های رزمی کشور آلمان و دارای احکام بین المللی و داخلی کمربند مشکی در سبک های کیوکوشین ، هاپکیدو ، کیک بوکسینگ و چند تام قهرمانی کشوری

نظرات