که ما تا به حالا یک گریزی به مراحل بالا زده ایم. در هر کدام از این مراحل یک سری ابزار public وجود دارد میتوان از آن استفاده کرد یک سری هم ابزار مخصوص وجود دارد.
یکی از ابراز های public که در این راستا میتوان از آن استفاده کرد telnet است.
یادآوری: در شبکههای کامپیوتری برای برقراری ارتباطات از پروتکل TCP/IP استفاده میشود. در TCP/IP یک سری قواعد و قوانین برای برقراری ارتباط بیان شده است که از جمله آن ها دست تکانی سه مرحله ای است (three way handshaking)
یادآوری: استاندارد TCP یک استاندارد defacto است. ابتدا قرار بود که مدل OSI بیاید اما نیاز صنعت، نمی توانست منتظر ارائه شدن OSI بماند بدین ترتیب از پروتکل TCP/IP استفاده شد که مجموعه ای از پروتکل ها مثل (ICMP, UDP و…) است.
یادآوری: اگر همه کامپیرترهایمان Apple بود آن گاه می توانستیم از پروتکل Apple talk استفاده کنیم.
یادآوری: Circuit switching , packet switching: برای برقراری ارتباط در مدل Circuit switching بین هر دو نود، یک مدار ایجاد میشود. اما در مدل packet switching راهکار این است که اطلاعات را بسته بسته کنیم و داخل شبکه بفرستیم. این بسته ها توسط الگوریتم های مختلف هدایت میشوند تا به مقصد برسند. بستر TCP/IP بر روی packet switching بنا شده است یعنی اطلاعات بسته بسته تنظیم و ارسال میشوند. این بستهها که می خواهند ارسال شوند، مشخصه هایی مثل آدرس گیرنده، آدرس فرستنده، پورت گیرنده، پورت فرستنده و … به آنها اضافه میشوند. پورت برای تمایز سرویس ها (پروسس ها) از هم ایجاد شد؛ برای اینکه وقتی چند سرویس در حال اجرا است و یک بسته وارد کامپیوتر ما میشود، مشخص شود این بسته به کدام پروسس (سرویس) تحویل داده شود.
telnet پروتکلی است که در بستر TCP/IP فعالیت میکند. سرویس telnet که برای سیستم های راه دور و command زدن استفاده میشود، از پورت 23 استفاده میکند.
یعنی اگر از هر جای دنیا به پورت 23 یک سیستم وصل شوید، می توانید انتظار داشته باشید که یک telnet server روی آن باشد (نرمال آن این است که یک telnet server در آن طرف باشد).
دستور telnet به طور پیش فرض یک IP میگیرد (IP یک telnet server)
اما در زمانی که میخواهیم شناسایی مقدماتی سیستم هدف را انجام دهیم میتوانیم از دستور telnet استفاده کنیم و آن را تنظیم کنیم به طوری که به جای اینکه به پورت 23 وصل شود به پورت 20 وصل شود. به آن پورت وصل میشود اما چون زبان آن پورت را نمی فهمد، گوش میکند و فقط اطلاعاتی را که میآید به ما نشان میدهد (چون هر سرویس زبان خود را دارد).
حال در فاز شناسایی مقدماتی هدف میخواهیم وصل شویم به پورت های مختلفی که یک سرور با IP مشخص دارد. برای اینکه به telnetبگوییم به پورت دیگر وصل شود از دستور زیر استفاده میکنیم.
telnet 192.168.100.10 22
پورت 22 به پورت پیش فرض SSH server است. زمانی که دستور بالا را وارد می کنید. یک پیغام مانند پیغام زیر نمایش داده میشود.
ssh-:O-open SSH 4.3
ssh پروتکل است و 2 ورژن آن است. Open SSH یک Application است که به عنوان سرور نصب شده است میتوانیم SSH های دیگری نصب کنیم.
این عبارت میگوید از چه پروتکلی استفاده میکنند و همچنین میگوید open SSH بر روی آن سیستم نصب است. حال شما عین این عبارت را تایپ کنید و اینتر بزنید.
به این کاری که در حال انجام آن هستیم banner grabbing می گوییم.
اگر روی open SSH یک plug in نصب باشد میتوان یک exploit برای آن plug in بدست آورد.
سوال: میتوان پیغام پیش فرض (مثلا open SSL4.3) را به عبارتی دیگر عوض کرد؟ میتوان عوض کرد (با عوض کردن کد یا config). اما فردی که می خواهد به آن وصل شود باید واقعاً بداند که آن سرور SSH چه ورژنی است؛ برای آن که بتواند با آن ارتباط برقرار کند. دقت کنید که سرور SSH را run کردید که admin از آن استفاده کند، admin هم باید ورژن را درست تشخیص دهد تا با فرمان آن ورژن با آن صحبت کند) پس اگر پیغام را عوض کردیم باید client هایی که قرار است از آن استفاده کنند را هم آگاه کنیم.
مثال دیگر: تمام وب سرورها روی پورت 80 هستند (پورت پیش فرض چرا؟). اگر روی پورت دیگر باشد چون بازدید کنندگان از آن آگاه نیستند (همه پورت پیش فرض را می دانند) پس امکان بازدید برای آن ها فراهم نمیشود.
خوب تا حالا مرحله جمعآوری اطلاعات مقدماتی را انجام دادیم. و هر اطلاعاتی را که میشد بدست آوردیم. در مرحله بعد که شناسایی مقدماتی هدف است کارهایی مثل banner grabbing ، OS finger printing میکنیم. Banner grabbing یعنی گرفتن بنرها. مثلا وقتی به telnet سروری وصل می شوید، به شما میگوید welcome to X server (منظور از X یک عبارت است). این عبارت میشود بنر آن سرور telnet. Os finger printing (اثر انگشت سیستم عامل): هر سیستم عامل ویژگی و رفتارهای مشخص خود را دارد که وقتی این ویژگی و رفتارها را از یک سیستم می بینیم می توانیم نوع سیستم عامل را تشخیص دهیم. مثال زیر استفاده از دستور ping برای انجام finger printing را نشان میدهد. برای مثال یک IP از سرور لینوکس را ping کنید و یک IP از سرور ویندوز را ping کنید.
نکته: whois ابزاری است در لینوکس، در اینترنت نیز وجود دارد. کافی است عبارت whois sharif.ir را در Google جستجو کنید، اطلاعات آن را میدهد (مثل اطلاعات ثبت دامنه و مشخصات دیگر).
یادآوری: دستور ping در پروتکل (Internet Control Message Protocol) ICMP است. ICMP برای گرفتن اطلاعات کنترلی از شرایط شبکه است. Ping یک سری بسته به سمت سیستم مقصد میفرستد، سیستم مقصد مختار است پاسخ دهد به این بسته ها یا ندهد. اگر سیستم پاسخ داد، پی میبریم که آن سیستم وجود دارد. (شکل 5).
شکل 5
همانطور که در شکل 5 می بینید پاسخ بسته ping دارای فیلدهایی مثل bytes است که نشان دهنده تعداد بایت های ارسال شده از مقصد است. فیلد time<l ms نشان میدهد که اطلاعات کمتر از l ms بدست آمده است و یک فیلد دیگر به نام (Time to Live) TTL. در هنگام ساخته شدن یک packet، فیلد ttl که یک شمارنده است، داخل آن بسته set میشود، حل این بسته از هر hop که عبور میکند یک واحد از مقدارش کم میشود. به محض اینکه این مقدار منفی شد، این بسته، drop میشود. علت آن این است که در شبکه ممکن است بسته های سرگردان وجود داشته باشند، برای اینکه این بسته های سرگردان در شبکه از بین بروند، این فیلد قرار داده شده است. مقدار فیلد ttl که در یک بسته set میشود، بسته به نوع سیستم عامل متفاوت است (به طور پیش فرض، که البته میتوان آن را عوض کرد).
توجه: پیاده سازی های مختلف میتواند از یک پروتکل وجود داشته باشد. مثلا ویندوز یک پیاده سازی دارد و لینوکس یک پیاده سازی دیگر از همان پروتکل. حال وقتی که سیستم عامل لینوکس که دارای آیپی 192.168.100.132 است را ping کردیم ttl آن برابر 64 است. اما در پاسخ ping که از سیستم عامل ویندوزی (با آیپی 192.163.100.128) بدست آمده است این مقدار برابر 128 است. حال، یک سیستم را ping میکنیم اگر مقدار ttl در پاسخ 128 بود می گوییم احتمالا سیستم عامل آن سیستم ویندوزی است اگر 64 بود احتمالاً لینوکسی است.
سوال: اگر در ping، پاسخی بر نگشت یعنی سیستم خاموش است (وجود ندارد)؟ خیر، عواملی مثل تنظیمات خود سیستم ، روتر و … میتواند باعث شود که پاسخ ping ارسال نشود. برای مثال ممکن است که یک وب سایت را ping می کنید. پاسخی داده نشود چرا؟ چون ping را بسته است.
مثال دیگر: در این مثال میخواهیم کاری کنیم که پاسخ ping علی رغم وجود سیستم هدف، ارسال نشود.
حال در سرور با 192.168.100.132 IP که یک سیستم عامل لینوکس بر روی آن نصب است. پاسخ ping را می بندیم. با استفاده از دستور زیر این کار را انجام می دهیم.
echo “1” > /proc/sys/net/ipv4/icmp_echo_ignore_all#
دستور ping 192.162.100.132 –t را اجرا کنید و خروجی آن را مشاهده نمایید.
همانطور که می بینید با استفاده از تنظیم پیکر بندی میتوان جلوی بیرون رفتن اطلاعات را گرفت. با تغییر یک مقدار در cmp-echo-ignore-all در زیر شاخه /proc (شاخه ای است که تغییراتی را در کرنل میتوان داد) توانستیم رفتار سیستم را عوض کنیم.