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

امنیت بیش تر SSH با Source Port هایی خاص در سوکت ارتباطی

سلام دوستان . زمانی که بحث سر امنیت پیش میاد یک سری از فاکتور ها روی میز میاد که رعایت کردنشون ما رو به امنیتی بیش تر هدایت می کنند . یکی از همین فاکتور ها که توسط خیلی از وب مستر ها و ادمین ها استفاده می شود , این است که پورت پیش فرض SSH را به پورتی ناشناس تغییر دهند . به عنوان مثال پورت پیش فرض که 22 است را به 202 تغییر می دهند .

با این کار برای دسترسی به SSH مجبور به استفاده از پورت 202 به جای 22 هستیم . خب ! یک بار دیگه این جمله رو بخوانید ! از 202 به جای 22 استفاده می کنیم یعنی داخل putty و یا … پورت پیش فرض رو تغییر می دیم , یعنی پورت مورد نیاز برای اتصال به مقصد که 22 بود را به 202 تغییر می دهیم . یعنی 202 پورت مقصد ما می باشد ( با فرض این که بر روی سیستم خود نشسته ایم و قصد ارتباط با سرور را داریم )

طبیعتا همان طور که پورتی برای ارتباط با سرور مقصد در نظر گرفته می شود , پورتی نیز این طرف بر روی سیستم ما نیز ایجاد میشود تا یک session ارتباطی بین کلاینت و سرور برقرار شود . این پورت ایجاد شده معمولا کمتر دیده میشه و یا شاید اصلا دیده نشه چرا که شاید کاربرد آن چنانی ای نداشته باشه ! ضمن این که این مورد رو شاید فقط در برنامه های پکت کپچر بشه دید و حسش کرد که بله یک پورت local ای به عنوان source port برای ارتباط ایجاد می شود .

خب ما تا این جای کار destination port را از 22 به 202 تغییر دادیم . پس فرد Attacker مجبور است تک تک پورت ها را چک کند تا در نهایت پورت ارتباطی از طریق SSH را پیدا کند . خب حالا نظرتون در مورد قبول کردن پکت هایی که از یک source port خاص میان چیه ؟ تاکید می کنم که source port های ایجاد شده در هر کانکشنی ( چه ssh و چه telnet و یا http و … ) به صورت پیش فرض از پورت هایی Random هستند .

بیاید همین حرف رو با هم در سناریو زیر بررسی کنیم :

فرض ها :

سرور : 20.20.20.2

کلاینت : 20.20.20.1

ابتدا در سرور با استفاده از یک برنامه ی پکت کپچر , روی interface سرور میایم و پکت های روی پورت 22 و پروتکل TCP رو مانیتور می کنیم . به صورت زیر :

tcpdump -i eth0 tcp port 22

حالا در کلاینت کافیست آی پی سرور را روی پورت 22 تلنت کنیم . به صورت زیر :

telnet 20.20.20.2 22

 

نتایج :

1. پورت 22 روی سرور باز است پس طبیعتا خروجی telnet مبنی بر ارتباط و باز بودن پورت است :

012. گفتیم که برنامه به صورت پیش فرض از یک پورت random جهت source port استفاده می کند . پس :

02به کادر قرمز توجه کنید , همان طور که ملاحظه می شود source port در این جا 49998 است که random توسط telnet انتخاب شده است .

 

 سوال :

حالا فرض کنید که ما علاوه بر تغییر destination port به پورتی دیگر مثل 202 , source port را هم روی یک پورت خاص در نظر بگیریم ! نتیجه این می شود که نفوذگر به عنوان مثال پورت 202 و یا حتی 22 ما را پیدا می کند اما از آن جایی که source port تعیین شده توسط ما را نمی داند , نمی تواند با سرور ارتباط برقرار کند !

نتیجه ی این کار این است که اگر سرور را روی پورت 202 و یا حتی 22 اسکن کنه و یا حتی سعی کنه ارتباط برقرار کنه , با close بودن پورت مواجه خواهد شد ! اما برای عملی کردن این سناریو به شکل زیر عمل می کنیم :

 

سرور :

ابتدا داخل سرور تعیین می کنیم که تنها ارتباط های روی destination پورت 22 و source پورت 23230 از هر جایی بتوانند با سرور ارتباط برقرار کنند . پس رول زیر را در سرور set می کنیم :

iptables -t filter -I INPUT -p tcp --sport 23230 --dport 22 -j ACCEPT

حالا تمامی پکت هایی که روی پورت 22 می آیند اما source port آن ها 23230 نیز را reject می کنیم . پس از رول زیر در سرور استفاده می کنیم :

iptables -t filter -A INPUT -p tcp --dport 22 -j REJECT

 

کلاینت :

همان طور که در بالا گفته شد , برنامه ها به صورت پیش فرض برای ارتباط با مقصد از یک پورت random جهت source port استفاده می کنند . حال باید کاری انجام بدیم که header بسته های ما روی پورت 22 ادیت بشه و source port های random آن به source port ای که مد نظرمون هست , یعنی 23230 تغییر پیدا کنه ! برای این منظور من از یک رول Source Nat در iptables استفاده می کنم .

یعنی میام تمامی درخواست های روی پورت 22 که از interface سیستمم قرار هست خارج بشه رو src port اون ها رو ادیت می کنم و پورتی رو جایگزین می کنم که مد نظرم است . پس :

iptables -t nat -A POSTROUTING -p tcp --dport 22 -j SNAT --to 20.20.20.1:23230

رول بالا باعث میشه که تمامی درخواست های ما روی پورت 22 روشون عمل SNAT انجام بگیره اما توجه داشته باشید که قرار است فقط روی یک سرور خاص همچین سناریو ای رو پیاده سازی کنیم . پس بهتر است که در رول بالا آی پی آدرس مقصد رو هم مشخص کنیم . یعنی :

iptables -t nat -A POSTROUTING -p tcp -d 20.20.20.2 --dport 22 -j SNAT --to 20.20.20.1:23230

حال اگر یک بار دیگر tcpdump را در سرور اجرا کنیم و روی پورت 22 از سرور telnet بگیریم , باید نتایج زیر را بدست آوریم :

 

1. خروجی telnet حاکی از برقرار ارتباط است :

05

2. source port های کلاینت در tcpdump همگی 23230 خواهند بود :

06

حال من یک interface به سرور اضافه می کنم و آی پی آن را 192.168.229.130 در نظر می گیریم . پس سرور من دو interface با دو آی پی دارد که رول های مربوط به source port ها در آن set شده است . پس :

سرور من :

eth0 : 20.20.20.2
eth1 : 192.168.229.130

حالا از سیستم دیگری که روی رنج آی پی interface دوم سرور قرار دارد , سرور رو با استفاده از nmap در دو حالت اسکن می کنیم :

حالت اول : با استفاده از source port رندومی که خود nmap تعیین می کند :

nmap -p 22 192.168.229.130

03حالت دوم : با استفاده از source port ای که ما تعیین می کنیم . یعنی پورت 23230 :

nmap -p 22 -g 23230 192.168.229.130

04

 

ممنون که تا آخر این مقاله با ما بودید . با تشکر

منبع : او اس لرن | http://OSLearn.ir

نویسنده : E2MA3N

 

برای بحث در تاپیک مربوطه کلیک کنید



برچسب ها : , , ,