امیرحسین تنگسیری نژاد
مهندس و مدرس شبکه و امنیت سایبری و مدیر کل جزیره هک و امنیت اطلاعات توسینسو

ShellCode چیست و نحوه ایجاد کردن ShellCode ها

دوره های شبکه، برنامه نویسی، مجازی سازی، امنیت، نفوذ و ... با برترین های ایران
اکثر کسانی که کلمه ShellCode را می‌شنوند فکر میکنند ارتباطی با Shell Scripting دارد و وقتی که در جواب این موضوع نه میشوند میگویند پس چرا؟ پس ShellCode به چه معناست؟ اصطلاح ShellCode از لحاظ تاریخی برای توصیف سازی کد های مخربی است که در Exploit های ایجاد شده برای نرم افزارهای متنوع به منظور ایجاد یک دسترسی Shell از راه دور استفاده می شوند تا فرد مهاجم توانایی بهتری به منظور تعامل و دسترسی به سیستم قربانی پیدا کند.
ShellCode چیست و نحوه ایجاد کردن ShellCode ها

این مقاله بخشی از دوره تست نفوذ سازمانی با متااسپلویت(SANS SEC580) میباشد

به کد نویسی استاندارد زبان C بالا توجه کنید. میتوانیم به راحتی آن را در یک Compiler ایجاد کنیم و یک دسترسی Shell را برایمان ارائه کند. همین موضوع برای افراد فعال در این حوزه بسیار کار است زیرا میتوانند با استفاده از ایجاد کردن برنامه های نامناسبی مثله کد C بالا ورودی های نامناسب تری را برای دست یابی به همان برنامه استفاده کنند. بهترین پاداش برای مهاجمان این است که نرم افزار مورد نظرشان از دسترسی بالایی برخوردار باشد تا در حین حمله از دسترسی بالایی که نرم افزار مورد نظر دارد استفاده کنند و همان دسترسی را به سمت خودشان بکشانند.
بیاید حالا کد بالا را در یک Disassembler مانند OllyDB و IDA و Ghidra بازکنیم و خروجی آن را ببینیم:
ShellCode چیست و نحوه ایجاد کردن ShellCode ها
قسمت های که به شکل قرمز رنگ در آمده است ShellCode ما هستند و در بخش سمت راست کد نویسی های کدمان را به شکل کامل قابل فهم برای انسان به زبان Assembly میبینیم. اما اگر بخواهیم قشنت های قرمز رنگ را بکارگیری کنیم باید از چه تکنیکی استفاده کنیم؟! پاسخ این سوال بسیار سادست ابتدا شما میبایست مقدار های به دست آمده را به حالتی خوانا و قابل فهم برای نرم افزار تبدیل کنید که در گرفتن ورودی ها از شما آن را قبول کنید اما این حالت خوانا و قابل فهم رو به چه شکل انجام بدیم؟! اصولا شما میبایست کد های خودتون را به بایت های Hex متصل کنید با استفاده از /x به شکل زیر که مثالی از اینکار را برای شما بر روی ShellCode در تصویر اورده اییم
\x55\x48\x89\xe5\x48\x83\xec\x30\x31\xc0\x89\xc2\

انواع ShellCode ها کدامند؟

درواقع ShellCode ها به دو دسته مختلف تقسیم بندی میشوند که این دو دسته عبارتند از:
  • Local ShellCode
  • Remote ShellCode
هرکدام از این نوع ShellCode ها وظیفه خاصی را برعهده دارند برای مثال Local ShellCode ها استفاده بیشتری در محیط های لابراتور و تست را دارند زیرا ShellCode بر روی بستر یک محیط محلی مثله کامپیوتری که بهش دسترسی داریم یا یک ماشین مجازی بکارگیری میشود و اکثر وقتا افراد فعال در این حوزه برای تست کردن ShellCode های خود از این کار استفاده میکنند و به این نوع ShellCode ها که بر روی بستر محیط محلی یک سیستم اجرا میشود میگویم Local ShellCode
و‌ اما حالا بیاید بررسی کنیم مفهوم Remote ShellCode چیست؟ درواقع Remote ShellCode برعکس Local ShellCode ها عمل میکنند به این شکل که توانایی اجرا سازی به صورت از راه دور را بر روی سیستم های مختلف را دارند برای مثال درنظر بگیرید قرار است با یک ShellCode سیستم خاصی را بکارگیری کنید و از آن دسترسی بگیرید به همین سبب شما ShellCode را درون یک نرم افزار جاسازی میکنید و به فرد مقابل ارائه میکنید و درصورت بازشدن نرم افزار بر روی سیستم طرف مقابل ShellCode نیز اجرا میشود و شما موفق به گرفتن دسترسی از سمت سیستم طرف مقابل میشوید به صورت کاملا از راه دور

چگونه ShellCode هارا ایجاد کنیم؟

سوالی که بعد از توضیحات بالا پیش میاد این است که چگونه میتوانیم ShellCode های مخرب را ایجاد کنیم و آنهارا بکارگیری کنیم؟ بسیار سادست زیرا ابزار های قدرتمندی در این حوزه وجود دارند که بهترین آنهارا ابزار Msfvenom است که زیرمجموعه مجموعه ابزاری Metasploit Framework قرار میگیرد به سبب Msfvenom ما توانایی ایجاد کردن Payload و ShellCode های مختلف را به صورت سریع و فوق العاده ساده را داریم. برای اینکار کافیست از دستور msfvenom به شکل زیر استفاده کنیم:
 
msfvenom -p PayLoad Location -b "Bad Characters" -f Format
 
این نمونه ایی از Syntax دستوری اجرا سازی Msfvenom به شکلی که به ما یک ShellCode را ارائه کند اما اگر بخواهیم به شکل عملی یک ShellCode را ایجاد کنیم میبایست به شکل زیر عمل کنیم:
ShellCode چیست و نحوه ایجاد کردن ShellCode ها
در دستور بالا ما از ابزار Msfvenom استفاده کردیم و از سوییچ -p به منظور وارد کردن Payload مورد نظرمان که قرار است یک ShellCode مطابق با آن به ما ارائه شود پس از آن با سوییچ -b مقدار های Bad Characters را از ShellCode حذف کردیم که مشکلی در روند کاری ShellCode به وجود نیاید پس از آن با سوییچ -f فرمت ShellCode را تعیین کردیم که برابر با زبان برنامه نویسی C بود
 

امیرحسین تنگسیری نژاد
امیرحسین تنگسیری نژاد

مهندس و مدرس شبکه و امنیت سایبری و مدیر کل جزیره هک و امنیت اطلاعات توسینسو

متخصص امنیت اطلاعات و کارشناس شکار تهدیدات بانک ملی ایران ، دارای مدارک مختلف از Splunk و AWS و Fortinet و Huawei حوزه اصلی فعالیت بنده در زمینه شبکه مباحث R&S و Service Provider می‌باشد و در زمینه امنیت نیز در موقعیت های مختلفی مانند PenTest و SoC فعالیت داشته و دارم. سابقه همکاری با بعضی سازمان های در قالب پروژه و... را داشته ام الان به عنوان تحلیلگر امنیت سایبری در زیرساخت بانک ملی مشغول به کار هستم. لینکداین: https://www.linkedin.com/in/amirhoseintangsirinezhad/

نظرات