بتـــــاريخ : 2/26/2011 5:55:36 AM
الفــــــــئة
  • الحـــــــــــاسب
  • التعليقات المشاهدات التقييمات
    0 1188 0


    ما معنى Port Knocking تابع سلسلة Security FAQs

    الناقل : elmasry | العمر :42 | الكاتب الأصلى : HGB | المصدر : www.arabteam2000-forum.com

    كلمات مفتاحية  :

    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 :

    CONSOLE
     


    # 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 , فهنا نقول بالتوفيق لمن يحاول فكها .

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

    CONSOLE
     


    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 فكل شيء سيكون مكشوف أمام هذه البرامج . المهم للتأكيد :

    CONSOLE
     


    iptables -P INPUT DROP


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

    CONSOLE
     


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


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

    CONSOLE
     


    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. إضافة المنافذ الأخرى التي ستطرق :

    CONSOLE
     


    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

    CONSOLE
     


    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( port == 44221  && var_in_list = OK2)
    then go to the next step and wait till knock the next port
     
     
     
     



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

    CONSOLE
     


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

    CONSOLE
     


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

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

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

    CONSOLE
     


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

    CONSOLE
     


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

    CONSOLE
     


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

    CONSOLE
     


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


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

    Resized to 79% (was 827 x 426) - Click image to enlargeارفق صورة : monthly_10_2008/post-19273-1224299966.jpg



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

    CONSOLE
     


    # ssh user_name@10.10.10.1

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

    Resized to 84% (was 779 x 527) - Click image to enlargeارفق صورة : monthly_10_2008/post-19273-1224299902.jpg



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

    CONSOLE
     


    hping localhost --destport ++5551

    [/color]

     
    ارفق صورة
     
    • Resized to 81% (was 804 x 446) - Click image to enlargeارفق صورة : monthly_10_2008/post-19273-1224300337.jpg

     

    كلمات مفتاحية  :

    تعليقات الزوار ()