مقال : 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 بسيط لتوضيح كيف تتم العملية
في هذا الكود ما قمت به هو مجرد التاكد ما اذا كان اليوزر قد قام بادخال الاسم وكلمة المرور وفي حالة الضغط علي cancel ستظهر له رسالة unauthorized person . يتم ارسال ايضا Basic realm وهو الذي يظهر في الرساله عندما يتم الدخول الي الصفحه كما ستشاهدون في الصوره التاليه
. كما تلاحظون في هذه الصوره عند الدخول الي الصفحه التي قمت ببرمجتها مسبقا تظهر هذه النافذه وتطلب اسم الدخول وكلمة المرور . في الكود السابق لم اقم بتعيين كلمة مرور واسم للصفحه وانما مجرد طباعة اسم المستخدم وكلمة المرور التي يتم ادخالهم في النافذه التي تظهر .
عند ادخال اسم الدخول وكلمة المرور يتم فتح صفحه تقوم بالترحيب بالمستخدم ايا كان من هو وانما مجرد هي تاخد المتغيرات من$_SERVER[‘HTTP_AUTH_USER’] و $_SERVER[‘HTTP_AUTH_PW’]
اذن الامر الان اصبح نسبة ما سهل وبسيط ويمكننا تعديل هذا الكود بحيث يقبل مجموعه من المستخدمين وكلمات المرور وعند كتابة كلمة المرور او اسم المستخدم بطريقة خاطئه تظهر له صفحة unauthorized .
ايضا عند تشغيل اداة 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 احرف .
طريقة الحل :
عند الدخول الي صفحة التحدي نجد الصفحة التاليه :
وعند الضغط علي زر Enter Pentester Academy . نجد النافذه التاليه تظهر امامنا وتطلب اسم الدخول وكلمة المرور
اذن كيف نقوم بالتخمين علي هذه النافذه ؟
لمن لم يتابع كيفية حل التحدي الاول الذي قمت به يمكنه متابعته من هذا الرابط
تعلمنا في درس التحدي الاول كيف يمكننا عمل 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
لنبدأ إذن بعملية التخمين من خلال كتابة حلقتين تكرار واحده لكلمات المرور وواحده لاسماء المستخدمين وهم nick,admin
for passw in a :
for user in username:
الامر بسيط للغايه حيث قمت بانشاء حلقة تكرار تقوم بالعد داخل list a التي تحتوي علي كل كلمات المرور المتوقعه وبداخلها حلقة تكرار اخري تقوم بالعد علي list username للاختيار مابين nick , admin .
ما بقي لنا في هذا الكود هو مجرد كتابة سطر كود ليقم بالمحاوله علي النافذه التي تظهر لنا في التحدي من خلال الامر التالي
send = requests.post(“https://pentesteracademylab.appspot.com/lab/webapp/basicauth”,auth=HTTPBasicAuth(user, passw))
قمت هنا بتعريف متغير جديد يدعي send يقوم بارسال اسم المستخدم و كلمة المرور التي تتواجد في الوضع الحالي بحلقة التكرار حيث نجد ان requests.post تحتوي علي 2 parameters الاول ياخذ الرابط الخاص بالصفحه والثاني ياخذ نوع authentication ومن ثم ارسال اسم المستخدم وكلمة المرور .
حتي الان يسير الوضع بشكل جيد . ولكن ما يقوم به هذا الكود حتي الان هو مجرد ارسال كل كلمات المرور المتوقعه واسماء الدخول ولكن لا نعرف ماهي كلمة المرور واسم الدخول الصحيحين لهذه الصفحه . اذن سنحتاج لكتابة بضعة اسطر اخري لمعرفة ما اذا كان كلمة المرور واسم الدخول صحيح ام لا . يجب علينا اولا ان نري ماذا يحدث عند ادخال كلمة مرور واسم مستخدم خاطئين يدويا . نجد انه يرسل لنا النافذه مره اخري وعند الضغط علي الغاء نجد جملة Unauthorized ايضا عند محاولة الدخول الخاطئه بسكربت البايثون قد يعطي لنا خرج unauthorized .
عند تطبيق هذا الكود ومحاولة طباعه send.text وهو الخرج حتي الان نجد انه يحدث كما في الصوره التاليه :
نجد كلمة 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)
نقوم بمجرد فحص ما اذا كان كلمة unauthorized موجوده بالخرج ام لا وان لم تكن موجوده كما كتبت if “unauthrized” not in send.text فهذا يعني ان العملية تمت بنجاح ويقوم بطباعه كلمة المرور الصحيحه ومن ثم توقف السكربت .
نجد ان العملية تمت بنجاح من خلال كلمة المرور aaddd واسم الدخول admin . وعند محاولة الدخول يدويا نجد التالي :
يمكنكم تحميل كود الحل كاملا من خلال الرابط التالي http://pastebin.com/eM6TpJr1:
اتمني ان تكون وصلت الفكره بطريقة جيده .
References :
http://en.wikipedia.org/wiki/Basic_access_authentication
http://www.ietf.org/rfc/rfc2617.txt
مشكور أخي الكريم على الشروح وباقي السروحات السابقة
فقط ملاحضة بسيطة …….. المرجو الإنتقال من الشرح الكتابي الى الشرح عن طريق الفيديو لأنه أكتر فعالية في الإستيعاب والفهم
عفوا اخي . ساحاول في الفتره القادمه تصوير شروحات فيديو
أخي أحمد لديك دورة php& mySQL من قبل صحيح ?
مشاء الله عليك سلاسة و طريقة رائعة ..ااامثلة عملية و التجربة…في ميزان حسناتك..ولا تحرمنا من علمك
الله يخليك شكرا جدا لك 🙂
لاشيئ جديد-_-……مبدع كعادتك
يشرفني الرد ع مقالاتك يا غالي
تحياتي
🙂
شكرا جدا لك اخي ديفيد
شرف لي ان اري تعليقاتك دائما
السلام عليكم اخي الكريم
اذا لم يكون على اللوحة die() او exit()
ممكن بهاد الشرح نستغل ثغرات sql injection داخل اللوحة؟
شكراً
اخي لدي لوحة تحكم لي منظومه وأريد التخمين على اسم المستخدم وكلمة المرور لاوجود لأي تلميح الرجاء الإجابه