مواضيع ومقالات

مقال : كيف قمت بحل التحدي الاول لـ securitytube

تم أرشفة هذا المحتوى


السلام عليكم ورحمة الله وبركاته 

اخواني واخواتي الاعزاء زوار واعضاء موقع isecur1ty . اليوم سأشرح لكم كيف قمت بحل التحدي الاول من سلسلة التحديات الموجوده لدي موقع securitytube

فلقد قام مؤسس موقع securitytube بتقديم مجموعه من التحديات للمستويات المختلفه .

 

التحدي الاول :  

لنبدأ في التحدي الاول الموجود في الرابط ادناه :

Screenshot from 2014-01-22 04:06:32

http://pentesteracademylab.appspot.com/lab/webapp/1

 

متطلبات التحدي : 

– تخطي لوحة تسجيل الدخول .

بعض التلميحات :

– الدومين الخاص بالشركه : PentesterAcademy.com

–  اسماء المستخدمين هما : jack,admin

–  طول الباسورد الواحد 5 حروف فقط مكونين من ثلاث حروف هم  x,y,z

 

طريقة الحل : 

ان المطلوب في هذا التحدي هو تخطي لوحة تسجيل الدخول اذن فكيف سنتخطاها . بمساعدة التلميحات الموجوده داخل الصفحه نجد انه لدينا 2 من المستخدمين فقط ولكن ماذا عن كلمة المرور ؟!

انه يقول ان كلمة المرور طولها 5 احرف وتتكون فقط من 3 احرف وهم x,y,z اذن احتمالية كلمة المرور ان تكون مثلا : xxxxx او yyyyy  او zzzzz او xyzzz

ولكن مهلا ! هل من المعقول ان نقوم بعمل تجربه لكل كلمات المرور التي تخطر ببالنا وتتكون من 3 حروف !! ان هذا الحل بالتأكيد بدائي جدا ومعقد للغايه وربما قد تقع في الخطأ اثناء المحاولات اليدويه وربما ستشعر بالملل وتترك التحدي 🙂

دعونا نقوم بحلها بطريقة رياضيه : ان الاحتمالات الممكنه لكلمة المرور هي 3 ^ 5  اي تساوي 243 احتمال .

ان 3 هي الحروف المطلوبه x,y,z و 5 هو طول كلمة المرور .

دعوني اشرح لكم بمثال اخر : كلمة مرور مكونه من اعداد عشريه 0-9 وطول كلمة المرور 12 اذن فكم عدد الاحتمالات الممكنه لكلمات المرور ؟  

بما ان الاعداد الممكنه هي من 0 الي 9 وطول كلمة المرور هو 12 اذن فعدد الاحتمالات الممكنه هو 10 ^ 12  .

اذن فهناك 243 احتمال لكلمة المرور لكل مستخدم حيث ان عدد المستخدمين اثنان وهما jack , admin  . لذا فسنقوم بمحاولة الدخول بكل مستخدم منهم مع عدد احتمالات كلمة المرور (243) اذن فان عدد المحاولات الكليه هو 243 *2 = 486

 

جيد .. لنبدأ في كتابة كود بايثون يقوم بحل هذا التحدي .

التطبيق العملي : 

– اولا كيف يمكننا الاتصال بصفحة ويب علي الانترنت من خلال كود بايثون ؟  يمكننا فعل ذلك من خلال مكتبة urllib,urllib2  و يمكنك التعرف عليها اكثر من خلال الرابط التالي : http://www.pythonforbeginners.com/python-on-the-web/how-to-use-urllib2-in-python/

يوجد مكتبة اخري ساقوم باستدعاءها خاصة بتلوين الـ output وذلك لتعطيني لون مميز عند تخطي لوحة تسجيل الدخول يمكنكم تحميل هذه المكتبه من خلال الرابط التالي : https://pypi.python.org/pypi/termcolor

– ثانيا ساقوم بفتح المحرر لكتابة واستدعاء المكتبات اللازمه لذلك ساستدعي اولا مكتبة urllib2  ,  وساستدعي جزئية cprint , colored  من termcolor التي قمنا بتنزيلها مسبقا .

الان سأقوم بعمل list تحتوي علي 3 حروف وهم x,y,z لكي ابدا عمل كود خاص باحتمالية كلمات المرور الكليه .

Screenshot from 2014-01-25 11:49:31

الان سأقوم بعمل خوارزميه لتقوم بعمل التباديل بين الثلاثه حروف في حدود 5 احرف كحد اقصي للطول.

اولا ساقوم بعمل حلقة تكرار for loop بحد اقصي خمسة احرف وهي من خلال xrange() فسيقوم بالعد من 0 الي 4

من ثم ساقوم بعمل list جديده وليكن اسمها a وساقوم بوضع حلقة تكراريه اخري بها كل عنصر من عناصر pass_list وهم الثلاثة احرف x,y,z  . بعد ذلك ساقوم حلقة تكراريه اخري بداخلها تكرار اخري يحتوي علي جمع كل عنصر من المصفوفه الثانيه مع الاولي وسيتم وضعهم جميعا في list a والتي قمت بعملها داخل الحلقة التكراريه

