-
دوشنبه, ۳۱ شهریور ۱۳۹۹، ۰۵:۰۹ ب.ظ
-
۱۱۵۲
آموزش ساخت cracker پروتکل FTP در پایتون
درود به همه !
امروز در خدمت شما هستیم با یکی دیگر از مباحث کرکینگ . در این پست آموزشی یاد میگیریم چطوری میتونیم در پایتون ابزاری بنویسیم که یک حمله ی دیکشنری روی پروتکل FTP پیاده سازی کند . همانطور که میدانید ما در حمله ی دیکشنری لیستی از نام های کاربری و پسوورد ها را تست میکنیم تا نهایتا به نام کاربری و پسوورد صحیح برسیم . با ما همراه باشید .
پروتکل FTP مخفف File Transfer Protocol ، پروتکلی بر پایه TCP است که برای رد و بدل کردن فایل ها در شبکه مورد استفاده قرار میگیرد و روی پورت TCP 21 فعالیت میکند .
این پروتکل به صورت کلاینت و سرور عمل میکند . برای مثال فرض کنید کامپیوتر A و کامپیوتر B هردو در یک شبکه مشترک هستند و و کامپیوتر A میخواد یک سری فایل را توسط پروتکل FTP از کامپیوتر B بردارد . در اینجا کامپیوتر B به سرور FTP تبدیل میشود و روی پورت ۲۱ خود شنود میکند. حال کامپیوتر A از طریق پورت TCP 21 به سرور FTP یعنی کامپیوتر B متصل میشود . در نتیجه یک ارتباط کلاینت سرور برقرار خواهد شد و حالا کامپیوتر A به شرط داشتن نام کاربری و پسوورد ، میتواند فایل هایی که نیاز دارد را از کامپیوتر B با استفاده از پروتکل FTP بردارد .
به یک سرور FTP ، چندین کلاینت میتوانند متصل شوند و فایل رد و بدل کنند :
تا اینجا به طور مختصر با پروتکل FTP در شبکه آشنا شدیم . حال کار اسکریپت ما این است که به عنوان یک کلاینت FTP ، با استفاده از نام کاربری و پسوورد های مختلف تلاش کند به یک سرور FTP متصل شود . با این آزمون و خطا میتواند نام کاربری و پسوورد صحیح را تشخیص دهد . لیست یا دیکشنری نام های کاربری و پسوورد ها را خودمان به اسکریپت خواهیم داد .
اولا ما نیاز به یک فایل از جفت نام های کاربری و پسوورد ها داریم (Dictionery) . این فایل را میتوانیم خودمان بسازیم برای مثال محتوای یک فایل دیکشنری میتواند به شکل زیر باشد :
username1:password1 username2:password2 username3:password3 username4:password4 username5:password5 ...
همانطور که میبینید یوزرنیم ها و پسوورد ها به طور جفت جفت در هر خط نوشته شده اند و با علامت دونقطه (:) از هم جدا شده اند .
حال اسکریپت ما با خواندن خط به خط این فایل ، هر جفت یوزرنیم و پسوورد را تست میکند تا نهایتا به جفت صحیح برسد .
برای نوشتن اسکریپت امروز نیاز به دو کتابخانه داریم . اول کتابخانه ی ftplib برای استفاده از پروتکل FTP در پایتون(که به طور پیشفرض روی پایتون نصب است) و سپس کتابخانه ی colorama برای نوشتن متون رنگی در پایتون .
برای نصب کتابخانه از ابزار pip استفاده میکنیم :
نصب کتابخانه colorama لینوکس :
MrPython@debian:~$ sudo pip3 install colorama
نصب کتابخانه colorama روی ویندوز :
C:\> pip install colorama
پس از نصب کتابخانه میریم سراغ سورس کد :
import ftplib import colorama
def connect(host,username,password): ftp = ftplib.FTP() print(colorama.Fore.RED + "trying -> {}:{}".format(username,password)) try: ftp.connect(host,21,timeout=5) ftp.login(username,password) return True except ftplib.error_perm: return False
colorama.init() # init colorama host = input("host : ") dic = input("Dictionery File : ")
for userpass in open(dic): userpass = userpass.strip("\n") username = userpass.split(":")[0] password = userpass.split(":")[1] if connect(host,username,password) : print("-------------------") print(colorama.Fore.GREEN + "Username : {}\nPassword : {}".format(username,password)) break
توضیح سورس کد :
در ابتدا کتابخانه های مورد نیاز را ایمپورت کردیم . سپس یک تابع به نام connect تعریف کردیم که سه ورودی یعنی IP سیستم هدف ، یک یوزرنیم و یک پسوورد دریافت میکنه و فعالیت زیر رو انجام میده :
۱ - در ابتدا یک شیء ftplib.FTP میسازه و میریزه داخل متغییر ftp
۲ - سپس با رنگ قرمز چاپ میکنه که چه یوزرنیم و پسووردی رو داره تست میکنه
۳ - با استفاده از عبارت try / except ، سعی میکنه با یوزرنیم و پسوورد فعلی وصل بشه به پورت ۲۱ سیستم هدف . اگر یوزرنیم و پسوورد صحیح باشه که برنامه بدون خطا وصل میشه به سیستم هدف و در نتیجه کد های داخل بلوک try اجرا خواهد شد و نهایتا تابع مقدار True رو به عنوان خروجی بر میگردونه . ولی اگر یوزرنیم و پسوورد صحیح نباشن ، برنامه یه خطای error_perm تولید میکنه و در نتیجه کد های داخل except اجرا میشه و نهایتا تابع مقدار False رو به عنوان خروجی برمیگردونه .
پس از تعریف تابع ، با استفاده از تابع colorama.init ، کتابخانه colorama را پیکربندی و آماده استفاده کرده ایم .
در خط بعد یک ورودی به نام host از کاربر گرفته ایم که همان IP سیستم هدف است .
سپس یک ورودی دیگر به نام dic گرفتیم که همان آدرس فایل دیکشنری نام های کاربری و پسوورد ها است .
پس از اون یه حلقه ی for روی فایل دیکشنری ایجاد کردیم تا به تک تک خطوط آن دسترسی داشته باشیم . درون حلقه for در ابتدا n\ آخر خط را حذف کرده ایم و سپس username و password را تفکیک و درون دو متغییر جداگانه ذخیره کرده ایم .
حال با استفاده از یک دستور if و تابع connect که در بالا نوشتیم ، چک کرده ایم که آیا با یوزرنیم و پسوورد فعلی میتوان به سیستم هدف وصل شد یا نه . اگر جواب بله باشد ، تابع connect مقدار True را بر میگرداند و در نتیجه کد های درون if اجرا میشود . پس یوزرنیم و پسوورد صحیح چاپ میشود و برنامه توسط دستور break از حلقه for خارج میشود و عملا تمام میشود .
ولی در صورتی که نتوان توسط یوزرنیم و پسوورد فعلی به سیستم هدف وصل شد یعنی یوزرنیم و پسوورد اشتباه بوده است پس تابع connect مقدار False را برمیگرداند و کد های درون if اجرا نخواهد شد .
نهایتا پس از اجرای اسکریپت و دادن ورودی های مورد نیاز به او ، با عملکرد زیر مواجه میشویم :
یا حق !
Telegram Channel : @mrpythonblog