راه‌اندازی اسکریپت‌های باگ بانتی شما با پایتون و Bash- بات نظارت بر زیردامنه‌ها

راه‌اندازی اسکریپت‌های باگ بانتی شما با پایتون و Bash- بات نظارت بر زیردامنه‌ها

اتومیشن سازی کار بسیار جالبی است و که اگر به روش صحیح انجام شود، جذاب تر خواهد شد. اما نوشتن اسکریپت‌های اتومیشن سازی مهم‌ترین چیز برای خودکار کردن فرایندها است. بنابراین در این مقاله در مورد نوشتن اسکریپت‌های اتومیشن سازی در پایتون و Bash برای سرور  VPSشما صحبت خواهیم کرد.

پیش از هرچیز قصد داریم بدانیم سیستم اتومیشن ما چه کاربردهایی خواهد داشت. موارد ممکن به شرح زیر است:

  • نظارت بر زیردامنه های جدید
  • Log poisoning
  • ابزار Nuclei
  • Waybackurls with gf
  • و …

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

الگوریتم

الگوریتم می‌تواند در متدولوژی‌های مختلف طراحی شود. در Bash و در پایتون به طور ترکیبی به سراغ اجرای پایتون و دستورات shell به کمک اسکریپت‌های Bash می‌رویم.

فایل موجود domains.txt که دربرگیرنده اهداف تهیه شده توسط کاربر است را باز کنید.

 

چند هدف را از میان هزاران دامنه‌ای که ممکن است در فایل باشد مرتب کنید. نمی‌خواهیم حجم سنگینی از اطلاعات را روی شبکه/ماشین خود آپلود کنیم.

 

یک ابزار را روی آن‌ها اجرا کنید (می‌تواند ابزار amass باشد) و خروجی آن را در فایلی به نام new-subdomains.txt بگذارید.

 

این فایل را با فایل قدیمی به نام sundomains.txt مقایسه کنید و موارد جدید را فیلتر کنید.

 

آن‌ها را به یک راه ارتباطی تعریف شده توسط کاربر مانند ایمیل یا Slack (برنامه چت مخصوص کسب و کارها) ارسال کنید. همچنین زیردامنه های جدید را  در فایل subdomains.txt بنویسید به این ترتیب شما می‌توانید در زمان هانت یک لیست از تارگت‌ها داشته باشید.

مراحل راه‌اندازی

ایجاد دایرکتوری‌ها برای سازماندهی به تمامی دیتا ها مهم است. بنابراین باید دایرکتوری‌ها را تنظیم کنید تا همه‌چیز به هم نریزد. ساختار دایرکتوری می‌تواند به صورت زیر باشد:

 

.
├── domains.txt
├── init.py
├── last.txt
├── main.sh
├── max.txt
├── runner.py
├── sorter.py
└── targets
    ├── abc.com
    │   ├── new-subdomains.txt
    │   └── subdomains.txt
    └── xyz.com
        ├── new-subdomains.txt
        └── subdomains.txt

 

خب در اینجا فایل domains.txt شناخته شده است، init.py اسکریپتی است که تارگت‌های جدید را مقداردهی اولیه می‌کند، runner.py اسکریپت اصلی است، sorter.py تعداد موردنظر از دامنه ها را از فایل domains.txt خارج می‌کند و خروجی آن را در فایل max.txt می‌گذارد، و آخرین مورد last.txt فایلی است که شامل آخرین دامنه‌های اسکن شده است بنابراین اسکریپت می‌تواند از آن ادامه پیدا کند.

قبل از اینکه وارد کد شویم، اجازه دهید چیزی به شما بگویم

گاهی اوقات دلیل اتومیشن سازی می‎تواند مصرف کردن باقی‌مانده داده های اینترنتی شما به شیوه‌ای درست و سازنده باشد (که به نوعی دلیل من نیز است). برای استفاده از داده‌های باقی‌مانده شما برای اننجام برخی کارهای مفید (پربار) می‌توانید از Honeygain استفاده کنید. این یک سرویس آنلاین است که به شما کمک می‌کند از داده‌های اینترنتی باقی‌مانده خود پول دریافت کنید. شما می‌توانید داده‌های باقی‌مانده خود را با موبایل، سیستم و هر دستگاهی که می‌خواهید، به اشتراک بگذارید.

Sorter.py

پیش از هرچیز کد Sorter.py را ببینیم:

import os

# Edit the line below to specify the number of domains to be scanned in a run
max_scans = 11

last_scanned_url = open("last.txt", 'r').read().replace("\n", '')

length = 0

