مقدمه‌ای بر tcpdump

همیشه برای بعضی از کاربران سؤالاتی مطرح است که از کدام برنامه برای log گیری شبکه استفاده نمایند. تا زمانی که این خواسته کاربران مشخص نباشد این سؤال بدون جواب باقی می‌ماند.
خوب مسلماً برنامه‌های زیادی با کاربرد‌های زیادی هستند انواع monitoring شبکه را داریم که هریک بنا به رسته خود مورد بحث قرار می‌گیرد و باز در بحث tcpdumpsniffing تقسیم‌بندی های متفاوتی همانند log گیری حجم اطالاعات شبکه، capture کردن داده‌ها، ابزاری برای برنامه‌سازی و غیره موجودند که همزمان با زمان و پروتکل‌ها تغییر می‌کنند.
اما چرا tcpdump ؟ زمانی که کاربری بخواهد در مورد packet ها تحقیق‌ کند باید آن‌ها capture کرده و حال یا از آن‌ها log گرفته و این log مهم است و یا کار با یک grep حل می‌شود. سؤالی که مطرح می‌شود این است که wireshark نیز همین کار را انجام می‌دهد چرا از آن استفاده نشود؟ مسلماً یک کاربر شبکه همزمان بر روی چندین سرور باید برود که هیچ کنسول گرافیکی وجود ندارد و بقیه قضیا… اما اگر در مورد کاربرد wireshark می‌خواهید بپرسید در برنامه‌سازی به شدت کاربرد دارد.

۱. خود برنامه tcpdump

کار با با tcpdump به دو بخش خود برنامه آن و بخش filter نویسی برای آن تقسیم می‌شود. به طوری که حتی manual page های آنان متفاوت می‌باشد. برای خود آن باید (8)tcpdump را مطالعه کرد و برای filter نویسی در tcpdump باید (7)pcap-filter را مطالعه کرد.
این برنامه جزو پروژه pcap می‌باشد که یک library قوی برای capture کردن packet ها می‌باشد.
بهتر است یک مرور کلی بر روی option های اصلی آن داشته باشیم تا به اصل قضیه یعنی نوشتن فیلتر بپردازیم.
همه چیز با تعیین interface مربوطه شروع می‌شود:

بله، در بالا به tcpdump گفتیم به eth0 گوش فرا دهد.
اما بیایید کمی فرمت خروجی را بررسی کنیم:
عملگر < بین دو host قرار می‌گیرند و نشانگر ورودی خروجی سیستم می‌باشند به خط زیر نگاه کنید:

hostname سیستم شخصی من debian می‌باشد packet از سیستم google-public-dns-a.google.com به سیستم من انتقال پیدا کرده است. همانطور که از نامش پیداست resolve کردن بوده یک NXDomain بوده است. به زودی چشمتان با بقیه مقادیر آشنا می‌شود. option های خانواده v- :
v- همانطور که از نامش پیداست verbose mode است. این verbose mode برای فرمت خروجی استفاده می‌شود.
vv- بسته‌‌ها را باز می‌کند. و فیلدهای بیشتری را به نمایش می‌گذارد.
vvv- به صورت کامل گزینه‌ها را نمایش می‌دهد.
نکته: اینجا مثال نمیاوریم چون فرض بر این است که کاربری شما را نمی‌دانیم، به عنوان مثال، گاهی برای شخصی باید یک log بگیرید و به عنوان سند برایش بفرستید که بهتر است log شما کامل باشد. اما نه گاهی نیاز است از tcpdump فقط یک grep گرفته که باز بسته به این که از چه چیزی می‌خواهید grep بگیرید به آن باید گزینه اضافه کنید چون کار خود را سخت کرده‌اید. پس شما باید خود نیازسنجی کنید تا به نتیجه بهتری برسید.
پس خواهشی که وجود دارد نکته بالا را در تمام مثال‌ها رعایت فرمایید.
اما چند مثال ساده:
همانند سایر دستورات مثل netstat شما می‌توانید hostname ها را ندید گرفته و از فرمت IP آن‌ها استفاده نمایید همانند زیر :

tcpdump یک option دارد که به ما کمک می‌کند که تعداد بسته را مشخص کنیم البته بدرد این مقاله می‌خورد، در دنیای واقعی کاربرد کمی دارد ولی به درد آمار در ساعت می‌خورد.
بیایید دستور زیر را بررسی نماییم:

تحلیل پارامتر‌های tcpdump: در ابتدا به آن interface را معرفی کردیم و گفتیم همه چی را بهه صورت numeric برگردان. سپس با c2- به آن گفتیم دو بسته را capture کن. پارامتر A- می‌گوید هر نوع بسته‌ای را capture کند که این اصلاً خوب نیست و در جلوتر با آن برخورد اساسی می‌شود. و در نهایت به صورت full بسته و optionهای آن را از tcpdump درخواست کردیم.