Screenshot from 2014-01-25 12:00:48

 

الان عند طباعه اللست a ستقوم بطباعه كل عنصر تم اضافته بها وسنلاحظ اللست علي الشكل التالي

Screenshot from 2014-01-25 12:05:50 سنلاحظ ان اول عنصر وهو xxxxx وتاني عنصر تم تغيير اول x بتاني عنصر في اللست pass_list وهو العنصر y ومن ثم تالت تخمين وهو zxxxx حيث تم تغيير اول عنصر بالعنصر التالت بالمصفوفه pass_list وهكذا .

الان قمنا بعمل لست كامله لكلمات السر المتوقعه ساقوم بعمل واحده خاصه باسماء الدخول وهم admin و jack  كما موضح بالصوره
Screenshot from 2014-01-25 12:11:55لدينا الان كلمات المرور واسماء الدخول المتوقعه باقي لنا خطوة واحده وهي الاتصال بموقع الهدف ومن ثم محاولة تخمين كلمات المرور واسماء الدخول حتي يتم الدخول بنجاح .

سنحاول اولا يدويا بادخال اي كلمة مرور واسم مستخدم وليكن admin وكلمة المرور xyxxx مثلا

سنلاحظ ان الرد ” Failed try again ” ولكن مايهمنا في الامر هو رابط الفورم التي قمنا بمحاولة التسجيل عليها فسنلاحظ ان الرابط قد تغير الي التالي

http://pentesteracademylab.appspot.com/lab/webapp/1?email=admin&password=xyxxx

الامر الان اصبح اكثر بساطه فكل ما يمكننا فعله الان في كود البايثون هو جعل urllib تتصل بالفورم من خلال الرابط السابق مع تغيير كلمة المرور واسم الدخول الي الاسماء وكلمات المرور التي تم اضافتها في الكود .

ساقوم اولا بعمل حلقتين تكرار الاولي لاسماء الدخول والثانيه لكلمات المرور وليكن كالتالي

Screenshot from 2014-01-25 12:24:19

ملحوظه : قمت بعمل print لكل عنصر بحلقة التكرار حتي اتأكد ان حلقة التكرار تعمل بالشكل الذي نريده . 

الان نريد عمل اتصال بالفورم ومن ثم ارسال اسم الدخول وكلمة المرور من خلال urllib2

ساقوم بعمل متغير جديد سأسميه url وسيحتوي علي رابط الفورم ولكني ساقوم بتغيير المدخلات وهي email & password بالمتغيرات التي لدينا في حلقة التكرار كما بالشكل التالي .

Screenshot from 2014-01-25 12:28:23بعد ذلك سنقوم بعمل الاتصال بهذا الرابط ومن ثم طباعه رد السيرفر.

Screenshot from 2014-01-25 12:32:29 عند تشغيل هذا الكود نلاحظ انه يقوم بطبع كود الصفحه الخاصه بالفورم وبالتالي فالعمليه ستكون اكثر تعقيدا فكيف سيقوم السكربت بمعرفه ما اذا كان الباسورد صحيح وقد تم الدخول بالفعل ام لا ؟!

كما ذكرت من قبل عند محاولتي الدخول يدويا للموقع فقد جائني الرد “Failed please try again later” وبكل تاكيد فان هذه الجمله تكون مطبوعه بداخل كود الصفحه عند محاولة الدخول الخاطئه وعند الدخول الصحيح فبكل تاكيد ستتغير هذه الجمله . فماذا ان قمت بعمل فحص لكلمة failed مثلا في كل محاوله وعند عدم ايجادها فذلك يعني انه تم تسجيل الدخول بنجاح

ولذلك ساستبدل سطر print out بـ

print out[2486:2492]

كيف قمت بمعرفة ذلك ؟؟ فالموضوع بسيط للغايه يمكنك فتح الصفحه في اي محرر ومعرفة اين تقع كلمة failed تحديدا

ثم نقوم بتجربه الكود مرة اخري

Screenshot from 2014-01-25 12:38:52بقي لنا خطوة واحده وهي عمل فحص لكل output من الصفحه وعند عدم وجود كلمة failed في احد المحاولات هذا يعني انها المحاولة الصحيحه

 

 

Screenshot from 2014-01-25 12:41:23الان نقوم بتشغيل السكربت وسيقوم تلقائيا بعمل كل محاولات الدخول للموقع وحين يتم الدخول بنجاح سيبلغك بان العملية تمت بنجاح .

ولكن مهلا فالامر لم يتم بنجاح وسنلاحظ ان كل المحاولات والتخمينات قد فشلت ولم تنجح واحدة منهم !

ربما قد نسيت شئ ما … ان لاحظتم في تسجيل الدخول فانه يطلب بريد الكتروني وكلمة مرور وليس اسم مستخدم وايضا في التلميحات قد ذكر لنا ان الدومين الخاص بالشركه هو pentesteracademy.com اذن فان اسماء الدخول ليست jack , admin فقط بل هي [email protected] , [email protected]  سنقوم بتغييرها واعادة المحاوله

 

 

