منبع اصلی نوشتار زیر در این لینک قرار دارد

SSH

درباره ی ساختار آن خودتان مطالعه کنید . اما به طور کلی SSH  ، اطلاعات را رمز می کند . رمزنگاری نیز با استفاده از رمزنگاری کلید عمومی انجام می شود .در الگوریتم های رمزنگاری که برای رمزنگاری ورمزگشایی از یک کلید استفاده می شود رمزنگاری متقارن گفته می شود . در رمزنگاری نامتقارن از کلیدهای جدا برای رمزنگاری و رمزگشایی استفاده می شود . کلیدی که با آن می توان رمزگشایی کرد را بهClientها می دهد کلیدی که می تواند رمز کند را نزد خود نگه می دارد . دقت شود که هرچقدر هم که الگوریتم رمزنگاری قوی باشد، اگر درحین انتقال کلید رمز ، کلید رمز فاش شود هیچ فایده ای ندارد . پس انتقال کلید در فضای تبادل اطلاعات باید بصورت امن انجام شود ( مثلا یک تکه از کلید را با SMS، یک تکه را با ایمیل و ... انتقال دهیم)

-    تنها روش مقابله با passive sniff ، رمزنگاری اطلاعات است ( با SSH ، Tunnel ، VPN و ... )

-    در SSH می توان به نوعی طرف مقابل را با جعل گواهی فریب دارد .

حال می خواهیم با استفاده از wireshark ، sequence number را بررسی کنیم . یکی از بسته های پروتکل telnet را در wireshark انتخاب می کنیم . از منوی Statistics گزینه  Flow Graphics را انتخاب می کنیم . در پنجره باز شده گزینه TCP Flow را انتخاب میکنیم و OK . یک پنجره مانند شکل زیر باز می شود.

Sequence Number را بررسی می­کنیم (برای آن که بتوانیم بعدا حمله TCP Session hijacking را بررسی کنیم). برای آن که در پنجره باز شده شماره ترتیب رابه صورت صفر و یک (relative) نشان ندهد و به صورت real نشان دهد از منوی Edit گزینه preferences را انتخاب می کنیم . درسمت چپ پنجره باز شده قسمت protocols را باز می کنیم ( کلیک بر روی علامت + کنار آن )، انتخاب TCP و سپس در سمت راست پنجره تیک گزینه Relative sequence number… را برمی داریم .

توجه : وقتی در wireshark حجم بسته هایی که sniff شده خیلی بالا برود ، آنالیز آن زمان زیادی می گیرد می­توانید stop بزنید  و آن را save نکنید و دوباره یک wireshark باز کنید و sniff را از ابتدا آغاز کنید .

در ارتباطی که sniff را برای آن انجام دادیم اولین مرحله اش ، SYN است . که سیستم مبدا ( شروع کننده ) یک بسته به سیستم مقصد می فرستد و می گوید که متقاضی ایجاد ارتباط هستم ( درخواست شروع ارتباط). یک شماره ترتیب به صورت تصادفی ایجاد شده و در بسته قرار می گیرد. سیستم مقصد درصورتی که آمادگی داشته باشد ، یک Ack برای Packet که دریافت کرده می دهد ، (Ack ارسال می شود برای اطمینان از دریافت بسته؛ به یاد داریم که TCP ، Connection Oriented  است . جاهایی که دریافت صحیح اطلاعات اهمیت دارد مثل telnet دریافت تاییدیه دریافت یا همان ACK مهم است). حال سیستم مقصد نیز یک شماره ترتیب به طور تصادفی ایجاد می­کند و در بسته قرار می دهد . همچنین ACK بسته قبل ( که برابر است با شماره ترتیب بسته رسیده به اضافه یک) را ارسال می کند . حال سیستم مبدا هم ACK بسته دریافتی را می فرستد که (برابر است با Seq Number دریافتی +1) به این ترتیب ارتباط را ادامه می دهند. در آخر نیز  FIN flag را یک کرده است . ( ممکن است درخروجی نشان داده شده برخی بسته ها دوباره فرستاده شوند و یا چند Ack با هم فرستاده شوند و ...)

این روال و روتین عادی برقراری ارتباط است . اما چه اتفاقی می افتد اگر یک سیستم قبل از شروع ارتباط یک بسته FIN بفرستد (ACK,FIN) ؟ بستگی به پیاده سازی پروتکل TCP در آن سیستم عامل دارد . یک سیستم عامل ممکن است وقتی آن بسته FIN  را می گیرد ignore  کند . یک سیستم عامل ممکن است (RST) reset برگرداند ممکن است Connection Refuse برگرداند. یکی از روش های جمع آوری اطلاعات (OS finger Printing) همین است؛ یعنی بررسی جواب هایی که سیستم عامل های مختلف در برابر بسته های غیرمنتظره برمی گردانند (چون پروتکل TCP/IP مشخص نکرده ، هر سیستم عامل یک تصمیمی گرفته است). برای عوض کردن آن باید کرنل سیستم عامل را عوض کرد . راهکار چیست ؟ دفاع در عمق . می توان یک فایروال قرار دارد که فایروال ( مثل فایروال stateful) بررسی کند که اگر Ack ، FIN آمد آیا قبلا درخواست Connection بوده است که الان در حال بستن آن است یا خیر. درنتیجه آن را drop کند یا ارسال کند.

توجه : آیا از روی بسته ACK می توان OS finger Printing کرد ؟ تا حدی مثلا یکی از روش های ارسال Ack ، piggy backing است . یعنی نمی آید و یک بسته Ack بسازد و ارسال کند بلکه Ack یک بسته را روی بسته ای که خود می خواهد بفرستد سوار و ارسال می کند. مثلا اگر دستور ls زدید ، ACK دستور ls را به بسته خروجی می چسباند و برمی گرداند . با توجه به این رفتارها می توان ، مسائلی کلی را بدست آورد ولی این که صرفا با استفاده از ACK بتوان سیستم عامل را تشخیص داد این گونه نیست بلکه ترکیبی از ACK ، FIN ، RST و حالت های مختلف ، را باید بررسی کرد . چون خود سیستم عامل ها هم به خاطر این قضیه ( جلوگیری از شناسایی ) پاسخ مشابه هم می دهند . باید این روش را با روش های دیگر مثل banner grabbing ، ttl و ... ترکیب کرد و شباهت ها واختلافات را بدست آورد .