الخميس، 13 فبراير 2014

مقال : HTTP basic authentication وكيفية تخطيها

السلام عليكم ورحمة الله و بركاته
اخواني واخواتي اعضاء وزوار موقع isecur1ty . ساتحدث اليوم عن كيفية عمل Brute force attack   علي موقع يحتوي HTTP Basic authentication لعملية الدخول . ساشرح اولا ماهي هذه العملية وكيف تستخدم ومن ثم ساتطرق لكود بايثون ساقوم بكتابته لعمل Brute force attack علي صفحة دخول سنقوم بتنفيذها ايضا ومن ثم سنتطرق الي احد التحديات الخاصه بـ securitytube  ومتعلقه بهذه الجزئيه وسوف اعرض لكم كيف قمت بحل هذا التحدي .

أولا : HTTP Basic Authentication 
هي طريقة بسيطه وسهله لحماية صفحة ما علي الانترنت من الاختراق او الدخول اليها مباشرة . فنجد ان معظم مديري المنتديات ومدونات الفيس بوك قد يلجأو الي هذه الطريقه لحماية صفحة الدخول ايضا . ربما نجدها ايضا في بعض الشلات الموجوده حاليا علي الانترنت . تعتمد هذه الطريقه علي HTTP headers لعمل authentication لليوزر .
يوجد اكثر من نوع لـ HTTP authentication مثل :
- Basic Authentication
- Digest Authentication
ما نتحدث عنه في هذا المقال هو Basic authentication .

ثانيا : كتابة كود PHP بسيط لهذه العمليه 
ساقوم بكتابه كود php بسيط لتوضيح كيف تتم العملية
Screenshot from 2014-01-29 12:38:50
HTTP Basic Authentication
في هذا الكود ما قمت به هو مجرد التاكد ما اذا كان اليوزر قد قام بادخال الاسم وكلمة المرور وفي حالة الضغط علي cancel ستظهر له رسالة unauthorized person .  يتم ارسال ايضا Basic realm وهو الذي يظهر في الرساله عندما يتم الدخول الي الصفحه كما ستشاهدون في الصوره التاليه
صورة للرساله التي تظهر
صورة للرساله التي تظهر
.  كما تلاحظون في هذه الصوره عند الدخول الي الصفحه التي قمت ببرمجتها مسبقا تظهر هذه النافذه وتطلب اسم الدخول وكلمة المرور . في الكود السابق لم اقم بتعيين كلمة مرور واسم للصفحه وانما مجرد طباعة اسم المستخدم وكلمة المرور التي يتم ادخالهم في النافذه التي تظهر .
رسالة الصفحه
رسالة الصفحه
عند ادخال  اسم الدخول وكلمة المرور يتم فتح صفحه  تقوم بالترحيب بالمستخدم ايا كان من هو وانما مجرد هي تاخد المتغيرات من$_SERVER['HTTP_AUTH_USER']  و $_SERVER['HTTP_AUTH_PW']
Screenshot from 2014-01-29 12:49:11اذن الامر الان اصبح نسبة ما سهل وبسيط ويمكننا تعديل هذا الكود بحيث يقبل مجموعه من المستخدمين وكلمات المرور وعند كتابة كلمة المرور او اسم المستخدم بطريقة خاطئه تظهر له صفحة unauthorized  .
ايضا عند تشغيل اداة Live HTTP headers علي الصفحة نجد التالي :
Live Http Headers
Live Http Headers
يوجد في جزئية  Authorization تشفيرة Base64 يتم تسجيلها في Headers . عند فك هذه التشفيره نجد انها عباره عن “admin:ahmed” اي ان اسم الدخول وكلمة المرور يتم  تخزينهم  بهذه الصوره .
ثالثا : كيفية عمل Brute Force Attack علي هذه النوعيه  
ساتطرق الي احد التحديات المقدمه من موقع securitytube ومن خلال حلها سوف تكون قادر علي فهم هذه النوعيه والهجوم عليها
المطلوب في التحدي :  تخطي صفحة الدخول Basic authentication .
بعض التلميحات : 
- اسم المستخدم nick , admin
- كلمة المرور تتكون من ثلاثة احرف a,s,d وطولها 5 احرف .

طريقة الحل : 

عند الدخول الي صفحة التحدي نجد الصفحة التاليه :
Screenshot from 2014-01-29 13:16:17

وعند الضغط علي زر Enter Pentester Academy .  نجد النافذه التاليه تظهر امامنا وتطلب اسم الدخول وكلمة المرور
Screenshot from 2014-01-29 13:17:44

اذن كيف نقوم بالتخمين علي هذه النافذه ؟
لمن لم يتابع كيفية حل التحدي الاول الذي قمت به يمكنه متابعته من هذا الرابط 
تعلمنا في درس التحدي الاول كيف يمكننا عمل Brute force attack علي web form وكيف استطعنا استغلال التلميحات الموجوده بالتحدي من اجل انشاء قائمة الباسوردات المحتمله . نفس الشئ ساقوم به في هذا التحدي

