تکنیک استفاده از دایرکتوری proc/ در لینوکس


سلامی گرم از فصل جدید سریال LFI به شما دنبال کنندگان عزیز! 😊 با آرزوی سلامتی و حال خوب، در اپیزود اول فصل جدید سریال LFI در خدمت شما هستیم! در این اپیزود با هم خواهیم آموخت که چگونه می‌توان با استفاده از فایل‌هایی که در دایرکتوری proc/  در لینوکس هستند، مثل بنز از آسیب پذیری LFI استفاده کرد! 😉

در این قسمت از سریال قرار است که با هم روش استفاده از فایل‌های موجود در دایرکتوری proc/ لینوکس برای تجربه یک LFI هیجانی را بیاموزیم. در ابتدا باید بدانیم که دایرکتوری proc/ در لینوکس چه وظیفه‌ای دارد؟  دایرکتوری proc/ در لینوکس در واقع یک فایل سیستم مجازی است که هر بار سیستم لینوکسی روشن می‌شود ایجاد می‌شود و هر موقع که سیستم خاموش شد از بین می‌رود. این فایل سیستم مجازی، اطلاعات و فایل‌های لازم برای پروسه های در حال اجرا در لینوکس را نگه داری می‌کند و به عنوان مرکز اطلاعات و کنترل کرنل شناخته می‌شود. بنابراین همان‌طور که احتمالا شما هم حدس زدید، اطلاعات خیلی با ارزشی از سرویس‌ها و نرم‌افزارهای در حال اجرای سیستم را می‌توان از داخل این دایرکتوری پیدا و استفاده کرد. با ما در این اپیزود همراه باشید تا دو نمونه از این فایل ها را بررسی کنیم و کمبود هیجان بدنمان را کمی جبران کنیم! 😉

روش   proc/self/environ/

اگر در پارامتری که آسیب پذیر به LFI است آدرس فایل proc/self/environ/ را وارد کنیم و این فایل قابل خواندن باشد محتوای فایل مانند مثال زیر نمایش داده می‌شود که در آن User Agent مروگر ما هم موجود است! 😊 احتمالاً الان یک لامپ بالای سر شما هم روشن شد و در چشمان شما هم مانند من، برقی خاص از دیدن User Agent در پاسخ سرور است! 😉

 

DOCUMENT_ROOT=/home/sirgod/public_html GATEWAY_INTERFACE=CGI/1.1 HTTP_ACCEPT=text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1 HTTP_COOKIE=PHPSESSID=134cc7261b341231b9594844ac2ad7ac HTTP_HOST=www.website.com HTTP_REFERER=http://www.website.com/index.php?view=../../../../../../etc/passwd HTTP_USER_AGENT=Opera/9.80 (Windows NT 5.1; U; en) Presto/2.2.15 Version/10.00 PATH=/bin:/usr/bin QUERY_STRING=view=..%2F..%2F..%2F..%2F..%2F..%2Fproc%2Fself%2Fenviron REDIRECT_STATUS=200 REMOTE_ADDR=6x.1xx.4x.1xx REMOTE_PORT=35665 REQUEST_METHOD=GET REQUEST_URI=/index.php?view=..%2F..%2F..%2F..%2F..%2F..%2Fproc%2Fself%2Fenviron SCRIPT_FILENAME=/home/sirgod/public_html/index.php SCRIPT_NAME=/index.php SERVER_ADDR=1xx.1xx.1xx.6x SERVER_ADMIN=webmaster@website.com SERVER_NAME=www.website.com SERVER_PORT=80 SERVER_PROTOCOL=HTTP/1.0 SERVER_SIGNATURE=

Apache/1.3.37 (Unix) mod_ssl/2.2.11 OpenSSL/0.9.8i DAV/2 mod_auth_passthrough/2.1 mod_bwlimited/1.4 FrontPage/5.0.2.2635 Server at www.website.com Port 80

 

حال می‌توانیم با استفاده از burpsuite و استفاده از بخش repeater، در قسمت هدر useragent درخواست، یک قطعه کد php قرار دهیم و با دسترسی به آدرس آسیب پذیری LFI   و با  قرار دادن  آدرس proc/self/environ/  در پارامتر آسیب پذیر، کد PHP را اجرا کنیم. این روش البته در نسخه‌های جدید لینوکس تقریباً غیر قابل استفاده شده و لذت یک LFI هیجانی با پارامتری از مرورگر را از ما گرفته است!  ☹

 

روش استفاده از دایرکتوری  proc/self/fd/

در دایرکتوری proc/self/fd/ یک سری فایل ساخته می‌شود که در واقع symbolic link هایی هستند که توسط پروسه های اجرا شده باز شده‌اند. این symbolic link ها که در لینوکس، حکم shortcut در ویندوز را دارند، نام‌های عددی دارند و در بیشتر مواقع به فایل‌های مهمی‌مانند فایل لاگ access آپاچی و ... اشاره می‌کنند. برای مثال فایل‌های زیر نمونه هایی از فایل‌هایی هستند که ممکن است در این دایرکتوری ببینید:

 

/proc/self/fd/1

/proc/self/fd/2

/proc/self/fd/3

/proc/self/fd/4

/proc/self/fd/5

 

اگر در صفحه‌ای که آسیب پذیر به LFI است آدرس یکی از فایل‌های بالا را بدهیم در این صورت اگر فایل قابل خواندن باشد و symlink ای به یکی از فایل‌های لاگ مانند لاگ access آپاچی باشد، محتوای آن را به ما نشان می‌دهد.(توجه داشته باشید که این مورد در ورژن های جدید قابل انجام نیست.)

 

در این صورت به آسانی مشابه روش آلوده کردن فایل لاگ access درapache، می‌توانیم با استفاده از burp یک درخواست شامل کد php به آن ارسال کنیم و با باز کردن دوباره صفحه آسیب پذیر و قرار دادن آدرس proc/self/fd/number/ در پارامتر آسیب پذیر، محتوای این فایل را include  کرده و کد php را اجرا کنیم. برای یافتن این فایل‌های لاگ باید ابتدا توانایی خواندن این فایل ها را داشته باشیم و با استفاده از بخشintruder در نرم‌افزار Burpsuite عملیات Bruteforce را روی اعداد به صورت ترتیبی انجام دهیم و در نهایت به یک فایل لاگ مانند لاگ وب سرور آپاچی برسیم که بتوانیم کدی در داخل آن تزریق کرده و آن را اجرا کنیم.

 

برای مثال در تصویر زیر سایتی را می‌بینیم که  به نظر می‌رسد که آسیب پذیری LFI را در پارامتر page داشته باشد.

به سراغ تست آن می‌رویم و همانگونه که در تصویر زیر مشخص است مطمئن می شویم که سایت آسیب پذیر به LFI است.

حال برای پیدا کردن فایل‌های */proc/self/fd/ که وجود دارند و دسترسی خواندن آن‌ها را داریم به سراغ Burpsuite و قسمت intruder  آن می‌رویم و مانند تصویر زیر در تب Positions تنظیمات Position را انجام می‌دهیم.

سپس به تب Payloads می‌رویم مانند تصویر زیر و یک پیلود از نوع Brute forcer می‌سازیم که Character Set آن 0 تا 9 است و مینیمم طول آن 1 و ماکزیمم طول آن 3 است. (در بیشتر موارد با ماکزیمم 2 هم جواب میگیریم مگر این که با سیستمی با بار کاری بالا مواجه باشیم که وارد اعداد سه رقمی شویم)

در مرحله بعد به تب Options می‌رویم و مانند تصویر زیر، تعداد Thread ها را روی 5 تا تنظیم می‌کنیم:

