الجمعة، 13 أغسطس 2021

بديل برنامج netstat في ويندوز : استخدم powershell للتحقق من اتصالات الجهاز

 بسم الله الرحمن الرحيم

لغة السكريبت powershell التي طورتها  مايكروسوفت تعطيك القدرة على التحكم الكامل في نظامك و أنشاء برامج تمكنك من تحويل الوظائف المملة إلى ألية بشكل كامل، في هذا المقال سوف استعرض الاوامر الاساسية مع بعض الاستخدامات لها، هذا الأوامر سوف تساعدك على استبدال الأمر netstat الذي ما زال موجوداً في نظام ويندوز 10 .
  • الوصول إلى موجه أوامر powershellمن نظامك أختر قائمة إبدأ (Start) :
     

  • أختر  Windows Power Shell


و الأن إلى أول أمر في سطر الأوامر :
Get-NetTCPconnection
 
ملاحظة سطر الأوامر في powershell لا يهتم بحالة الأحرف فأذا كتبت الأمر كالتالي get-nettcpconnection فسينجح تنفيذ الأمر 


هذه الصورة مثال لما سيظهر لك عند تنفيذ الأمر , طبعا ستكون القائمة طويلة لذا اذا اردت ان تظهر لك بالتدريج استخدم هذا الأمر :
Get-NetTCPconnection | more
 و الأن لما هو معنى كل هذا البيانات  لنبدأ بالسطر الأول :


 هذا السطر يظهر العنوان المحلي في الاغلب في الحالات يكون العنوان الخاص بالجهاز على الشبكة المحلية أو العنوان 127.0.0.1 أو العنوان الخاص 0.0.0.0  ( هذا العنوان خاص في حالات مثل عرض عنوان غير معروف كمثال المنفذ في حالة انتظار الانتصال Listen  يعرض العنوان المتصل بهذا العنوان ) .

 

 هذا السطر يعرض رقم المنفذ المحلي , و بالنسبة للأهمية هذا السطر فالمنفذ المحلي للأستخدام النظام للتميز بين الاتصالات الواردة  و لكن قد تحتاجه لمعرفة أذا كان نظامك يعاني من مشكلة تسمى ports exhaustion أو ما يمكن ترجمته لإستهالاك المنافذ , حيث أن عدد المنافذ المحلية و الخارجية محدود ( 0 - 65535 ) , و في بعض الاحيان بسبب برنامج يعاني خطأ برمجي يتسبب في عدم تحرير موارد النظام يستهلك جميع المنافذ المحلية المتاحة  .

 

هنا يأتي العنوان الذي يتم الأتصال به , و في الصورة سوف تجد العنوانين 0.0.0.0 ( الخاص ببرتوكول IP النسخة الرابعة ) و :: ( الخاص ببرتوكول IP النسخة السادسة ) و يكون هذا في حالة عدم معرفة العنوان في حالة المنافذ التي تنتظر الاتصال (listen) .

هنا ترى المنفذ الذي يقوم جهازك فيه بالاتصال بالعنوان الخارجي (Remote Address) وتلاحظ أنه في اخر الصورة تجد المنفذ 443 الخاص ببرتوكول HTTPS .

و هذا السطر يحتوي على حالات الأتصال و الان لشرح هذه الحالات :

  • Bound : هي حالة انتقالية عند حجز المنفذ و العنوان المحلي (Bind) قبل وضعية انتظار الانتظار (Listen) .
عملية انشاء مقبس لخادم , العملية متشابه في جميع لغات البرمجة , و قد تختلف بشكل بسيط


  • هنا سوف تجد مجموعة حالات خاصة بأنشاء الاتصال , أو ما يسمى في برتوكول TCP بالمصافحة (handshake) , و سوف تختصر هذا الصورة معنى كل مرحلة :
  •  
  •  عند بدأ الاتصال يقوم الجهاز الراغب في الاتصال (Client) بحجز منفذ محلي و عنوان ويحول حالته إلى SynSent بعد إرسال رسالة SYN إلى الهدف .
  • في حالة كون المنفذ متاح في الهدف يقول الجهاز المتصل به (Server) بحجز منفذ محلي و وضع حالته  SynRecevied وإرسال رسالة SYN-ACK التي تدل على قبول الاتصال إلى العميل (Client) .
  • بعد ذلك يحول العميل (Client) حالة الاتصال إلى Established و يرسل رسالة تتختم عملية المصافحة و هي رسالة SYN اخرى ليتحول حالة Established و يبدأ تبادل البيانات .
الحالات التي ترتبط بالاتصال بالترتيب و حسب الاسم المستخدم في Powershell :
  1. SyncSent
  2. SynReceived
  3. Established

