مقال : كيف قمت بحل التحدي الاول لـ securitytube
السلام عليكم ورحمة الله وبركاته
اخواني واخواتي الاعزاء زوار واعضاء موقع isecur1ty . اليوم سأشرح لكم كيف قمت بحل التحدي الاول من سلسلة التحديات الموجوده لدي موقع securitytube
فلقد قام مؤسس موقع securitytube بتقديم مجموعه من التحديات للمستويات المختلفه .
التحدي الاول :
لنبدأ في التحدي الاول الموجود في الرابط ادناه :
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 لكي ابدا عمل كود خاص باحتمالية كلمات المرور الكليه .
الان سأقوم بعمل خوارزميه لتقوم بعمل التباديل بين الثلاثه حروف في حدود 5 احرف كحد اقصي للطول.
اولا ساقوم بعمل حلقة تكرار for loop بحد اقصي خمسة احرف وهي من خلال xrange() فسيقوم بالعد من 0 الي 4
من ثم ساقوم بعمل list جديده وليكن اسمها a وساقوم بوضع حلقة تكراريه اخري بها كل عنصر من عناصر pass_list وهم الثلاثة احرف x,y,z . بعد ذلك ساقوم حلقة تكراريه اخري بداخلها تكرار اخري يحتوي علي جمع كل عنصر من المصفوفه الثانيه مع الاولي وسيتم وضعهم جميعا في list a والتي قمت بعملها داخل الحلقة التكراريه
الان عند طباعه اللست a ستقوم بطباعه كل عنصر تم اضافته بها وسنلاحظ اللست علي الشكل التالي
سنلاحظ ان اول عنصر وهو xxxxx وتاني عنصر تم تغيير اول x بتاني عنصر في اللست pass_list وهو العنصر y ومن ثم تالت تخمين وهو zxxxx حيث تم تغيير اول عنصر بالعنصر التالت بالمصفوفه pass_list وهكذا .
الان قمنا بعمل لست كامله لكلمات السر المتوقعه ساقوم بعمل واحده خاصه باسماء الدخول وهم admin و jack كما موضح بالصوره
لدينا الان كلمات المرور واسماء الدخول المتوقعه باقي لنا خطوة واحده وهي الاتصال بموقع الهدف ومن ثم محاولة تخمين كلمات المرور واسماء الدخول حتي يتم الدخول بنجاح .
سنحاول اولا يدويا بادخال اي كلمة مرور واسم مستخدم وليكن admin وكلمة المرور xyxxx مثلا
سنلاحظ ان الرد ” Failed try again ” ولكن مايهمنا في الامر هو رابط الفورم التي قمنا بمحاولة التسجيل عليها فسنلاحظ ان الرابط قد تغير الي التالي
http://pentesteracademylab.appspot.com/lab/webapp/1?email=admin&password=xyxxx
الامر الان اصبح اكثر بساطه فكل ما يمكننا فعله الان في كود البايثون هو جعل urllib تتصل بالفورم من خلال الرابط السابق مع تغيير كلمة المرور واسم الدخول الي الاسماء وكلمات المرور التي تم اضافتها في الكود .
ساقوم اولا بعمل حلقتين تكرار الاولي لاسماء الدخول والثانيه لكلمات المرور وليكن كالتالي
ملحوظه : قمت بعمل print لكل عنصر بحلقة التكرار حتي اتأكد ان حلقة التكرار تعمل بالشكل الذي نريده .
الان نريد عمل اتصال بالفورم ومن ثم ارسال اسم الدخول وكلمة المرور من خلال urllib2
ساقوم بعمل متغير جديد سأسميه url وسيحتوي علي رابط الفورم ولكني ساقوم بتغيير المدخلات وهي email & password بالمتغيرات التي لدينا في حلقة التكرار كما بالشكل التالي .
بعد ذلك سنقوم بعمل الاتصال بهذا الرابط ومن ثم طباعه رد السيرفر.
عند تشغيل هذا الكود نلاحظ انه يقوم بطبع كود الصفحه الخاصه بالفورم وبالتالي فالعمليه ستكون اكثر تعقيدا فكيف سيقوم السكربت بمعرفه ما اذا كان الباسورد صحيح وقد تم الدخول بالفعل ام لا ؟!
كما ذكرت من قبل عند محاولتي الدخول يدويا للموقع فقد جائني الرد “Failed please try again later” وبكل تاكيد فان هذه الجمله تكون مطبوعه بداخل كود الصفحه عند محاولة الدخول الخاطئه وعند الدخول الصحيح فبكل تاكيد ستتغير هذه الجمله . فماذا ان قمت بعمل فحص لكلمة failed مثلا في كل محاوله وعند عدم ايجادها فذلك يعني انه تم تسجيل الدخول بنجاح
ولذلك ساستبدل سطر print out بـ
print out[2486:2492]
كيف قمت بمعرفة ذلك ؟؟ فالموضوع بسيط للغايه يمكنك فتح الصفحه في اي محرر ومعرفة اين تقع كلمة failed تحديدا
ثم نقوم بتجربه الكود مرة اخري
بقي لنا خطوة واحده وهي عمل فحص لكل output من الصفحه وعند عدم وجود كلمة failed في احد المحاولات هذا يعني انها المحاولة الصحيحه
الان نقوم بتشغيل السكربت وسيقوم تلقائيا بعمل كل محاولات الدخول للموقع وحين يتم الدخول بنجاح سيبلغك بان العملية تمت بنجاح .
ولكن مهلا فالامر لم يتم بنجاح وسنلاحظ ان كل المحاولات والتخمينات قد فشلت ولم تنجح واحدة منهم !
ربما قد نسيت شئ ما … ان لاحظتم في تسجيل الدخول فانه يطلب بريد الكتروني وكلمة مرور وليس اسم مستخدم وايضا في التلميحات قد ذكر لنا ان الدومين الخاص بالشركه هو pentesteracademy.com اذن فان اسماء الدخول ليست jack , admin فقط بل هي [email protected] , [email protected] سنقوم بتغييرها واعادة المحاوله
لقد نجحنا ! ساقوم بمحاولة كتابة اليوزر والباسورد يدويا في الفورم …
لقد تم حل التحدي بنجاح من خلال سكربت بايثون خاص بنا من البدايه وحتي النهايه 🙂
ملحوظه هامه : توجد طرق كثيره اسهل بكثير مما قمت به لحل التحدي ولن ياخذ بضعه دقائق مثلا كعمل باسورد لست من خلال اداة crunch و قد قام بشرحها اخي علي الوشلي من قبل في مقال “أستخدام اداة crunch لتوليد قواميس كلمات المرور” ومن ثم محاولة وضعها في اداة hydra وستقوم بالتخمين تلقائيا ولكني احببت ان اقوم بشرح كيفية عمل سكربت بسيط من البدايه للنهايه للقيام بذلك الامر فهذا افضل بكثير وسنتعلم منه افضل من استخدام ادوات جاهزه 🙂
يمكنكم تحميل الكود كامل من هنا تحياتي لكم .
Old is Gold
thank for your effort ahemd
we just wish to make a youtube channel
that will be awesome
thx
you welcome 🙂 and there’s a youtube channel for isecur1ty
موضوع جيد
بالذات الجزء الخاص بـpwd list generation
بالتوفيق مان 🙂
شكرا لك فارس باشا
أخي ضهرت لي رسالة خط و هي كالتالي
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
مال الحل لو سمحت
المشكله تقريبا عندك من السيرفر نفسه حاول تدخل علي اللنك يدوي وشوف شغال معاك ولا لا
وجرب تحط عند الاتصال try , except وشوف هيقرالك الـ exception ايه
اعجبنى الموضوع جدا جدا تحياتى لك شكرا
لا استطيع الا تسميتك اينشتاين العرب يا بطل
احسنت صنعا
وفقك الله اخي العزيز
لقد تم اغلاق حسابي في الفيس بوك :'( لذلك لا اقدر محادثتك وهذا محزن جدا لي
تحياتي
الله يخليك اخي ديفيد وشكرا علي كلامك الجميل دا
حاول ترسل لادارة الفيس بوك بالمشكله وان شاء الله يرجعولك الحساب اعرف حسابات كتير اتقفلت ورجعت تاني ويشرفني محادثتك 🙂
ألسلام عليكم أخي أحمد
بارك الله فيك و في مجهوداتك أخي و تحياتي لك على هذا الشرح القيم
تحياتي
صحيح بارك الله فيك …شغال يامان
شكرا لك 🙂
شكرا على الشرح يا أخي و لكن هل يمكن عمل مثل هذا البرنامج بلغة السي أو بالأحرى هل يوجد مكتبات خاصة بالتعامل مع المواقع في السي و شكرا
نعم يمكنك الاتصال بالموقع من خلال الsockets ولكن بشرط ارسال الداتا علي نفس صورة الـ HTTP
ويوجد بعد الاقتراحات لاستخدام libcurl لكني الحقيقه لم استخدمها من قبل
ماذا لو كان الفورم يستخدم POST في إرسال الطلبات كيف سأبرمج البرنامج ليحاول مرة بعد أخرى؟ حيث أنه لا أحد يستخدم GET في فورمات التسجيل وما إلى ذلك…
يمكنك استعمال مكتبة مثلا mechanize
http://www.pythonforbeginners.com/cheatsheet/python-mechanize-cheat-sheet
يااخي عندي مشكلة عندما ادخل علي السكريبت
Traceback (most recent call last):
File “facebook1.py”, line 11, in
import mechanize
ImportError: No module named mechanize
وجربت هاذا الامر apt-get install python-mechanize
ولا زالت نفس المشكلة ارجو الررد 🙁
السلام عليكم
المهمه أنا دخت شوية هنا
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]
الأرقام التي وضعتها على شكل قاموس من أين جإت بها
وشكرا
Traceback (most recent call last):
File “C:/Python27/ggg.py”, line 2, in
from termcolor import cprint,colored
ImportError: No module named termcolor