اولا : ساقوم بعمل انشاء لقائمة كلمات المرور المحتمله
فقد ذكر انه كلمة المرور تتكون فقط من ثلاثة احرف a,s,d وطولها 5 احرف . اذن ساقوم بكتابه نفس الكود الذي قمت بكتابته مسبقا لانشاء قائمة كلمات المرور مع استبدال pass_list بالاحرف الممكنه الجديده a,s,d
قائمة كلمات المرور واسماء الدخول المحتمله
قائمة كلمات المرور واسماء الدخول المحتمله
الان لنقم بعمل الاتصال بنافذة الـ authentication التي تظهر لنا ومن ثم تجربة كل كلمات المرور الممكنه من خلال مكتبة requests بالبايثون .  يمكنك تطبيق الامر التالي في التريمنال لتنصيبها بكل سهوله
pip install requests
ساقوم باستحضارها في كود البايثون من خلال import requests ومن ثم استحضار جزئيه HTTP Basic Auth  من خلال :
from requests.auth import HTTPBasicAuth
Screenshot from 2014-01-29 13:26:16لنبدأ إذن بعملية التخمين من خلال كتابة حلقتين تكرار واحده لكلمات المرور وواحده لاسماء المستخدمين وهم nick,admin
for passw in a :
for user in username:
الامر بسيط للغايه حيث قمت بانشاء حلقة تكرار تقوم بالعد داخل list a التي تحتوي علي كل كلمات المرور المتوقعه وبداخلها حلقة تكرار اخري تقوم بالعد علي list username للاختيار مابين nick , admin .
For Loop for user and password
For Loop for user and password
ما بقي لنا في هذا الكود هو مجرد  كتابة سطر كود ليقم بالمحاوله علي النافذه التي تظهر لنا  في التحدي من خلال الامر التالي
send = requests.post(“https://pentesteracademylab.appspot.com/lab/webapp/basicauth”,auth=HTTPBasicAuth(user, passw))
قمت هنا بتعريف متغير جديد يدعي send يقوم بارسال اسم المستخدم و كلمة المرور التي تتواجد في الوضع الحالي بحلقة التكرار حيث نجد ان requests.post تحتوي علي 2 parameters  الاول ياخذ الرابط الخاص بالصفحه والثاني ياخذ نوع authentication ومن ثم ارسال اسم المستخدم وكلمة المرور .
HTTP Basic authentication
HTTP Basic authentication
حتي الان يسير الوضع بشكل  جيد  . ولكن ما يقوم به هذا الكود حتي الان  هو مجرد ارسال كل كلمات المرور المتوقعه واسماء الدخول ولكن لا نعرف ماهي كلمة المرور واسم الدخول  الصحيحين  لهذه الصفحه  .  اذن سنحتاج لكتابة بضعة اسطر اخري لمعرفة ما اذا كان كلمة المرور واسم الدخول  صحيح ام لا  . يجب علينا اولا ان نري ماذا يحدث عند ادخال كلمة مرور واسم مستخدم خاطئين يدويا . نجد انه يرسل لنا النافذه مره اخري وعند الضغط علي الغاء نجد جملة Unauthorized ايضا عند محاولة الدخول الخاطئه بسكربت البايثون قد يعطي لنا خرج unauthorized .
output from page
output from page
عند تطبيق هذا الكود ومحاولة طباعه send.text وهو الخرج حتي الان نجد انه  يحدث كما في الصوره التاليه :

Screenshot from 2014-01-29 13:38:01
Unauthorized Unauthorized Unauthorized
نجد كلمة unauthorized في الخرج اذن ما سنقوم به هو عملية فحص ما اذا كان send.text يحتوي في كل مره علي كلمة unauthorized ام لا وان لم يحتوي في مرة ما علي هذه الكلمة فهذا يعني ان عملية الدخول تمت بنجاح . فسنقوم بتطبيق التالي :
if “Unauthorized” not in send.text:
print(“Yes it worked ” + passw)
break
else:print(“Not Connected with pass %s and user %s”) %(passw,user)
if unauthorized
if unauthorized
نقوم بمجرد  فحص ما اذا كان كلمة unauthorized موجوده بالخرج ام لا وان لم تكن موجوده كما كتبت if “unauthrized” not in send.text فهذا يعني ان العملية تمت بنجاح ويقوم بطباعه كلمة المرور الصحيحه ومن ثم توقف السكربت .
Screenshot from 2014-01-29 13:13:40
نجد ان العملية تمت بنجاح من خلال كلمة المرور aaddd واسم الدخول admin . وعند محاولة الدخول يدويا نجد التالي :
Screenshot from 2014-01-29 13:44:34
يمكنكم تحميل كود الحل كاملا من خلال الرابط التالي  http://pastebin.com/eM6TpJr1:
اتمني ان تكون وصلت الفكره بطريقة جيده .
References :
http://en.wikipedia.org/wiki/Basic_access_authentication
http://www.ietf.org/rfc/rfc2617.txt



0 التعليقات:

إرسال تعليق

شكرا لاضافة تعليق