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

ساخت ابزار پیدا کردن صفحه لاگین وبسایت (Admin Finder) پیشرفته در پایتون

  • ۸۶۱

ساخت ابزار پیدا کردن صفحه لاگین وبسایت (Admin Finder) پیشرفته در پایتون

 

درود به همه !

 

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

روش کار به این صورته که ما یه لیست از url های پیشنهادی رو میدیم به ابزار و ابزار تک تک اونا رو تست میکنه ببینه کدوم از اونا جواب میده . مثلا یه لیستی از url های پیشنهادی به صورت زیر است :

admin
administrator
admin/index.php
administrator/index.php

فرض کنید ما میخوایم لیست بالا رو روی سایتی به آدرس www.example.com تست کنیم . ابزار ما به این صورت عمل میکنه که میاد هر کدوم از url های داخل لیست بالا رو میچسبونه به آخر آدرس سایت و چک میکنه ببینه کدوم از اونا جواب میده .یعنی کد http جوابی که سایت میفرسته رو چک میکنه اگه برابر ۲۰۰ بود یعنی اون صفحه وجود داره و اوکیه ولی اگه ۴۰۴ بود یعنی اون صفحه وجود نداشته به عبارتی url اشتباه بوده (Not Found).  برای مثال ، مورد اول لیست یعنی کلمه ی admin رو به این صورت تست میکنه : www.example.com/admin

یا مورد دوم ، کلمه ی administrator رو به این صورت تست میکنه : www.example.com/administrator

 

تا اینجا نحوه کار ابزار رو یاد گرفتیم اما یه سری نکته هست . ما دوتا سورس امروز مینویسیم . سورس اولی یک ادمین فایندر مبتدی و سورس دومی یک ادمین فایندر حرفه ایه .

در ادمین فایندر حرفه ای از سیستم threading و پردازش های موازی استفاده شده که باعث میشه سرعت ابزار چندین برابر بیشتر بشه .

 

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

 

برای نصب کتابخونه ی colorama از ابزار pip استفاده میکنیم ‌.

 

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

MrPython@debian:~$  sudo pip3 install colorama

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

C:\> pip install colorama

 

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

سورس ادمین فایندر مبتدی :‌

from requests import post
import colorama

colorama.init()

website = input("WebSite : ")
if not website.startswith("http://") or not website.startswith("https://"):
    website  = "http://" + website

urlfile = input("Word List File : ")
urlfile = open(urlfile)

for url in urlfile:
    url = url.strip("\n")
    full_address = website + "/" + url
    response = post(full_address)
    if response.status_code == 200:
        print(colorama.Fore.GREEN + "{} -> [OK]".format(full_address))
    else:
        print(colorama.Fore.RED + "{} -> [404]".format(full_address))

در خطوط اول و دوم کتابخونه های مورد نیاز رو ایمپورت کردیم . در خط بعد با تابع ()colorama.init تنظیمات کتابخونه colorama رو کانفیگ میکنیم (colorama  آماده به کار میشه) . سپس دوتا input از کاربر گرفتیم . input اول آدرس وبسایته هدفه که پس از اون اومدیم به وسیله ی یه if چک کردیم که اگه اول آدرس با http یا https شروع نمیشه خودش بهش اضافه کنه . input دوم هم آدرس فایلی هست که url های پیشنهادی داخلشه (WordList) . بعد از گرفتن input دومی یعنی آدرس فایل url ها اومدیم اونو با دستور open باز کردیم و خوندیمش .

در خط بعد یه حلقه for نوشتیم و با اینکار میتونیم به تک تک خط های فایل url ها دسترسی پیدا کنیم. برای هر url داخل لیست ابتدا اومدیم n\ آخر خط رو با متود strip حذف کردیم سپس متغییر full_address که حاوی آدرس وبسایت +  url مورد نظر هست رو ساختیم و نهایتا با استفاده از متود post یک  درخواست POST فرستادیم به اون آدرسی که ساختیم . در خطوط بعدی یه if نوشتیم که کد http بازگشتی از وبسایت مورد نظر رو چک میکنه . اگه برابر ۲۰۰ باشه یعنی اون url وجود داشته . اگه برابر ۲۰۰ نباشه که احتمالا ۴۰۴ هستش یعنی اون url وجود نداشته و ما این اطلاعات رو با استفاده از print هایی که داخل if  و else نوشتیم به کاربر نشون میدیم .

 

