
در این بخش از دوره آموزشی تست نفوذ سطح متوسط که برگرفته از دوره SEC642 می باشد به ادامه مبحث آشنایی با File Inclusion و Code Execution می پردازیم.
LFI and Code Execution
شما تا کنون چندین روش برای انجام RFI به اجرای کد از راه دور در بخشهای پیشین دیدهاید. دانستن این تکنیکها مهم هستند ولی محدودیتهایی در مورد بهره برداری از آسیبپذیری RFI وجود دارد.
آیا این جالب به نظر نمیرسد اگر شما بتوانید تتها بوسیله Include نمودن فایلهای داخلی به اجرای کد برسید؟
روشهای زیادی در این زمینه وجود دارد که برخی از آنها عبارتند از:
• فایلهای مربوط به برنامه خاص که یک مهاجم میتواند ایجاد کند، مانند پستهای وبلاگ و یا نظرات.
• فایلهای خاص مربوط به برنامه کاربردی در حال اجرا بر روی وب سرور، مانند فایلهای ایمیل، فایلهای آپلود شده از طریق FTP ناشناس، فایلهای آپلود شده در یک SMB Share و همچنین هر تابع دیگر موجود در سرور که به مهاجم اجازه بارگذاری یا کنترل محتوای یک فایل بر روی آن سرور را میدهد.
• اگر برنامه کاربردی وب اجازه بارگذاری فایلها را بدهد، حتی اگر آنها در مکانی خارج از web root آپلود شوند، یک مهاجم میتواند از آن به عنوان یک بردار برای اجرای کد استفاده کند.
• موجودیتهای سیستم فایل لینوکس مانند /proc/self/environ و /proc/self/fd
• PHP session files
• فایلهای لاگ ایجاد شده بر روی سرور حاوی محتوای متاثر از مهاجم. این موارد شامل لاگهای مربوط به برنامه وب، access log و error log های مربوط به وب سرور آپاچی، Login Failed های مربوط به SSH و هر لاگ فایل دیگری که امکان کنترل آن از راه دور توسط مهاجم امکان پذیر است.
Application and Server Files
برای اینکه آسیبپذیری Local File Inclusion منجر به اجرای کد شود، سه نیاز اولیه باید برآورده شوند که عبارتند از:
- برنامه یا سرور امکان Write به یک فایل را فراهم کند.
- امکان کنترل از راه دور محتویات فایل توسط مهاجم وجود داشته باشد.
- وب سرور اجازه خواندن فایل مورد نظر را داشته باشد.
برخی از مثالهایی که با این معیارها متناسب هستند شامل موارد زیر میباشد که البته محدود به آنها نیز نیستند:
• یک برنامه کاربردی وبلاگ (Blog Application) که در آن مهاجم اجازه ایجاد مطالب جدید را دارد. مطالب وبلاگی جدید به عنوان فایلهای جدید ایجاد میشوند و یا یک فایل موجود در سرور را تغییر میدهند.
• یک سرور ایمیل با ایمیلهایی که به عنوان فایل ذخیره شدهاند. مهاجم میتواند ایمیل را به / از طریق سرور ارسال کند که این ایمیل به عنوان یک فایل ذخیره میگردد.
• یک سرور FTP که بر روی وب سرور اجرا شده و اجازه آپلود ناشناس (anonymous) را میدهد، یا اینکه مهاجم دارای یک Credential معتبر در آن میباشد.
• برنامه کاربردی وب دارای قابلیت آپلود فایل است که کاملا به آسیبپذیری File Inclusion ارتباطی ندارد. این امر به ویژه در برنامههای کاربردی وب که ارسال ایمیل از طرف کاربر را پشتیبانی میکنند و اجازه ضمیمه کردن را میدهند، رایج است.
همانطور که به مثالهای بیشتر نگاه میکنید، به یاد داشته باشید که خلاقیت کلید توسعه این تکنیکها میباشد. تکنیکهای کشف نشده دیگری نیز وجود دارند که میتوانند مختص یک برنامه کاربردی وب یا یک سرور خاص باشند.
به عنوان تست نفوذگر، همیشه باید به خاطر داشته باشیم که ما تنها توسط تصورات خود در بهرهبرداری از این آسیبپذیری برای دستیابی به اجرای کد محدود شدهایم و در عمل با بررسیهای بیشتر و خلاقیت بیشتر(البته بسته به شرایط)، قادر به تبدیل File Inclusion به Code Execution خواهیم بود.
سو استفاده از proc/self/
همانطور که ما از قابلیت داخلی ویندوز برای دسترسی به SMB Share ها به عنوان فایلهای محلی استفاده میکنیم، سیستم فایل لینوکس نیز به ما امکان دسترسی به Entity خاص رزرو شده /proc را میدهد.
در اکثر سیستمهای مبتنی بر یونیکس، proc/ یک دایرکتوری خاص است که در آن اطلاعات مربوط به هر فرآیند سیستم وجود دارد.
هر زیرشاخه در proc/ یک ID فرآیند بوده که نشاندهنده فرآیند و اطلاعات آن است. اگرچه ما هیچ راهی برای پیدا کردن ID فرآیند خودمان نداریم، اما میتوانیم از proc/self/ برای اشاره به دایرکتوری فرآیند فعلی که در حال اجرا آن هستیم، استفاده کنیم.
داخل proc/self/ مجموعهای از فایلها وجود دارد که بخشهای مختلف اطلاعات در مورد فرآیند را نشان میدهند. فایلهای مربوط به ما شامل /proc/self/environ ، /proc/self/stat ، /proc/self/cmdline و دایرکتوری proc/self/fd/ هستند.
proc/self/environ/: این Entity فایلی است که شامل تمام متغیرهای محیطی در Context فرآیند فعلی است. در نسخههای قدیمیتر Apache، مقدار User-Agent مرورگر کاربری که به یک صفحه دسترسی دارد، به عنوان یک متغیر محیطی ذخیره میشد. مهاجم User-Agent خود را به یک مقدار حاوی کد اجرایی تنظیم میکند و سپس از یک آسیبپذیری Local File Inclusion برای Include نمودن proc/self/environ/ استفاده میکند. سپس Apache به صورت وظیفه شناسانه، User-Agent حاوی کد را در یک متغیر محیطی ذخیره میکند که به نوبه خود در proc/self/environ/ قابلمشاهده بوده و پس از آن توسط وب سرور Include شده و کد، اجرا میگردد.
proc/self/stat/: این فایل شامل PIDفرآیند فعلی بوده و به طور معمول این PID مربوط به وب سرور مانند Apache است.
proc/self/cmdline/: این Entity فراخوانی خط فرمان فرآیند فعلی را ذخیره میکند.
proc/self/fd/: این Entity یک دایرکتوری با لینکهای symbolic به تمام file stream هایی است که فرآیند فعلی باز نموده است و شامل سه file stream پیشفرض ۰، ۱ و ۲ به ترتیب مربوط بهSTDIN، STDOUT و STDERR میباشد. هر ورودی در proc/self/fd/ که بیش از ۲ باشد، نشاندهنده یک فایل باز شده توسط فرآیند است.
کاربردها برای proc/self/
در سیستمهای مدرن، proc/self/environ/ همیشه توسط فرآیند سرور وب در دسترس نیست. با وجود این، هنوز هم مهم است که آن را بررسی کنیم. چراکه این روش هنوز هم یک بردار حمله رایج بوده که تا به امروز مورد استفاده نفوذگران میباشد.
proc/self/cmdline/ برای دستیابی به اجرای کد، قابل بهرهبرداری نیست اما میتواند در یافتن مکان فایلهای پیکربندی سرور و دیگر مکانهای حساس در صورتی که از طریق خط فرمان به Apache منتقل شوند، مفید باشد.
همانطور که در اسلاید قبلی دیدید،/proc/self/fd/# شامل Reference هایی برای تمام فایلهایی است که در حال حاضر توسط فرآیند فعلی باز شدهاند. یک مهاجم میتواند این دایرکتوری را با چندین درخواست Enumerate نموده و به طور بالقوه به فایلی دسترسی پیدا کند که در حالت عادی درباره آن چیزی نمیداند و یا قادر به خواندن نبوده است. در این اسلاید، شما یک مهاجم را میبینید که با استفاده از ابزار Intruder در Burp Suite برای Enumerate نمودن proc/self/fd/3 تا proc/self/fd/100 اقدام نموده و به دنبال فایلهای باز است.
مهاجم، آدرس هاست را معادل blog.sec642.org تنظیم نموده و درخواستی برای/fileview.php?loc=/proc/self/fd/3 ارسال نموده است. وی در ادامه از بخش Intruder ابزار Burp Suite استفاده نموده و پس از تنظیم numbers در قسمت payload set، اعداد 3 تا 100 را برای بررسی وارد میکند.
فایلهای جلسات php
فایلهای نشست PHP به طور خاص برای بهرهبرداری از File Inclusion مفید هستند. برنامههای کاربردی وب اغلب نیاز به ذخیره موقت اطلاعات براساس هر جلسه دارند. یعنی، آنها به روشی برای مرتبط کردن دادهها به یک کاربر نیاز دارند.
به طور پیشفرض،PHP این کار را با اختصاص یک Session ID به هر جلسه منحصر به فرد و ذخیرهسازی آن در کوکی بر روی مرورگر مشتریان انجام میدهد. سپس، هر داده مرتبط با آن جلسه در فایلی به نام sess_[session id] ذخیره میشود و میتواند به صورت دلخواه توسط برنامه کاربردی وب بازیابی شود.
مجموعهای از این فایلها اغلب در مسیرهای زیر نگهداری میشوند:
/tmp
/var/lib/php5
/var/lib/php/session
../temp
C:\Windows\Temp
اگر مهاجم تعیین کند که یک متغیر جلسه وجود دارد که Value آن را میتواند کنترل کند، فرصت اجرای کد وجود دارد. مهاجم کد PHPرا به یک متغیر جلسه تزریق میکند و شامل فایل جلسه خود میشود.
این کار با بازیابی Session ID از کوکی و آزمایش مکانهای ذکر شده و تلاش برای حدس محل ذخیره فایلهای نشست انجام میشود. اگر Inclusion موفقیتآمیز باشد و کد در حالی که در فایل نشست ذخیره میشود تغییر نکند، اجرای کد حاصل میشود.