تحلیل بسته‌ها: کافیست کمی با چشم به آن دو بسته که با blank line از هم جدا شده‌اند دقت کنیم. دو بسته از نوع UDP که با طول ۳۵۶ می‌باشند و TTL برابر ۴. البته جزییات خیلی بیشتر قابل رویت‌ هستند. همانطور که قبلاً گفته شد vvv- خیلی از بسته‌ها را بازنموده و این ۲ بسته از نوع Cache می‌باشند به طوری کهX-User-Agent آن‌ها هم مشخص است.
به سادگی می‌توان گزینه server را در آن grep کرده و نتیجه زیر را حاصل کرد:

نکته: دل به این grep کردن خوش نکنیم و به مثال‌های جلوتر که برسیم می‌فهمیم که هر چقدر جلوتر برویم فهممان را باید از شبکه بیشتر کنیم.
آیا بسته با vvv- باز شد؟ بله اما هنوز ابزار شما کمی ناقص است. قبلاً xx- کوچک بود که به صورت hex هدرهایی را باز می‌نمود اما deprecate شد. به دو دلیل:

  • پروتکل‌های جدید را حمایت نمی‌کند.

  • به صورت ASCII پرینت نمی‌کند.

همان xx- را اگر به صورت upercase یعنی XX- به کار ببریم همه چی تغییر می‌کند.به مثال زیر نگاه کنید:

حالا همان را با upercase انجام می‌دهیم:

دومی برای grep عالی است. با تجربه کاری به یاد دارم همکارم با همین vvv- و XX- حمله کننده به سایت را توانست شناسایی کند که به کدام سایت می‌خواهد حمله کند. تنها با grep……!!!! البته فیلترهایی هم نوشت که در جلوتر توضیح می‌دهم.
رکورد در فایل :
بله ممکن است شما بخواهید کل capture را در فایل بنویسید این ۲ راه دارد:

  • شما کل دستور tcpdump را با یک IO/Redirection در یک فایل ذخیره نمایید.

  • با w- در یک فایل ینوسید:

که فایل روبرو ذخیره می‌شد:

نکته: پسوند اینگونه فایل‌ها pcap می‌باشد.
نکته: ممکن است بخواهید گزینه زمان را از خروجی حذف نمایید که می‌توانید از خانواده t- استفاده نمایید. اما توصیه می‌شود برای گرفتن log برای کسی یا جایی که مستند است این کار را انجام ندهید.
حال که گوشه‌‌ای از option های tcpdump را فراگرفتید می‌توان filter نوشتن را فراگرفت.

۲. نوشتن filter

برای اول کار filter نویسی باید ۴ عملگر اصلی شرطی آن را دانست:

  • and یا همان &&

  • not یا همان !

  • or یا همان ||

  • عملگر تساوی یا همان ==

در جلوتر بعضی از عملگر‌های پیشرفته‌تر را نیز توضیح خواهیم داد. (البته در مثال)

همانطور که در فرمان بالا دیدید مسیر بسته‌ها را به بیرون محدود کرده و پورت‌ها را به پورت SSL وب و پورت عادی وب محدود کردیم. این بدان معناست که هرچه request وب داشتیم capture می‌شود.

درخواست بالا به پورت‌های مقصد pops و smpts را capture کردیم.
این چنین می‌توان هم از عملگر and استفاده کرد و هم محدود به یک host شد:

نکته: host می‌تواند IP باشد.
با دستور زیر src host را محدود کردیم به یکی از کلایت‌های شبکه و با دو پروتکل arp و یا icmp آن را and کردیم و از همین ماشین آن را ping کردیم و جواب گرفتیم:

فرمان زیر از عملگر =! اسفاده کرده بود و در خود (8)tcpdump ولی حیفم اومد که براتون نگذارم این تمام type های icmp رو پرینت می‌گره به جز ping و pong در‌واقع type های echo و echo reply:

برای اینکه در خروجی چیزی ببینید، در همین host باید icmp را با دستور زیر بست:

سپس به یک host دیگر رفته و سعی کنیم به این host دسترسی پیدا کنیم و پیغام زیر را در همین host می‌بینیم:

نکته: زمانی که از src و یا dst برای host استفاده نشود ترافیک بین دو host باید capture شود به مثال زیر دقت شود:

ماشینی که بر روی آن tcpdump گرفتیم IP آن 4 می‌باشد و در‌واقع ما اینجا sniff کردیم.

برای تست کردن handshaking می‌توان از filter های زیر استفاده کرد:

tcpdump بزرگتر از آن است که بخواهم در tutorial ساده تمام عملگرهای آن را بگویم و یا filter های آن را اشاره کنم. هر گونه filter آن به یک گونه error بر می‌خورد که این خود تجربه‌ایست برای یک sysadmin. اما امیدوارم توانسته باشم شما را با آن آشنا کرپده باشم.

3 دیدگاه در “مقدمه‌ای بر tcpdump”

    1. این عملگر به معنای عدم تساوی است. همانند زبان C. البته شما یک کاربرد در tcpdump بگید تا اون رو تحلیل کنیم.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *