الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

ما معنى Port Knocking

بدأه HGB في 18 أكتوبر 2008 · 7 رد · 6,257 مشاهدة · في قسم أمن المعلومات العام
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

21/ Port Knocking

Port knocking هي تقنية تستخدم Firewall لكي نستطيع أن نصل ل port معين لإستخدام الخدمة التي تعمل على ذلك المنفذ بشرط أن نقوم بعمل الطرقات السحرية على سلسلة Ports وهمية وبالترتيب ! الموضوع يشبه Secret Knock الذي يستخدم في أوكار العصابات والذي يجب أن يؤديه الطارق بالشكل المطلوب ليفتح له الباب :lol:

لم أجد شي عن الموضوع في Windows بإستخدام ISA Server , وإن كنت أظن أن تطبيقه ممكن , لكن ال Iptables في لنكس لهي شيء جبار فعلا ! ويمكنك عن طريقها فعل أمور لاتخطر على البال إضافة لوجود عدة add-ons يمكنها توسيع إمكانياته وبشكل أكبر .

الطرقات السرية التي سنقوم بها لفتح منفذ خدمة مهمة لانريد لأي hacker أو عابث أن يصل إليها لأنها مهمة , ولو كان تخطيها صعب إلا أن ال Secret Knock ستعطل المخترق بشكل لايمكن تخيله !

بعض الخدمات المهمة في السيرفر والتي تريد تأمينها دائما Telnet Service "والتي يجب أن لاتستخدم في الإتصال بالسيرفر أساسا لأنها لاتستخدم التشفير وكل البيانات يتم إرسالها ك Plain Text " , وأيضا خدمة SSH , خدمات أخرى ك WHM أو Direct Admin من التي تساعد في الوصول لتحكم كبير في السيرفر من على بعد وقس على ذلك .

لو كانت هناك خدمة SSH تعمل في سيرفر بعيد في المنفذ رقم 22 وكان رقم آيبي الجهاز 10.10.10.1 مثلا وقمت بعمل التالي من جهازك من ال Commandline :

# telnet 10.10.10.1 22
Trying 10.10.10.1
Connected to 10.10.10.1
Escape charachter is '^]'.
SSH-1.99-OpenSSH_5.0

فستجد رسالة قريبة من التي في النص أعلاه توضح أن الإتصال تم وعليك بإكمال سلسلة الإتصال للولوج , لو إستخدمت برنامج ك PuttySSH أو من ssh command in linux يمكنك بعد ال connection كتابة user & pass الخاصين بإحدى الحسابات على السيرفر بعد ذلك الدخول المباشر . تفاصيل طريقة الإتصال في SSH ليس مايهمنا الآن وإنما يجب أن نعرف شيء مهم فقط من البداية أن عمل sniffing على ssh traffic هو مضيعة وقت خصوصا لو كان مفتاح التشفير المستخدم بين client-server كبير 256bit مثلا ويمكن أن يصل ل 1024-2048 bit , فهنا نقول بالتوفيق لمن يحاول فكها .

موضوعنا هنا نريد تأمين مرحلة ماقبل الإتصال نفسه لكي لاتستطيع أساسا أن تكتب :

telnet 10.10.10.1 22

لتحقق إتصال مالم تقرع على عدة Ports في البداية ;) . لتحقيق ذلك سنستخدم iptables الموجود بصورة إفتراضية مع توزيعات Linux ويمكن أيضا إستخدام APF المدعوم في نسخ Unix لكن سنستخدم Iptables حيث هو للأغلبية .

يفترض أن تكون لديك خلفية عن طريقة عمل Iptables لذلك لن أتناول الأساسيات لأنها كثيرة جدا , ويكفي أن نبدأ مباشرة ونشرح في الطريق .

لنستطيع الإتصال بال SSH سنطرق على المنافذ 33331 ثم 44221 ثم 23239 ثم 54371 وأخيرا وخلال خمس ثواني كحد أقصى عمل الإتصال الحقيقي مع المنفذ 22 لو كانت الخدمة تعمل في ذلك المنفذ وهي كذلك بشكل إفتراضي .

الطرق عبارة عن إرسال أي Packet مهما كانت ويمكن أن تتحكم في ذلك من iptables كما سنرى , لكن ماسنفعله هو أن نرسل Packet TCP للبورتات بهذا الترتيب في الأعلى .

1. يجب في أي جدار ناري عمل DROP لجميع ال packets في INPUT CHAIN أو OUTPUT أو FORWARD بشكل إفتراضي وأن نفتح فقط ال Ports التي نحتاجها للخدمات التي تعمل , للتأكد أكثر من أنه حتى لو أصاب الجهاز Trojan أن يكون تأثيره أخف ومحدود . لن يؤثر إغلاق المنافذ على Port Scaning , Port Sweep فكل شيء سيكون مكشوف أمام هذه البرامج . المهم للتأكيد :

iptables -P INPUT DROP

2. ننشيء 3 CHAINS جديدة نسميها :

iptables -N STAGE1
iptables -N STAGE2 
iptables -N STAGE3

3. نعين القيمة الإبتدائية في list خاصة بالآيبيهات التي دخلت علينا, لكننا سنخزن قيمة ثابتة وليس رقم آيبي كالتالي :

iptables -A INPUT -p tcp -m tcp --dport 33331 -m recent --set --name OK1

القيمة إسمها OK1 , ويتم تخزينها في List الإفتراضي لو وصلت أي Packet على المنفذ 33331 فقط ونستخدم لذلك عبارات -m والتي هي عبارى عن Extension يأتي مع ال Iptables لعمليات ال matching وفيه مرونة كبيرة يكفي الدخول على man iptables لمعرفة المزيد . لكن هنا تم عمل --set ل --name ب OK1 بحيث لو تم إختباره لاحقا نتأكد أنه موجود .

4. إضافة المنافذ الأخرى التي ستطرق :

iptables -A INPUT -p tcp -m tcp --dport 44221 -m recent --rcheck --name OK2 -j STAGE1
iptables -A INPUT -p tcp -m tcp --dport 23239 -m recent --rcheck --name OK3 -j STAGE2
iptables -A INPUT -p tcp -m tcp --dport 54371 -m recent --rcheck --name OK4 -j STAGE3

الآن لاحظ أن كل منفذ عندما يطرق يحول مسار التنفيذ ل CHAIN مختلف ! ماذا يوجد في هذه ال CHAINS ؟

5. addition to our new chains

iptables -A STAGE1 -m recent --remove --name OK2
iptables -A STAGE1 -m recent --set --name OK3
iptables -A STAGE2 -m recent --remove --name OK3 
iptables -A STAGE1 -m recent --set --name OK4
iptables -A STAGE3 -m recent --remove --name OK4 
iptables -A STAGE1 -m recent --set --name OK5

هنا مايتم فعله التالي , خلال كل مرحلة عندما أقرع على منفذ معين يتم جعل القائمة فيها متغير وحيد لكي يتم إختباره المرة التالية عند القرع على الباب التالي بعمل && له مع رقم المنفذ كأنه أمر if في البرمجة كالتالي :

 

[color= #0000ff;]if[color= #000000;]( port [color= #000000;]== [color= #ff0000;]44221  [color= #000000;]&& var_in_list [color= #000000;]= OK2[color= #000000;])

then go to the next step and wait till knock the next port

6. الآن المرحلة الأخيرة بعد القرع على الأربعة منافذ الأولى يبقى المنفذ الحقيقي الذي فيه الخدمة تعمل وهو المنفذ رقم 22 كالتالي والإضافة تكون في INPUT Chain أيضا :

iptables -A INPUT -p tcp -m tcp --dport 22 -m recent --rcheck --seconds 5 --name OK5 -j ACCEPT

لاحظ هنا أن العملية تغيرت أولا ال policy في النهاية ACCEPT أي إقبل ونفذ الإتصال , ثانيا تمت إضافة المتغير --seconds بقيمة 5 ثواني وهذا تعقيد إضافي أي أنه لو لم يتم الدخول على المنفذ 22 خلال 5 ثواني من قرع المنفذ الأخير ستدمر السلسلة وستحتاج أن تبدأ من الصفر !

7. كل شيء الآن يعمل لكن بقي إضافة سطر مهم حيث أن الإتصال لن يعمل الآن وهو :

iptables -I INPUT -m state --state RELEATED,ESTABLISHED -j ACCEPT

ولاحظ أننا لم نقم بعمل -A = APPEND له كما فعلنا مع بقية الأوامر وإنما INSERT أي أنه سيضاف للبداية , لأنه بعد المرحلة 6 سيتم تحويل الإتصال إلى مرحلة ESTABLISHED ولن تنطبق عليه ال policy رقم 6 وسيحصل DROP بعد الإتصال , إنما الآن بعد تحقق الإتصال سيتم مواصلته بشكل طبيعي .

الآن للإختبار من Command Line :

C:\>telnet 10.10.10.1 33331 
Connecting To 10.10.10.1...

C:\>telnet 10.10.10.1 44221 
Connecting To 10.10.10.1...

C:\>telnet 10.10.10.1 23239 
Connecting To 10.10.10.1...

C:\>telnet 10.10.10.1 54371 
Connecting To 10.10.10.1...

وأخيرا وبشكل سريع قبل إنتهاء الخمس ثواني بإستخدام putty أو غيره نتصل بالسيرفر لتكون النتيجة كالتالي :

post-19273-1224299966_thumb.jpg

أو عن طريق إستخدام سطر الآوامر في لنكس :

# ssh user_name@10.10.10.1

وهذه من تجارب على localhost أيضا .

post-19273-1224299902_thumb.jpg

أخيرا بدلا من إستخدام telnet للقرع على المنافذ يمكن إستخدام أدارة جاهزة ك hping وجعل المنافذ التي ستقرع متتالية مثلا 5551,5552,5553,5554 ثم أخيرا 22 كالتالي :

hping localhost --destport ++5551

post-19273-1224300337_thumb.jpg

1

banner_60_468.gif

NOTHING IS IMPOSSIBLE

#2

السلام عليكم.

درس جميل جزاك الله خيرا.

لي بعض الإضافات فقط.

يجب عدم وضع المنافذ متسلسلة لأن المخترق سيقوم بعملية Scan كاملة ومنه سيستنتج ان اذ وجد مثلا:

المنافذ التالية مفتوحة:

3225

3226

3227

و المنفذ 22 مفتوح ولم يستطع الإتصال بالمنفذ 22 فسيعرف ان تقنية Port Knocking مفعلة لذلك سيقوم بوضع الإحتمالات الطرق بالتريب او بالإختلاف اي ان لديه 3^3 إحتمال اي 27 محاولة

وهذا ما مانوه عنه الأخ HGB بطريقة غير مباشرة.

اقتباس
لنستطيع الإتصال بال SSH سنطرق على المنافذ 33331 ثم 44221 ثم 23239 ثم 54371

يمكن حتى انه ان تطرق على نفس المنفذ 22 xمرة لكي تستطيع الدخول ومن الممكن ان تزيد عدد الطرقات على المنافذ للمزيد من الأمان.

فيما يتعلق بالأمر الأخير هو انه كلما زادت عدد الإحتمال كلما كان نسبة الأمان اكبر لذلك يجب ان نزيد عدد منافذ الطرق

ومنه نجد انه كلما زادت منافذ الطرق ستصعب العملية.

كنت افكر او لن عملية الطرق تكون ليست Full TCP Connection اي انها ممكن تكون باكت ACK بها بيانات معينة مثل ACK Tunnel حيث اننا نرسل البكت ونعرفها للIP TABLE (طبعا هذا معتمد على مدى مرونة IP TABLES ومدى دعمه لمثل هذه الخواص) مثلا يكون عدد البايتات بها كذا و المنفذ المصدر يكون منفذ معين بحيث ان IP TABLES سيطابق بين Packet اي انه لا يضع القيمة OK1 حتى يجد تطابق تام بين ما لديه والحزمة التي هي ACK بها بيانات معينة،وهذا سيصعب عملية الإختراق(اي ان عملية الطرق لن تكون عبارة عن إتصال عادي بل سيكون عن طريق Packet من نوع ACK تحوي بيانات معينة وتقوم بإرسالها عن طريق برامج Packet Crafting او ببرنامجك الخاص).

لي تسائل آخر عن المدة الزمنية.

مدة 5 ثواني او اي زمن قصير ألن يكون مشكلة اذا كان هنالك إزدحام في الشبكة او مشكلة في الإتصال؟

وشكرا.

infected.png

مدونة علوم الحاسب

#3

موضوع جميل والفكره رائعه

:happy:

بالنسبة للبورت فهل ستعمل معه اداة

Nmap :lol:

اما الجدار الناري فممكن يكون هو حساب الجذر إذا كان الجدار لحساب الجذر

#4

اقتباس
يجب عدم وضع المنافذ متسلسلة لأن المخترق سيقوم بعملية Scan كاملة ومنه سيستنتج ان اذ وجد مثلا:

المنافذ التالية مفتوحة:

3225

3226

3227

و المنفذ 22 مفتوح ولم يستطع الإتصال بالمنفذ 22 فسيعرف ان تقنية Port Knocking مفعلة لذلك سيقوم بوضع الإحتمالات الطرق بالتريب او بالإختلاف اي ان لديه 3^3 إحتمال اي 27 محاولة

وهذا ما مانوه عنه الأخ HGB بطريقة غير مباشرة.

لا لا .. إنسى الوضع الأمر ليس كذلك ...

أولا: لايهم إن كان المتنفذ الذي ستطرق عليه مفتوح أم مغلق لأن ال packet ستقرأ وستصل للجهاز سواء كان firewall أغلق المنفذ أم لا "وأنا هنا أتحدث عن Software Filrewall تكون خدمة SSH مفعلة في نفس الجهاز الذي فيه Firewall " .

بالتالي لن تستطيع أن تفرق وتعرف المنافذ التي ستطرق بعمل مجرد scan بأداة ك nmap فهذا لن يفيد في أي شيء .

ثانيا : إن لم نستطع الإتصال بالمنفذ 22 هذا لايعني أن port knocking مفعل ! قد يعني ذلك أن خدمة SSH أساسا لاتقوم بعمل listen في المنفذ 22, قد نقوم بتشغيل SSH على المنفذ 24519 مثلا إن أردنا. والتحقق من أن port knocking مفعل أم لا شيء صعب جدا جدا"حسب علمي حاليا" والإحتمالات أكثر بكثير مما ذكرت فلو كانت عدد الطرقات 4 قبل الأخيرة فإن هناك

;)

وكما قلت معرفة أن port knocking مفعلة أم لا من الأساس شيء صعب لأنه قد يكون هناك إحتمال عدم وجود خدمة SSH أساسا في الجهاز المفحوص مثلا ! وكل مازادت عدد الطرقات زادت الإحتمالات بطريقة أسية .

وأخيرا: لو جعلنا المنافذ متتالية فهذا لايهم كثيرا وإكتشافه صعب أيضا ولو أنه أسهل بكثير مما لو كان عشوائية والإحتمالات في حالة 5 طرقات أيضا هو mimetex.cgi?2^{16}-3

اقتباس
بالنسبة للبورت فهل ستعمل معه اداة

Nmap

اما الجدار الناري فممكن يكون هو حساب الجذر إذا كان الجدار لحساب الجذر

يمكن بال NMAP لو حددت ال range الخاص بالمنافذ ولو أرسلت half open connection scans ب syn واجبة ولايمكن أن ترسل full tcp/ip connection , إنتبه أن Port knocking يمكن أن يحدث فقط بمجرد إرسال packet للمنفذ المطلوب سواء لفحصه أو سواء ال packet كانت صالحة أو غير صالحة مرت أم لم تمر المهم وصلت لل firewall وإنتهى الأمر , بالتالي من nmap يمكن أن تكتب التالي وسيقوم بعمل طرقات متتالية ل 5551-5554

CONSOLE

nmap -sS 10.10.10.1 -p 5551-5554

أو الطرقات المتعددة لو أردت :

CONSOLE

nmap -sS 10.10.10.1 -p 5546,2361,8888,54381

banner_60_468.gif

NOTHING IS IMPOSSIBLE

#5
اقتباس
كنت افكر او لن عملية الطرق تكون ليست Full TCP Connection اي انها ممكن تكون باكت ACK بها بيانات معينة مثل ACK Tunnel حيث اننا نرسل البكت ونعرفها للIP TABLE (طبعا هذا معتمد على مدى مرونة IP TABLES ومدى دعمه لمثل هذه الخواص) مثلا يكون عدد البايتات بها كذا و المنفذ المصدر يكون منفذ معين بحيث ان IP TABLES سيطابق بين Packet اي انه لا يضع القيمة OK1 حتى يجد تطابق تام بين ما لديه والحزمة التي هي ACK بها بيانات معينة،وهذا سيصعب عملية الإختراق(اي ان عملية الطرق لن تكون عبارة عن إتصال عادي بل سيكون عن طريق Packet من نوع ACK تحوي بيانات معينة وتقوم بإرسالها عن طريق برامج Packet Crafting او ببرنامجك الخاص).

لي تسائل آخر عن المدة الزمنية.

مدة 5 ثواني او اي زمن قصير ألن يكون مشكلة اذا كان هنالك إزدحام في الشبكة او مشكلة في الإتصال؟

بالنسبة لتعقيد ال packet القادمة فممكن أيضا , يمكن تعليم ال packet القادمة بإحدى ال flags الموجودة في layer 3 أو layer 4 كبتات options وبتات TOS لل QOS أيضا يمكن أن تقارن بالتالي لديك عائلة كبيرة جدا من الخيارات ويمكن إن أردت أن تركب دعم Layer7 Filters لل iptables وتبدأ بالمقارنة على مستوى layer7 نفسه , بمحتوى LOAD الموجود فيها ;)

بالنسبة للمدة 5 ثواني نعم يمكن أن تقوم بزيادتها لو أردت ولو كان الإتصال بعيد فقد تحاول أكثر من مرة قبل النجاح في العملية لذلك هو متغير فعليك أن تضع مايناسبك .

banner_60_468.gif

NOTHING IS IMPOSSIBLE

#6

موضوع جميل اخي هيثم ،،

ذكرت في بداية المقال انك لم تجد شيء على الويندوز ،،

انا ايضا بحثت ولم اجد شيء ،، الم تجد حديثا اي شيء بخصوص ويندوز؟؟

اريد ان اسأل ما امكانية عمل برنامج port knocking على نظام ويندوز؟؟ لديك تصور للخطوات؟

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#7

إنظر هنا : http://sourceforge.net/projects/knockknock/

كما هو واضح من الوصف تنفيذ لل port knocking في وندوز , وكنت أقصد أنه الله أعلم هل ISA server يستطيع أن يقوم بعمل forward بهذه الطريقة بين شيء مشابه لل chains فيه أم لا . ليس لدي خلفية كبيرة في ISA , لكن لاأظن أنه فيه مثل هذه المرونة مادام هناك مشاريع خارجية كالذي في الرابط المذكور لتنفيذ العملية في وندوز بشكل عام .

banner_60_468.gif

NOTHING IS IMPOSSIBLE

#8

شكرا على الرابط ،، هذا ما ابحث عنه

اقتباس
وكنت أقصد أنه الله أعلم هل ISA server يستطيع أن يقوم بعمل forward بهذه الطريقة بين شيء مشابه لل chains فيه أم لا . ليس لدي خلفية كبيرة في ISA

اعلم اخي انك قصدت ال ISA ، لكن انا قصدي عمل برنامج مستقل يقوم على اساس فكرة Port Knocking .

سأحاول ان استفاد من الرابط ان شاء الله

اقتباس
لكن لاأظن أنه فيه مثل هذه المرونة

هذا ما اتمناه ،، لكي تكون هناك قيمة للبرنامج :lol:

---

اسمح لي اخي هيثم ان اضع مصدر اخر للموضوع و هو للأخ علي الشمري (Binary)

في المرفقات

port_knocking.pdf

تم تعديل هذه المشاركة بواسطة الاخير زمانه في 10 مايو 2009 في 06:40

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

مواضيع مشابهة