Screenshot from 2014-01-25 12:53:33لقد نجحنا ! ساقوم بمحاولة كتابة اليوزر والباسورد يدويا في الفورم …

 

 

 

Screenshot from 2014-01-25 12:49:08لقد تم حل التحدي بنجاح من خلال سكربت بايثون خاص بنا من البدايه وحتي النهايه 🙂

ملحوظه هامه :  توجد طرق كثيره اسهل بكثير مما قمت به لحل التحدي ولن ياخذ بضعه دقائق مثلا كعمل باسورد لست من خلال اداة crunch و قد قام بشرحها اخي علي الوشلي من قبل في مقال “أستخدام اداة crunch لتوليد قواميس كلمات المرور” ومن ثم محاولة وضعها في اداة hydra وستقوم بالتخمين تلقائيا ولكني احببت ان اقوم بشرح كيفية عمل سكربت بسيط من البدايه للنهايه للقيام بذلك الامر فهذا افضل بكثير وسنتعلم منه افضل من استخدام ادوات جاهزه 🙂 

يمكنكم تحميل الكود كامل من هنا

تحياتي لكم .

Ahmad Sherif

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

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

‫19 تعليقات

  1. أخي ضهرت لي رسالة خط و هي كالتالي

    Username Is jack and Password is zyy,x
    Traceback (most recent call last):
    File “test123.py”, line 18, in
    response = urllib2.urlopen(Request)
    File “/usr/lib/python2.7/urllib2.py”, line 127, in urlopen
    return _opener.open(url, data, timeout)
    File “/usr/lib/python2.7/urllib2.py”, line 401, in open
    response = self._open(req, data)
    File “/usr/lib/python2.7/urllib2.py”, line 419, in _open
    ‘_open’, req)
    File “/usr/lib/python2.7/urllib2.py”, line 379, in _call_chain
    result = func(*args)
    File “/usr/lib/python2.7/urllib2.py”, line 1211, in http_open
    return self.do_open(httplib.HTTPConnection, req)
    File “/usr/lib/python2.7/urllib2.py”, line 1184, in do_open
    r = h.getresponse(buffering=True)
    File “/usr/lib/python2.7/httplib.py”, line 1034, in getresponse
    response.begin()
    File “/usr/lib/python2.7/httplib.py”, line 407, in begin
    version, status, reason = self._read_status()
    File “/usr/lib/python2.7/httplib.py”, line 365, in _read_status
    line = self.fp.readline()
    File “/usr/lib/python2.7/socket.py”, line 447, in readline
    data = self._sock.recv(self._rbufsize)
    socket.error: [Errno 104] Connection reset by peer

    مال الحل لو سمحت

    1. المشكله تقريبا عندك من السيرفر نفسه حاول تدخل علي اللنك يدوي وشوف شغال معاك ولا لا
      وجرب تحط عند الاتصال try , except وشوف هيقرالك الـ exception ايه

  2. لا استطيع الا تسميتك اينشتاين العرب يا بطل
    احسنت صنعا
    وفقك الله اخي العزيز
    لقد تم اغلاق حسابي في الفيس بوك :'( لذلك لا اقدر محادثتك وهذا محزن جدا لي
    تحياتي

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

  3. ألسلام عليكم أخي أحمد
    بارك الله فيك و في مجهوداتك أخي و تحياتي لك على هذا الشرح القيم
    تحياتي

  4. شكرا على الشرح يا أخي و لكن هل يمكن عمل مثل هذا البرنامج بلغة السي أو بالأحرى هل يوجد مكتبات خاصة بالتعامل مع المواقع في السي و شكرا

    1. نعم يمكنك الاتصال بالموقع من خلال الsockets ولكن بشرط ارسال الداتا علي نفس صورة الـ HTTP
      ويوجد بعد الاقتراحات لاستخدام libcurl لكني الحقيقه لم استخدمها من قبل

  5. ماذا لو كان الفورم يستخدم POST في إرسال الطلبات كيف سأبرمج البرنامج ليحاول مرة بعد أخرى؟ حيث أنه لا أحد يستخدم GET في فورمات التسجيل وما إلى ذلك…

  6. يااخي عندي مشكلة عندما ادخل علي السكريبت
    Traceback (most recent call last):
    File “facebook1.py”, line 11, in
    import mechanize
    ImportError: No module named mechanize
    وجربت هاذا الامر apt-get install python-mechanize
    ولا زالت نفس المشكلة ارجو الررد 🙁

  7. السلام عليكم
    المهمه أنا دخت شوية هنا
    for current in xrange(5):
    a = [i for i in pass_list] #هنااا
    for y in xrange (current): #وهنا
    a = [x+i for i in pass_list for x in a] #وهنا
    لم أفم دينامكية تشغيل هذه الحلقة التكرارية
    وهنا أيضا out = response.read()[2486:2492]
    الأرقام التي وضعتها على شكل قاموس من أين جإت بها
    وشكرا

اترك تعليقاً

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

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