وقتی اسکریپت رو اجرا کنیم و ورودی های مورد نیازش رو بهش بدیم مثل تصویر زیر شروع میکنه یکی یکی تست میکنه و جواب میده . اگه url مورد نظر وجود داشته باشه و درست باشه با رنگ سبز نشون میده در غیر این صورت قرمز نشون میده .

 

 

خب مشکلی که این اسکریپت داره سرعت پایینشه . ما باید یه کاری کنیم سرعتش چندین برابر این باشه . یکی بهترین راهکار ها در اینجور وقت ها پردازش های موازی (multiprocessing) است . ما برای انجام پردازش های موازی از کتابخونه ی threading در پایتون استفاده میکنیم که به صورت پیشفرض نصبه .

(برای نوشتن و فهمیدم کامل سورس ادمین فایندر پیشرفته لازمه با مفاهیم شیء گرایی به خصوص class ها در پایتون آشنا باشید .)

ادمین فایندر پیشرفته ما به جای اینکه بیاد یکی یکی url ها رو تست کنه  ، کاری میکنیم که برای مثال ۱۶ تا url را در یک زمان به طور موازی تست کند . اینکار باعث افزایش سرعت اسکریپت میشه .

 

برای انجام اینکار از کتابخونه ی threading استفاده میکنیم که کارش ساختن thread هاست . اینکه threading  و thread چیه رو میتونید توی گوگل پیداش کنین ولی کلا هر thread یه زیر مجموعه (sub process) از برنامه ی اصلی ماست که یه کار مشخص انجام میده . مثلا ما ۱۶ تا thread مجزا میسازیم که هر کدومشون کارشون اینه یه url خاص از لیست url ها رو تست کنن . پس اینطور  ۱۶ تا url در یک زمان دارن باهم تست میشن . هر thread بعد از اینکه کارش تموم میشه از بین میره.

 

سورس ادمین فایندر پیشرفته :

from requests import post
import threading
import colorama

colorama.init()

website = input("WebSite Target : ")
if not website.startswith("https://") or not website.startswith("http://"):
    website = "http://"+website

urlfile = input("URL File : ")
urlfile = open(urlfile)

class Thread(threading.Thread):
    def __init__(self,url):
        threading.Thread.__init__(self)
        self.url = url
    def run(self):
        full_address = website + "/" + url
        response = post(full_address)
        if response.status_code == 200:
            print(colorama.Fore.GREEN + "{} -> [OK]".format(full_address))
        else:
            print(colorama.Fore.RED + "{} -> [404]".format(full_address))

for url in urlfile:
    url = url.strip("\n")
    while threading.active_count() > 15:
        pass
    th = Thread(url)
    th.start()

خب خیلی از قسمت های این سورس با سورس قبلی (ادمین فایندر مبتدی) مشترکه فقط یه کلاس به نام Thread بهش اضافه شده و یه تغییراتی در حلقه for بوجود اومده که اینا دو مورد رو فقط توضیح میدیم .

خب کلاس Thread همینطور که مبینید از threading.Thread ارث بری میکنه و یه تابعی به اسم run داره که وقتی thread اجرا میشه این تابع اجرا میشه .

در حلقه ی for ما اول اومدیم یه حلقه ی while نوشتیم که تا وقتی که تعداد thread های فعال در برنامه بزرگتر از ۱۵ تاس هیچکاری نمیکنه . این باعث میشه تعداد thread ها هیچوقت بیشتر از ۱۵ تا نشه . بعد از while  اومدیم برای هر url داخل حلقه ی فور یه thread ساختیم به اسم th . و این thread  در واقع یه شیء از کلاس Thread هست (بالا تعریفش کردیم) که یه ورودی میگیره و این ورودی همون url هست که بهش دادیم   . پس از ساختن شیء یا ساختن thread ، با استفاده از متود ()th.start اومدیم thread رو راه انداختیم .در واقع با فراخوانی این متود ، تابع run داخل شیء thread اجرا میشه که توی کلاس Thread تعریفش کردیم . همونطور که میبینید داخل تابع run هم که همون پروسه تست صحت url انجام میشه .

 

در کل ما با سورس بالا یک ادمین فایندری ساختیم که همزمان ۱۵ تا url رو تست میکنه و سرعت خیلی خوبی داره .

با اجرا کردن سورس پیشرفته متوجه افزایش سرعت آن نسبت به سورس مبتدی خواهید شد . و همچنین میتونید با تغییر دادن مقدار حداکثر thread ها سرعت اون رو کم و زیاد کنید .

 

 

Telegram Channel : @mrpythonblog

یا حق !

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