دانشگاه شهید بهشتی ترم اول ۹۱-۹۰ |
شبکههای کامپیوتریگروه درسی بر روی گوگل |
استاد :
دکتر احسان ملکیان
کمک درس : عباس نادری |
پروژه اول : شنود در شبکه
فهرست عناوین
مقدمه
در این پروژه قصد داریم نرمافزاری بنویسیم که ترافیک شبکه را شنود نماید. برای این منظور باید کارت شبکه خود را در مد Promiscuous قرار دهیم و سپس دادهها را خوانده، تحلیل کرده، قسمتهای مختلف و نوع آنها را تشخیص دهیم.
از آنجایی که کار مستقیم با سخت افزار دشوار و غیر قابل انتفال است، از کتابخانه pcap استفاده میکنیم. این کتابخانه امکان لیست کردن کارتهای گرافیکی، قرار دادن هرکدام از آنها در مد Promiscuous و دریافت دادهها را دارد، لذا کافیست ما از آن استفاده کنیم و دادهها را پردازش نماییم. نرم افزار معروف tcpdump نیز که از ابزارهای شنود شبکه در ترمینال است با استفاده از همین کتابخانه تهیه شده است.
در این پروژه، هر پروتکل و لایه شبکه که در درس اصلی پوشش داده شد، به صورت نرمافزاری پیاده میشود تا شنودگر ما امکان درک دادههای آن پروتکل را نیز داشته باشد. لذا زمان شروع این پروژه در میان ترم و زمان پایان آن انتهای ترم خواهد بود.
پیشنیازها
اکیدا توصیه میشود این پروژه با زبان سی نوشته شود، زیرا پروژه سطح پایینیست و برنامهنویس به خوبی درک خواهد کرد درون شبکه و سیستم عامل چه میگذرد. استفاده از زبانهای جاوا و سی شارپ نیز برای این مقصود ساده است، اما در این سند محوریت زبان C++ با چهارچوب توسعه نرم افزار Qt خواهد بود.
Qt یک چهارچوب مستقل از سیستم عامل است، یعنی تمام توابع و کلاسهای موجود در آن هم بر روی ویندوز، هم لینوکس و هم مکینتاش کامپایل میشوند. لذا با استفاده از امکانات برنامهنویسی آسنکرون و همچنین Thread های آن، به سادگی میتوانیم برنامههای شبکه بنویسیم و بر روی هر سیستم عاملی اجرا نماییم. همچنین Qt برای تمام زبانهای برنامهسازی وجود دارد، ولی نسخه اصلی آن به زبان C++ است، که باعث سادگی استفاده از pcap در برنامه میشود.
نکته : از آنجایی که Qt SDK نرمافزاریست حجیم با حجمی معادل حدود ۱.۵ گیگابایت، توصیه میشود آنرا از بنده بگیرید و توزیع نمایید.
نکته ۲ : بنده قبلا برنامه مختصری نوشتهام که شنود در شبکه را با pcap و Qt انجام میدهد. جهت دریافت آن میتوانید به http://abiusx.com/archive/code/ مراجعه نمایید.
برای تست کارکرد نرمافزارهای شبکه بهتر است دو سیستم داشته باشید. همچنین برای کار با بسیاری از ابزار، خوب است که یک لینوکس داشته باشید. لذا با استفاده از راهنمای راهاندازی ماشین مجازی لینوکس یک اوبونتو برای خود راهاندازی کنید. می توانید کل فرآیند برنامهنویسی و توسعه پروژه را نیز بر روی همان انجام دهید که بسیار سادهتر خواهد بود.
نصب pcap
برای نصب pcap سه راه وجود دارد، راه اول مختص ویندوز استفاده از WinPcap است. دقت کنید که بسته Developer آنرا که لینک شده دانلود و نصب کنید، که این بسته برای برنامهنویسی با WinPcap است. بسته عادی آن صرفا برای قابل اجرا شدن برنامههاییست که با استفاده از WinPcap نوشته شدهاند.
راه دوم که در لینوکس و مک قابل استفاده است، دانلود کد منبع libpcap است. برای کامپایل کردن آن در اوبونتو، باید نرمافزارهای لازم برای کامپایل را داشته باشید که با دستور زیر نصب میشوند (این برنامهها بر روی مک با نصب XCode وجود خواهند داشت)
sudo apt-get install build-essential
سپس پس از باز کردن ترمینال و رفتن به پوشهای که فایل دانلود شده درون آن قرار دارد (در این مثال دسکتاپ) با دستورات زیر میتوانید آنرا کامپایل و نصب کنید :
cd ~/Desktop tar -zxvf libpcap-1.1.1.tar.gz cd libpcap-1.1.1 ./configure make sudo make install
دقت کنید که برخی از این دستورات ممکن است چندین دقیقه زمان ببرند. پس از نصب، فایلهای مربوطه در پوشههای /usr/lib , /usr/include قرار میگیرند و برنامه شما امکان استفاده از آنها را خواهد داشت.
راه سوم استفاده از دستورات مستقیم نصب بر روی اوبونتو است که به شرح زیر است :
sudo apt-get install libpcap libpcap-dev
دقت کنید که برنامهنویس احتیاج به نسخه dev کتابخانه جهت برنامه نوشتن دارد، و کسی که قصد اجرای برنامه را دارد احتیاج به نسخه معمولی آن. همچنین اگر همچین بسته ای یافت نشد، ممکن است نام آن کمی متفاوت باشد. برای کشف این موضوع کافیست sudo apt-get install را که نوشتید، چند حرف اول بسته مورد نظر را تایپ کنید و سپس دوبار کلید tab را بزنید تا لیستی از بسته های موجود پیشنهاد داده شود.
بررسی صحت نصب
جهت بررسی صحت نصب، کافیست برنامه زیر را به زبان سی بنویسید و کامپایل کنید :
#include <pcap.h> #include <stdio.h> int main() { char error_buffer[PCAP_ERRBUF_SIZE]; char *s; s=pcap_lookupdev(error_buffer); if (s==NULL) printf("Could not determine default network device\n"); else printf("%s\n",s); return 0; }
اگر برنامه فوق را به صورت معمولی کامپایل کنید، خطایی مبنی بر عدم یافتن تابع pcap_lookupdev به شرح زیر دریافت می کنید :
undefined reference to `pcap_lookupdev' collect2: ld returned 1 exit status
این خطا به این دلیل است که کتابخانه pcap را به برنامه خود پیوند (link) نکردهاید جهت رفع مشکل، کتابخانه pcap را در لیست کتابخانههای خود قرار دهید و سپس کامپایل کنید. اینکار به طرق زیر قابل انجام است:
- در Qt فایل پروژه را باز کنید (این فایل معمولا پسوند pro دارد) ، در انتهای آن LIBS += pcap را بیافزایید.
- در اکلیپس بر روی پروژه خود راست کلیک کرده، Properties, Linker, Settings, Libraries و در لیست pcap را بیافزایید.
-
در صورتی که در ترمینال کامپایل میکنید، از دستور زیر استفاده کنید :
gcc source_file.c -lpcap
دقت کنید که نام فایل را با source_file.c جاگزین کنید.
در صورتی که موفق به کامپایل شدید، pcap به درستی بر روی سیستم شما نصب شده است.
نکته : در صورتی که برنامه را اجرا نمایید، پیامی مبنی بر اینکه کارت شبکه پیش فرض یافت نشد دریافت خواهید. برای اینکه برنامه به درستی کار کند باید آنرا با اجازه مدیر سیستم اجرا کنید تا بتواند دسترسی انحصاری به کارت شبکه داشته باشد. اینکار در ویندوز با راست کلیک و Run as Administrator و در لینوکس با sudo ./a.out قابل انجام است. در ادامه نیز در این پروژه همواره باید برنامه را با دسترسی مدیر سیستم اجرا نمایید. برای اینکه اینکار راحت شود، محیط برنامهسازی خود (مثلا Qt Creator) را با دسترسی مدیر اجرا کنید تا خود آن برنامه را با دسترسی مدیر اجرا کند.
پس از اجرای صحیح برنامه باید نام کارت شبکه اول (پیش فرض) شما بر روی صفحه نمایان شود.
استفاده از pcap
راهنمای کامل استفاده از pcap در سایت رسمی آن مفصل آمده است. همچنین در کلاس حل تمرین نیز پوشش داده خواهد شد و متعاقبا در همین صفحه قرار خواهد گرفت. راهنماهای بسیاری هم در اینترنت برای کار با آن وجود دارد.
پروتکلهای و ویژگیهای لازم
برای انجام کامل این پروژه، لیستی از پروتکلهای معروف شبکه با پارامترهای معروفشان باید تشخیص داده شوند. برای تشخیص اینکه پروتکل چگونه کار میکند، پارامترهای آن چیست و در کدام لایه قرار دارد میتوانید از http://en.wikipedia.orghttp://en.wikipedia.org/wiki/Internet_protocol_suite بهره بگیرید.
پروتکلهایی که باید پوشش داده شوند در جدول زیر قرار دارند. مواردی که با علامت مثبت مشخص شدهاند امتیازی میباشند. همچنین نرمافزار باید امکانات زیر را نیز داشته باشد :
- نمایش آمار مربوط به دادههای شنود شده (تعداد و حجم کل ، تفکیک لایه، تفکیک پروتکل)
- نمایش داده متنی مربوط به پروتکل (در صورتی که پروتکل متنی باشد) با انتخاب آن در لیست و همچنین نمایش مبنای ۱۶ کل داده پروتکل
- نمایش تمام بستههای شنود شده در لیست و امکان انتخاب و مشاهده جزئیات هرکدام از آنها
- در صورتی که بستهای حاوی پروتکلهای خارج از لیست ذکر شده بود، کافیست نوع آنرا Unknown ذکر کند.
موارد زیر نیز دارای نمره اضافی خواهند بود :
- نمایش نمودارهای دایرهای و خطی مربوط به پروتکلهای، لایهها و ترافیک
- درج دادههای متنی که حاوی رمزهای عبور در پروتکلهای مختلف هستند در لیستی مجزا و اعلان به کاربر (در صورتی که پروتکل از زیرساختهای امنیتی استفاده نکند)
- امکان تفکیک (با رنگ یا هر امکانات دیگر) بخشهای مختلف هر بسته در نمایش مبنای ۱۶ و متنی آن
TCP/IP Stack |
---|
Application layer |
Transport layer |
Internet layer |
Link layer |
تحویل
تحویل پروژه به صورت مرحله به مرحله در طی ترم انجام میگیرد. پروژه کامل باید حداکثر تا ۱۰ روز پس از امتحان به صورت حضوری به من تحویل داده شود. تحویل هر پروژه بین ۲۰ تا ۴۰ دقیقه زمان لازم خواهد داشت، لذا هماهنگیهای لازم را صورت دهید. در صورتی که پروژه در فازهای مختلف ارائه نشده باشد و در انتهای ترم نیز به موقع تحویل داده نشود نمرهای برای آن منظور نخواهد شد.
پروژه میتواند در قالب گروههای یک یا دو نفری انجام شود. گروه سه نفری به هیچ وجه پذیرفته نیست. دو نفر اعضای گروه هر دو باید به کلیات و نکات مهم پروژه تسلط کافی داشته باشند، ولی حجم کار یکسان انتظار نمیرود. در صورتی که پروژه به صورت دو نفری انجام شده باشد (حتی با حجم کار نامساوی) در دو عضو نمره مساوی دریافت میکنند. در غیر اینصورت تضمینی برای نمرات یکسان نیست.
در صورتی که پروژه ناقص باشد، حداقل امکانات مورد نیاز آنست که پروژه دیگرتان را بتواند به صورت کامل شنود کند (سرور وب). در صورتی که سوال یا پیشنهادی دارید حتما با بنده تماس بگیرید.