و الأن إلى شرح الحالات المرتبطة بعملية انهاء الاتصال و سنبدأ بصورة تشرح خطوات إنهاء الاتصال في برتوكول TCP :

  • يقوم الجهاز الذي يرغب بأنهاء الاتصال بأرسال رسالة FIN و تحويل حالة الاتصال إلى FINWAIT1 .
  • عند وصول الرسالة إلى الهدف يتم تحويل حالة الاتصال إلى CloseWait و إرسال رسالة ACK.
  • عند وصول الرسالة إلى الجهاز الراغب بإنهاء الاتصال يتم تحويل حالة الاتصال إلى FINWAIT2 , في هذه الحالة لا يزال الخادم يرسل البيانات .
  •  عند نهاية الارسال يرسل الخادم رسالة LastAck , ليحول الاتصال في الطرف المنهي للاتصال إلى الحالة TimeWait و يتم أرسال رسالة ACK ليتم أنهاء الاتصال في الطرفين .
و هذا ترتيب هذه الحالات بحسب الاسم المستخدم في Powershell :
  1. FinWait1
  2. CloseWait
  3. FinWait2
  4. LastAck
  5.   TimeWait
  6. Closing - حالة انتقالية تخص نظام التشغيل عندما يحاول اغلاق الاتصال
  7. Closed
 قد تتساءل عن سبب وجود هذه الحالات المتعددة للاتصال في بروتوكول TCP , السبب هو انه تم تصميم هذا البروتوكول لضمان وصول جميع البيانات مهما كلف الأمر. 

هناك حالة واحدة لم اتطرق لها بالاسم DeleteTCB و TCB اختصار لـ(Transmission control block) و وفقاُ لموقع  
ietf.com  في TCB هو بيانات الاتصال المحفوظة على الجهاز و التي تحتوي جميع بيانات الاتصال , و بعد أغلاق الاتصال يتم تحرير هذه الذاكرة , و لكن لم يمر على أي اتصال في هذه الحالة , لا اعلم السبب بالتحديد و لكن أتوقع بأن العملية تتم بسرعة في يتمكن الامر من اعادة أي اتصال في هذه الحالة , طبعا هذا مجرد افتراضية .
 
و الأن سننتقل إلى السطر الخاص بالإعدادات الخاصة بالاتصال :
 

هذه العمود خاص بقوالب للاعدادات برتوكول TCP , تسطيع التحكم من خلالها بإعدادت البرتوكول , لعرض القوالب الموجودة في نظامك اكتب الامر التالي :
 
Get-NetTCPSetting | more

هذه الإعدادت تخص وقت الإستجابة (Network latency) و التعامل مع إزدحام الشبكة (congestion) و تخصيص وقت إنهاء الاتصال , هذا الموضوع سأفرد له موضوع كامل في المستقبل القريب ( أن شاء الله ) .
 
و العمود الأخير و هو OwingProcess و هو معرف العملية (Process Id) التي قامت بفتح المنفذ .

هذا المعرف سيمكنك من التعرف على البرنامج الذي قام بأنشاء الاتصال .


والأن بعدما تعرف على الأمر بشكل عام سنعرض بعض الأمثلة التي ستفيدك :
 
  • عرض الاتصالات بشكل تدريجيا
 