with open("domains.txt", "r") as urls_file:
     for url in urls_file:
         url = url.replace('\n', '')
         if url == last_scanned_url:
            for i in range(max_scans):
                next_url = urls_file.readline().replace('\n', '')
                print(next_url)
                length += 1
                open('last.txt', 'w').write(next_url)

if length < max_scans:
    with open("domains.txt", 'r') as urls_file:
         for url in urls_file:
             url = url.replace('\n', '')
             if length < max_scans:
                print(url)
                length += 1
                open('last.txt', 'w').write(url)

اکنون، این کد را در عمل ببینیم.

امیدوارم متوجه شده باشید، اگر نه بیایید با هم درک کنیم.

این کد اول از همه فایل last.txt را باز می‌کند و آخرین دامنه اسکن شده را دریافت می‌کند. بعد از آن فایل domains.txt را باز می‌کند و بررسی می‌کند که آخرین دامنه اسکن شده کجاست. زمانی که پیدا شد، دامنه را چاپ می‌کند و آن را در last.txt می ‌نویسد بنابراین دفعه‌ی بعد می‌تواند از آن قسمت اجرا شود. همچنین، اگر به آخرین سطر از فایل برسد، دوباره به سطر اول برمیگردد و فایل را دوباره از اول می‌خواند. سپس با دستور python3 sorter.py > max.txt اجرا می‌شود که می‌تواند خروجی را در فایل بنویسد. اکنون یه سوال ساده:

این را می‌توان مستقیما از اسکریپت اصلی انجام داد پس چرا اینجاست؟

 

پاسخ: بله می‌توانید آن کار را انجام دهید. اما زمانی که از چندین بات استفاده کنید، همه چیز نامنظم خواهد شد. برای جلوگیری از بهم ریختگی موارد، آن‌ها را به یک شیوه منظم انجام دهید.

ایجاد اسکریپت اصلی runner.py

این یک اسکریپت مهم برای ما است که مسئولیت انجام تمامی وظایف را دارد. اما قبل از راه‌اندازی آن نیاز داریم که راه ارتباطی slack را راه‌اندازی کنیم، ابتدا آن را انجام دهیم.

راه اندازه کانال Slack