حال پس از انجام عملیات و پیدا کردن آدرس فایل لاگ access مربوط به سایت خودمان  از میان فایل‌های fd پیدا شده، مانند تصویر زیر آن را در سایت از طریق پارامتر آسیب پذیر به LFI فراخوانی می‌کنیم و همانگونه که مشاهده می‌کنید، می‌توانیم log را بخوانیم.

برای آلوده سازی فایل  Log مانند تصویر زیر از یک تکه کد در URL استفاده می‌کنیم  و  درخواست GET را ارسال می‌کنیم تا در داخل فایل لاگ access ذخیره شود. در ادامه نحوه عملکرد قطعه کد را توضیح می‌دهیم.

در قطعه کد زیر در واقع هر چیزی که در داخل تابع  ()system  قرار بگیرد در خط فرمان سیستم‌عامل اجرا می‌شود. مثلاً اگر در داخل این تابع رشته ی ls را قرار دهیم لیست فایل‌های موجود در دایرکتوری را به ما نمایش می‌دهد. حال هدف ما این است که دستور را هر دفعه توسط یک متغیر به آن بدهیم، بنابراین در داخل این تابع از عبارت GET['cmd']_$  استفاده می‌کنیم تا هر بار با ایجاد یک متغیر GET با نام cmd در URL بتوانیم دستور دلخواه را در این متغیر قرار داده و اجرا کنیم.

 

<?php system($_GET['cmd']);  /*

 

هدف از قرار دادن */ در انتهای کد  اشاره شده، این است که بقیه عبارت های نوشته شده در داخل فایل لاگ access را کامنت کنیم و بدین روش از بروز خطاهای اجرایی در کد php جلوگیری کنیم. حال مانند تصویر زیر پس از وارد کردن کد در داخل فایل لاگ access، متغیر را با یک دستور سیستمی ارسال می‌کنیم تا متوجه کارایی کد شویم.

همانگونه که در تصویر بالا مشاهده می‌کنید با قرار دادن دستور  ls -la در داخل متغیر cmd این دستور اجرا شده و در پایین این تصویر لیست فایل‌های موجود را مشاهده می‌کنید.

 حال که می‌توانیم دستور اجرا کنیم، می‌توانیم با دستور curl یک شل نوشته شده به زبان php را که در یک سایت آنلاین به صورت text موجود است را در یک فایل در داخل دایرکتوری tmp/ ذخیره کنیم. به عنوان مثال می‌توانیم یک شل PHP را در سایت Pastebin اپلود کنیم و مانند تصویر زیر با استفاده از دستور curl فایل شل را با پسوند log. در داخل tmp/ دانلود و با نام black.log ذخیره کنیم.

حال مانند تصویر زیر می‌توانیم با استفاده از LFI فایل Shell را مستقیماً فراخوانی و استفاده کنیم.

این روش نیز در نسخه‌های جدید بسته شده است اما بسته به تنظیمات می‌تواند قابل استفاده باشد و خبر خوش این است که این روش نسبت به روش قبلی روی نسخه‌های بیشتری کار می‌کند! 😉

در این اپیزود از سریال آموختیم که دایرکتوری proc/ در لینوکس چه وظیفه‌ای دارد و چگونه فایل‌های موجود در آن برای استفاده از آسیب پذیری LFI و تبدیل آن به RCE به ما کمک می‌کنند. اگر فایل دیگری در این دایرکتوری می شناسید که می‌توان از آن مانند روش بالا استفاده کرد یا روش خلاقانه مشابهی دارید در قسمت نظرات منتظر شما هستیم! 😊 در اپیزود بعدی یک روش ترکیبی را با هم خواهیم دید تا تصور شما از نهایت شیطانی بودن ذهن در استفاده از آسیب پذیری LFI را به هم بریزیم!  😉

تا قسمت بعدی بدرود!

لیست نظرات
کاربر میهمان
دیدگاه شما چیست؟
کاربر میهمان