Get-NetTCPSetting | more

 
  •  عرض الاتصالات بحسب الحالة :
     
    Get-NetTCPSetting -state CloseWait 
    

    قائمة بالحالات الموجودة في PowerShell:
    1. Bound
    2. Closed
    3. CloseWait
    4. Closing
    5. DeleteTCB
    6. Established
    7. FinWait1
    8. FinWait2
    9. LastAck
    10. Listen
    11. SynReceived
    12. SynSent
    13. TimeWait 
     

    •  عرض الاتصالات بحسب معرف البرنامج (PID) :
     
     لنفترض أنك تريد أن تعرف الاتصالات التي تحصل من جهازك و البرنامج التي تستخدم هذه الاتصالات يوفر الأمر اختيار لعرض الاتصالات بحسب رقم معرف العملية (PID) :
     
    Get-NetTCPSetting -OwningProcess ProcessIDNumber 
    

    لكنني سوف اعطيك طريقة أعتقد بأنها أفضل بكثير من أنك تبحث بشكل يدوي على رقم المعرف , أنظر لها الأمر التالي:

     
    Get-Process -Id (Get-NetTCPConnection -State Established ).OwningProcess
    

    هنا سيعرض جميع البرامج التي تمتلك اتصالات في حالة اتصال (Established) , كما تستطيع تغير الحاله كما تريد كمثال التالي لعرض البرامج التي تتنظر الاتصال (Listen):
    Get-Process -Id (Get-NetTCPConnection -State Listen ).OwningProcess
    


     و الأن لنجعل الأمر اكثر تحديد و نحصل على الاتصالات الجارية (Established) على المنفذ 443 (HTTPS) :
     
    Get-Process -Id (Get-NetTCPConnection -State Established -RemotePort 443 ).OwningProcess
    


     و الأن لهذا المثال الذي سيظهر لك وقت بدأ الاتصالات في حالة Established و ترتيبه بحسب الوقت :
     
    Get-NetTCPConnection -State Established | Sort-Object CreationTime |Format-Table local*,remote*,State,CreationTime
    

    تراه هنا القوة و المرونة التي تعطيك لغة Powershell , تستطيع القيام بتعديل المخرجات بحسب ما تريده , يجب أن انبه على مشكلة في بعض المعطيات بهذا الأمر خاصة , في بعض الحالات لا يقوم النظام بتعديل القيمة الخاصة بوقت الإنشاء فتحصل على الوقت :
    1/1/1601 4:00:00 AM


    طبعا هنالك الأوامر الأبسط مثل تحديد عنوان أو منفذ كان محلي أو خارجي باستخدام هذه الأوامر :

    • Get-NetTCPConnection  -LocalPort 443 
    • Get-NetTCPConnection -LocalAddress 127.0.0.1
    • Get-NetTCPConnection -RemotePort 443
    •  Get-NetTCPConnection -RemoteAddress 8.8.8.8
     
    تستطيع أن تحدد مثل نوع الحالة مع المنفذ و العنوان :
     
    Get-NetTCPConnection -State Listen -LocalPort 139 -LocalAddress 127.0.0.1 -State Listen
    
     
    و الأن إلى المثال الأخير الذي سيطبع لك مسار البرنامج و معرف العملية و تاريخ الإنشاء مع المنفذ :

    Get-NetTCPConnection |Select-Object LocalPort,OwningProcess,CreationTime,@{name='ProcessName';expression={(Get-Process -Id $_.OwningProcess).Path}}
    
     
     
    و الأن إلى الأمر الخاص ببرتوكول UDP , طبعا هنالك اختلاف جوهري في التصميم ما بين برتوكول TCP و برتوكول UDP , كما لاحظت في برتوكول TCP فهنالك الكثير من الحالات و التحقق من بدأ الاتصال و عملية لبدأ الاتصال و أنهاءه , أما في برتوكول UDP فتم تصميمه بطريقة (Fire and Forget) , فالمرسل للبيانات يرسلها بدون الاهتمام بوصول البيانات و الطرف الثاني يكون في حالة واحده فقط و هي Listen  و الهدف من هذا هو السرعة لذا يستخدم في تطبيقات الوسائط عبر الانترنت .
     
    الأمر التالي يعرض لك المنافذ في وضعية Listen :
     
    Get-NetUDPEndpoint
     
    سترى هذا القائمة التي تظهر فقط العنوان و المنفذ المحلي :
     

     
     و الأن إلى الأمر الذي سيعرض لنا تاريخ الإنشاء ومعرف العملية للبرنامج ( PID ) :

    Get-NetUDPEndpoint  | select local*,CreationTime,OwningProcess
     
     و لمعرفة اسماء العمليات (PID) سنستخدم هذا الأمر :

    Get-Process -id (Get-NetUDPEndpoint).OwningProcess
     
     و الأن للمثال الأخير :
     
    Get-NetUDPEndpoint |Select-Object LocalPort,OwningProcess,CreationTime,@{name='ProcessName';expression={(Get-Process -Id $_.OwningProcess).Path}}
     
    هذه نسخة الأمر الخاصة UDP المشابه لذي استخدمناه في برتوكول TCP , سيتم طباعة تاريخ الإنشاء و مسار البرنامج و معرف العملية (PID) و المنفذ المحلي .
     
    و الأن في الختام أريد أن اجيب على سؤال تكرر في المدونة , وهو كيف أعرف من هذه المعطيات بأنه تم أختراق جهازي ؟ , الجواب مع تطور عمليات الأختراق اصبح الأمر ليس بالسهولة كما في كان في السابق , لكن قد يفيد في حالة أن المخترق يستخدم برنامج مستقل و قام بأنشاء خادم في جهازك يتصنت على أحد المنافذ , لكم ماذا لو كان المخترق محترفا و قام باستخدام ثغرة في احد البرامج الموجودة على جهازك , فعندما تقوم بالتدقيق فيظهر لك بأن البرنامج الذي يحاول الاتصال هو احد برامج المعروفة لديك , لذا فالتأكيد وجود أختراق لجهازك يتطلب أكثر من هذا الأمر , كما ان الكثير من برامج الاختراق تقوم بالاتصال بخوادم ويب (HTTPS) بدل أن تقوم بتنصت على منفذ على جهازك (Reverse Shell) كما أن البيانات المرسلة مشفرة فيصعب اعتراضها و تحليلها .
     

     
     
     

ليست هناك تعليقات:

إرسال تعليق