انگشتنگاری سیستمعامل
حالا که چند اسکن انجام دادهاید و اطلاعات بازگشتی را یادداشت کردهاید (حتماً در حال مستندسازی این موارد هستید، درست است؟)، میتوانیم به سراغ وظیفه جدیدی برویم که تلاش برای شناسایی کمی بهترِ سیستمهاست. در پشت آن پورتهای باز و بسته، یک سیستمعامل قرار دارد و ما اکنون میخواهیم با انجام برخی انگشتنگاریها (Fingerprinting) ماهیت سیستمعامل را تأیید کنیم.
این فرآیند به دلیلی بسیار خوب انگشتنگاری نامیده میشود: تلاش میکند یک سیستمعامل را با «اثر انگشتهای» منحصربهفردی که بازمیگرداند شناسایی کند. آن اثر انگشتها (بسیار شبیه به اثر انگشت انسانها) میتوانند با پایگاه دادهای از اثر انگشتهای شناختهشده مقایسه شوند تا با درجات مختلفی از دقت تعیین کنند هدف چه سیستمعاملی را اجرا میکند. در عمل اطلاعات کافی وجود دارد تا به وضوح نشان دهد یک سیستم خاص چیست. ما فقط باید بدانیم چگونه به دنبال این جزئیات منحصربهفرد بگردیم و تعیین کنیم چه معنایی دارند.
ابتدا بدانید که دو نوع انگشتنگاری وجود دارد: غیرفعال (Passive) و فعال (Active). جدول ۱ این دو را با هم مقایسه میکند.
جدول ۱: انگشتنگاری فعال در برابر غیرفعال
| ویژگی | فعال (Active) | غیرفعال (Passive) |
|---|---|---|
| نحوه کار | از بستههای به طور خاص ساخته شده (Specially crafted packets) استفاده میکند. | از تکنیکهای شنود (Sniffing) برای ضبط بستههایی که از یک سیستم میآیند استفاده میکند. |
| تحلیل | پاسخها با پایگاه دادهای از پاسخهای شناختهشده مقایسه میشوند. | پاسخها تحلیل میشوند و به دنبال جزئیات سیستمعامل میگردند. |
| شانس شناسایی | بالا، زیرا ترافیک را وارد شبکه میکند. | پایین، زیرا شنود ترافیکی را وارد شبکه نمیکند. |
برای آسانتر کردن این موضوع، فقط بدانید که تمام تکنیکهای انگشتنگاری بر اساس تشخیص تفاوتهای ظریف در بستههای تولید شده توسط سیستمعاملهای مختلف است.
تکنیکهای رایج بر اساس تحلیل موارد زیر هستند:
- مقادیر IP TTL
- مقادیر IP ID
- اندازه پنجره TCP (TCP Window size)
- گزینههای TCP (معمولاً در بستههای TCP SYN و SYN+ACK)
- درخواستهای DHCP
- درخواستهای ICMP
- بستههای HTTP (معمولاً فیلد User-Agent)
- سرویسهای در حال اجرا
- الگوهای پورت باز
انگشتنگاری فعال با Nmap
یکی از سادهترین راهها برای تشخیص سیستمعامل راه دور، استفاده از nmap است. nmap دارای ویژگیهای بسیاری است و تشخیص سیستمعامل یکی از قابلیتهای مفید برای کمک به این بخش از فرآیند است. برای انجام این انگشتنگاری، nmap محدودهای از بستههای TCP و UDP را به سمت سیستم هدف شلیک میکند و سپس به دنبال پاسخهای بازگشتی میگردد. پاسخها به طور عمیق تحلیل میشوند تا سرنخهایی از ماهیت سیستمعامل پیدا شود. هنگامی که دامنه تستها تکمیل شد، nmap یافتهها را با پایگاه دادهای که همراه محصول عرضه میشود مقایسه میکند تا به دنبال تطابق بگردد. هنگامی که تطابق پیدا شد، نتایج را به کاربر ارائه میدهد. این نتایج علاوه بر خود سیستمعامل، حاوی هر اطلاعات دیگری که قابل استخراج باشد نیز خواهد بود، مانند زمان روشن بودن (Uptime) و اطلاعاتی در مورد اینکه آیا سیستم یک کامپیوتر است یا یک دستگاه سختافزاری.
برای انجام تشخیص سیستمعامل با nmap دستور زیر را اجرا کنید:
nmap -O <ip address>
این دستور نتایجی مانند زیر به دست میدهد (برای اهداف آموزشی، این اسکن علیه یک دستگاه سختافزاری انجام شده است):
Device type: WAP|general purpose|router|printer|broadband router Running (JUST GUESSING) : Linksys Linux 2.4.X (95%), Linux 2.4.X|2.6.X (94%), MikroTik RouterOS 3.X (92%), Lexmark embedded (90%), Enterasys embedded (89%), D-Link Linux 2.4.X (89%), Netgear Linux 2.4.X (89%)
توجه کنید که nmap نهتنها سیستمعامل را حدس میزند؛ بلکه احتمالات را به ترتیبِ کاهشِ اطمینان رتبهبندی میکند. همچنین توجه داشته باشید که نتایج به طور خاص به دستگاه نیز اشاره میکنند.
انگشتنگاری غیرفعال یک سیستمعامل
برای انجام تحلیل غیرفعالِ یک سیستمعامل، تغییر استراتژی لازم است، که به معنی تحلیل دقیقتر تغییرات ظریف در ترافیک شبکه مشاهده شده است. از جمله روشهای متعدد، بازرسی مقدار TTL اولیه (Initial Time To Live) در هدر یک بسته است. مورد دیگری که میتوان در هدر بسته تحلیل کرد، اندازه پنجره (Window Size) مورد استفاده در بستههای TCP در طول مراحل SYN و SYN+ACK دست دادن سهمرحلهای است. جدول ۲ برخی از مقادیر TTL اولیه و اندازه پنجره معمولی سیستمعاملهای رایج را نشان میدهد.
جدول ۲: مقادیر اولیه برای نسخههای رایج سیستمعامل
| سیستمعامل | IP Initial TTL | TCP Window Size |
|---|---|---|
| Linux | 64 | 5840 |
| Google customized Linux | 64 | 5720 |
| FreeBSD | 64 | 65535 |
| Windows XP | 128 | 65535 |
| Windows Vista, 7 and Server 2008 | 128 | 8192 |
| Cisco Router (iOS 12.4) | 255 | 4128 |
یکی از ابزارهای مبتنی بر لینوکس که در انجام انگشتنگاری غیرفعال بسیار مؤثر است، p0f است. این ابزار برای تحلیل غیرفعال ترافیک شبکه و نمایش اطلاعات مربوط به سیستمعاملهایی که اطلاعات را منتقل میکنند، استفاده میشود. از آنجا که این ابزار مستقیماً هدف را نشانه نمیگیرد و فقط ترافیک را مشاهده میکند، بسیار مخفیکار است.
از آنجا که ترافیک TCP را میتوان با ترکیبهای مختلف پرچمها و سایر ویژگیها شناسایی کرد، هنگامی که بستهها توسط p0f رهگیری میشوند، با پایگاه دادهای از ویژگیهای شناختهشده مقایسه میشوند که تعیین میکند چه سیستمعاملی آنها را ارسال کرده است.
آگاه باشید که انگشتنگاری سیستمعامل به صورت غیرفعال در برخی موارد زمان بیشتری نسبت به انگشتنگاری فعال برای ارائه پاسخ میبرد. این به این دلیل است که برای دریافت اطلاعات به شنود (Listening) متکی است نه تولید فعالانه ترافیک. روش غیرفعال همچنین در بسیاری از موارد میتواند کمتر از روشهای فعالِ متناظر قابل اعتماد باشد.
برای استفاده از p0f به دسترسی به سیستمعامل لینوکس نیاز خواهید داشت.
تمرین ۱: استفاده از p0f
در این تمرین از p0f برای شناسایی سیستمعاملهای راه دور استفاده خواهید کرد.
- در کالی یک پنجره ترمینال باز کنید.
- در خط فرمان
ifconfigرا وارد کرده و Enter را فشار دهید. - هنگامی که لیست نتایج را دیدید، نام رابط شبکه (Network Interface) را که میخواهید روی آن گوش دهید یادداشت کنید (مثلاً
eth0یاwlan0)؛ رابطهای شبکه فعال معمولاً یک IP به آنها اختصاص داده شده است. - در خط فرمان p0f را راه اندازی کنید و با استفاده از دستور زیر آن را وادار به گوش دادن روی یک رابط کنید:
برای مثال، اگر میخواهید روی
sudo p0f –i <interface name>eth0گوش دهید، وارد کنید:sudo p0f –i eth0 - اکنون که p0f در حال گوش دادن است، پنجره فرمان را باز بگذارید و یک مرورگر وب باز کنید.
- در مرورگر خود آدرس یک وبسایت را وارد کنید (مهم نیست کدام یک) و Enter را فشار دهید.
- به پنجره فرمان p0f برگردید و خواهید دید که ترافیک به سرعت جریان مییابد. اگر لیست را بالا و پایین کنید، خواهید دید که سیستمعاملهایی که ترافیک ارسال میکنند همانطور که توضیح داده شد شناسایی میشوند.
اکنون که نحوه عملکرد p0f را در عمل دیدید، میتوانید آن را بدون استفاده از مرورگر وب امتحان کنید. همچنین سعی کنید از ابزارهای دیگر استفاده کنید یا به سادگی به یک اشتراک شبکه (Network Share) یا منبع دیگر متصل شوید. در هر مورد همان نوع فعالیت را از p0f خواهید دید.
ابزار موجود در تمرین که به نام p0f شناخته میشود، شکلی از چیزی است که معمولاً اسنیفر (Sniffer) نامیده میشود. در حالی که این شکلی از شنودگر شبکه است، اما هنوز بسیار مقدماتی است. ما در بخش ۹ («شنودکنندهها») زمانی که به ابزاری به نام Wireshark نگاه میکنیم، اسنیفرهای پیشرفتهتر و تواناتر را پوشش خواهیم داد.
گرفتن بنر (Banner Grabbing)
با در دست داشتن اطلاعات سیستمعامل و همچنین دادههایی در مورد پورتهای باز، صحنه برای حفاری کمی عمیقتر آماده است. کاری که میتوانیم در آن درگیر شویم به عنوان گرفتن بنر شناخته میشود.
گرفتن بنر برای تعیین اطلاعات درباره سرویسهای در حال اجرا روی یک سیستم طراحی شده است و برای هکرهای قانونمند در طول فرآیند ارزیابی بسیار مفید است. معمولاً این تکنیک با استفاده از Telnet برای بازیابی اطلاعات بنر در مورد هدف که ماهیت سرویس را آشکار میکند، انجام میشود.
یک بنر چیزی است که یک سرویس به برنامه درخواستکننده بازمیگرداند تا اطلاعاتی درباره خودِ سرویس بدهد. اطلاعاتی که بنر آشکار میکند میتواند متنوع باشد، اما در مورد HTTP میتواند شامل نوع نرمافزار سرور، شماره نسخه، زمان آخرین تغییر و اطلاعات مشابه باشد.
در بسیاری از موارد Telnet کلاینت انتخابی برای بازیابی این اطلاعات است. اگرچه ابزارهای دیگری وجود دارد (که در یک لحظه به چند مورد از آنها خواهیم پرداخت)، ما روی Telnet تمرکز خواهیم کرد زیرا رایجترین و سادهترین است. اکثر سیستمعاملها با قابلیت برقراری جلسات Telnet عرضه میشوند، بنابراین این یکی از راههای اصلی انجام گرفتن بنر است. چه از Telnet و چه از برنامه دیگری استفاده شود، بنرها با اتصال به یک میزبان و سپس ارسال درخواست به پورتی که با یک سرویس خاص مرتبط است (مانند پورت ۸۰ برای HTTP) گرفته میشوند.
Telnet در تمام نسخههای ویندوز گنجانده شده است، اما از ویستا به بعد، باید از طریق Control Panel با روشن کردن ویژگی مربوطه فعال شود. کلاینت از ویندوز حذف شد — به دلایلی که احتمالاً برای مایکروسافت مشخص است — اما کاملاً غیرقابل دسترس نشده است.
پس چگونه از Telnet برای گرفتن بنر از یک سیستم استفاده میکنید؟ از دستور زیر برای باز کردن اتصال Telnet به کلاینت راه دور برای دریافت بنر سرویسها استفاده کنید:
telnet <ip address> <port>
برای بازیابی سند و همچنین هدرها، از GET به جای HEAD استفاده کنید. اگر سند ریشه (Root Document) را میخواهید، از دستور زیر استفاده کنید:
GET / HTTP/1.1
(یا HEAD / HTTP/1.1)
نتیجه چیزی شبیه به این خواهد بود:
HTTP/1.1 200 OK Date: Feb, 22 Jan 2015 22:13:05 GMT Server: Apache/1.3.12-Turbo Connection: close Content-Type: text/html
این فرآیند با استفاده از Telnet با نحو زیر شروع میشود:
telnet <target IP address or hostname> 80 HEAD / HTTP/1.0
(توجه: پس از دستور HEAD باید دو بار Enter را فشار دهید)
اگر به نتایج دقت کنید، متوجه خواهید شد که خطی که با Server مشخص شده است حاوی اطلاعاتی در مورد نوع خودِ سرور است. این اطلاعات را در هدفگیری حمله خود مفید خواهید یافت.
Telnet تنها راه جمعآوری این اطلاعات نیست، اما اساسیترین و سرراستترین روش موجود است. در اینجا برخی ابزارهای دیگر وجود دارد که باید لحظهای وقت بگذارید و بررسی کنید:
- Netcraft: این یک ابزار آنلاین است که برای جمعآوری اطلاعات درباره سرورها و وبسرورها طراحی شده است. شما این ابزار را در فاز ردپایابی دیدید، اما در اینجا نیز مفید است.
- Xprobe: یک ابزار لینوکس است که میتواند اطلاعاتی درباره یک سیستم بازیابی کرده و به جمعآوریکننده ارائه دهد.
- p0f: این ابزار در پلتفرم لینوکس موجود است؛ ترافیک رد و بدل شده بین کلاینت و سرور را تحلیل میکند. این ابزار تحلیل بلادرنگ (Real-time) ترافیک را ارائه میدهد که میتواند روی صفحه نمایش داده شود یا برای تحلیل بعدی در فایلی ذخیره شود.
- Maltego: این نرمافزار هم در لینوکس و هم در ویندوز موجود است و قابلیت نهتنها جمعآوری اطلاعات بلکه تجسم روابط بین هر آیتم را فراهم میکند. این نرمافزار قابلیت مشاهده اطلاعات وبسرور و همچنین فناوریای که وبسایت برای اجرا به آن متکی است را دارد.