امن وحماية تطبيقات الويبمواضيع ومقالات

مقال : 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 ومن خلال حلها سوف تكون قادر علي فهم هذه النوعيه والهجوم عليها

رابط التحدي : http://pentesteracademylab.appspot.com/lab/webapp/basicauth

المطلوب في التحدي :  تخطي صفحة الدخول 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

 

Ahmad Sherif

مبرمج ويب وباحث بمجال امن المعلومات والشبكات عملت كمختبر اختراق من قبل ولديً خبره في مجال الهندسه العكسيه . مهتم باثراء المحتوي العربي في مجال امن المعلومات

مقالات ذات صلة

‫10 تعليقات

  1. مشكور أخي الكريم على الشروح وباقي السروحات السابقة

    فقط ملاحضة بسيطة …….. المرجو الإنتقال من الشرح الكتابي الى الشرح عن طريق الفيديو لأنه أكتر فعالية في الإستيعاب والفهم

  2. مشاء الله عليك سلاسة و طريقة رائعة ..ااامثلة عملية و التجربة…في ميزان حسناتك..ولا تحرمنا من علمك

  3. اخي لدي لوحة تحكم لي منظومه وأريد التخمين على اسم المستخدم وكلمة المرور لاوجود لأي تلميح الرجاء الإجابه

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

زر الذهاب إلى الأعلى