فرض کنید که شما قبلا یک اکانت و فضای کاری در Slack داشتیدو مراحل زیر را دنبال کنید:

  • فضای کاری Slack را باز کنید. (https://app.slack.com/client/<something>/<otherthing>) و بر روی اضافه کردن کانال کلیک کنید.
روی دکمه add channels کلیک کنید

 

  • یک نام مناسب بگذارید و بر روی ایجاد کلیک کنید. اضافه کردن افراد را رد کنید.
یک نام برای کانال انتخاب کنید

 

یک اپلیکیشن جدید ایجاد کنید
  • بعد از آن یک باکس جدید ظاهر می‌شود بر روی From Scratch > Give it a name >کلیک کنید، یک کانال به آن اختصاص دهید و روی ایجاد برنامه کلیک کنید.
اسکرچ را ازاینجا انتخاب کنید

 

  • زمانی که ایجاد شد، بر روی Incoming wehbooks سوییچ کنید (عوض کنید).
Incoming webhook
سوییچ کردن روی incoming webhooks

 

  • زمانی که سوییچ کردید، صفحه‌ای مشابه را خواهید دید:
Slack webhook API

 

  • بر روی Add New Webhook to Workspace کلیک کنید، به صفحه‌ای هدایت خواهید شد کهیک کانال slack انتخاب کنید که امکان ارسال پیام داشته باشد. اکنون فقط کانال را انتخاب کنید و کلیک کنید.
به ربات اجازه دهید تا با کمک incoming webhook به کانال Slack پیام ارسال کند

 

 

  • زمانی که انجام شد، شما می‌توانید یک دستور curl در بخش Sample curl request to post to a channel ببینید. کافی است آن را کپی کنید و در ترمینال بزنید. اکنون شما می‌توانید یک پیام در کانال slack ببینید.
دریافت دستور cURL برای ارسال پیام در slack

 

دستور را اجرا کنید

 

و پیام را در کانال slack تان مشاهده کنید

اکنون راه‌اندازی کانال  slack به اتمام رسیده است و پیام می‌تواند با تغییر مقدار “text” در فایل JSON تغییر یابد.

Runner.py اسکریپت اصلی

این اسکریپت وظیفه‌ی اجرای ابزارهای مختلف، مقایسه‌ی خروجی ها و سپس ارسال پیام به slack را دارد. بنابراین در ابتدا یک تابع ایجاد می‌کنیم که پیام‌ها را به slack ارسال کند.

 

import requests

def send_msg_to_slack(message):
# Get your webhook URL `Incoming Webhooks` page. It will be like 
#https://hooks.slack.com/services/T04RRRRRRRR/B04RRRRRRRR/B55JREDACTEDREDACTEDAAAA
 # The link above is just a random link
    webhook_url = "<paste_your_webhook_URL_here>"
    payload = {"text": message}
    requests.post(webhook_url, json=payload)

 

اکنون نیاز داریم که یک ابزار را به کمک پایتون و مقایسه‌ی فایل قدیم و جدید، برای شمارش زیردامنه‌ها اجرا کنیم ( در این قسمت من با ابزار amass نشان خواهم داد). (مهم: دستور باید فقط در دایرکتوری تارگت اجرا شود و اسکریپت در . )

و قبل از آن ما از تابع system() از ماژول os برای اجرای دستور استفاده کردیم. با ماژول subprocess نیز می‌تواند انجام شود.

from os import system

def run_amass():
    with open("max.txt", 'r') as file:
        for target in file:
            target = target.replace("\n", '')
            system(f"cd targets/{target}/ && amass enum -d {target} -o new-subdomains.txt")
            
            # read the old subdomain list and save it in old_subdomains
            old_subdomains = []
            with open(f"targets/{target}/subdomains.txt", 'r') as old_subdomain_list:
                for subdomain in old_subdomain_list:
                    subdomain = subdomain.replace('\n', '')
                    old_subdomains.append(subdomain)
                    
            # read the new subdomain list and save it in new_subdomains
            new_subdomains = []
            with open("targets/{target}/new-subdomains.txt", 'r') as new_subdomain_list:
                for subdomain in new_subdomain_list:
                    subdomain = subdomain.replace("\n", '')
                    new_subdomains.append(subdomain)
                    
            # compare them and send new ones to slack and
            # also write them to old subdomain list
            found_subdomains = [] # will store the unique subdomains/newly found
            for subdomain in new_subdomains:
                if subdomain in old_subdomains:
                    pass
                else:
                    found_subdomains.append(subdomain)
            if len(found_subdomains > 0):
                msg = "The following new subdomains were found:-"
                for subdomain in found_subdomains:
                    msg = msg + "\n" + subdomain
                send_msg_to_slack(msg)
            # now, write them to old subdomains file
            to_write = open(f"targets/{target}/subdomains.txt", 'r').read()
            for subdomain in found_subdomains:
                if to_write == "":
                    to_write = subdomain
                else:
                    to_write = to_write + "\n" + ""
            open(f"targets/{target}/subdomains.txt", 'w').write(to_write)

init.py

از آنجایی که ممکن است هزار دامنه در دسترس باشد، بنابراین ما نیاز داریم که ایجاد پوشه و اجرای اولیه ابزار amass را به طور خودکار انجام دهیم.( ما نیاز داریم که فایلی به نام init.txt را ایجاد کنیم که شامل تمام دامنه هایی است که برای اپ می‌خواهیم) همچنین باید mkdir targets را  برای ایجاد دایرکتوری اجرا کنیم. پس از ان اسکریپت آماده اجرا است)

import os

with open("init.txt", 'r') as file:
     for line in file:
     line = line.replace('\n', '')
     os.mkdir(f"targets/{line}")
     os.system(f'cd targets/{line}/ && amass enum -d {line} -o subdomains.txt')
     open('domains.txt', 'a').write(("\n" + line))

اسکریپت باید با توجه به دایرکتوری ساختار فایل که در قسمت بالا در مقاله آورده شده است در . اجرا شود.

جمع‌بندی- main.sh

ما باید sorter.py و سپس runner.py را برای انجام آنچه می‌خواهیم اجرا کنیم. بنابراین آن را می‌توانیم به طور ساده با اسکریپت‌های شل انجام دهیم.

python3 sorter.py > max.txt
python3 runner.py

زمانی که ذخیره شد، دستور زیر را اجرا کنید تا فایل اجرایی ایجاد شود.

chmod +x main.sh

زمانبندی با contrab

همانطور که قبلا صحبت کردیم از contrab، برای زمانبندی اسکریپت‌ها استفاده می‌کنیم. با اضافه کردن سطر زیر به contrab می‌توانید این کار را انجام دهید.

00 01 * * * cd /path/to/your/bot/folder/ && ./main.sh

این دستور، اسکریپت را هر روز ساعت 1:00 با توجه به ساعت سیستم اجرا می‌کند.

امیدوارم که از این مقاله لذت برده باشید 🙂

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *