λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
βœ’οΈ Network Communications & Security

[Network Communications & Security] Python μ½”λ“œλ₯Ό ν™œμš©ν•œ UDP μ„œλ²„μ—μ„œμ˜ μ»€μŠ€ν…€ λ©”μ‹œμ§€ Packet 솑·μˆ˜μ‹ 

by A Lim Han 2023. 9. 19.

🦐 Python μ½”λ“œλ₯Ό ν™œμš©ν•œ UDP μ„œλ²„μ—μ„œμ˜ μ»€μŠ€ν…€ λ©”μ‹œμ§€ Packet 솑·μˆ˜μ‹ 

1.  κ°€μƒν™˜κ²½ μ‹€ν–‰ ν›„ Terminal 둜 접속

2.  Command Line에 μ•„λž˜μ™€ 같이 μž…λ ₯ν•˜μ—¬ μ‹€ν–‰ν•  Python 파일 생성

$ nano udpPacket.py

 


++  nano λͺ…λ Ήμ–΄

$ nano [μƒμ„±ν•˜κ±°λ‚˜ νŽΈμ§‘ν•  파일λͺ…]
 nanoλŠ” 터미널 λ˜λŠ” λͺ…령쀄 μΈν„°νŽ˜μ΄μŠ€(CLI)μ—μ„œ κ°„λ‹¨ν•œ ν…μŠ€νŠΈ νŒŒμΌμ„ μƒμ„±ν•˜κ±°λ‚˜ νŽΈμ§‘ν•˜λŠ” 데 μ‚¬μš©λ˜λŠ” λͺ…령어이닀.

 nano λͺ…λ Ήμ–΄μ˜ μ‚¬μš© ν˜•μ‹μ€ μœ„μ™€ κ°™μœΌλ©°, 파일이 μ‘΄μž¬ν•˜μ§€ μ•Šμ„ 경우 ν•΄λ‹Ή νŒŒμΌμ„ μƒμ„±ν•˜κ³  이미 파일이 μ‘΄μž¬ν•˜λŠ” 경우 νŽΈμ§‘ κ°€λŠ₯ν•œ 창을 λ„μš΄λ‹€.

3.  μ•„λž˜μ™€ 같이 μ½”λ“œ μž‘μ„± ν›„ Ctrl + O 와 Ctrl + X λ₯Ό μ°¨λ‘€λ‘œ 눌러 파일 μ €μž₯

#!/usr/bin/python3
# Target ip = 10.0.2.15

import socket

IP = "0.0.0.0"
PORT = 9090

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind((IP, PORT))

while True:
γ…€γ…€γ…€γ…€data, (ip, port) = sock.recvfrom(1024)
γ…€γ…€γ…€γ…€print("Sender: {} and Port: {}".format(ip, port))
γ…€γ…€γ…€γ…€print("Received message: {}".format(data))

 

++  μ½”λ“œ μ„€λͺ… 상세

μ½”λ“œ μ„€λͺ…
import socket λ„€νŠΈμ›Œν¬ 톡신 관리λ₯Ό μœ„ν•œ
socket 라이브러리λ₯Ό μž„ν¬νŠΈ
IP = "0.0.0.0" μ†ŒμΌ“μ΄ 바인딩될 IP μ£Όμ†Œ μ„€μ •
(0.0.0.0 은 λͺ¨λ“  μΈν„°νŽ˜μ΄μŠ€λ₯Ό 의미)
PORT = 9090 μ†ŒμΌ“μ΄ 바인딩될 포트 번호 μ„€μ •
sock = socket.socket
(socket.AF_INET, socket.SOCK_DGRAM)
AF_INET이 IPv4 μ£Όμ†Œ νŒ¨λ°€λ¦¬λ₯Ό μ‚¬μš©ν•˜κ³ ,
SOCK_DGRAM은 UDP ν”„λ‘œν† μ½œμ„
μ‚¬μš©ν•˜λŠ” μ†ŒμΌ“μ„ 생성
sock.bind((IP, PORT)) μ†ŒμΌ“μ„ IP μ£Όμ†Œμ™€ 포트 λ²ˆν˜Έμ— 바인딩
while True: UDP νŒ¨ν‚·μ„ μˆ˜μ‹  및 μ²˜λ¦¬ν•˜λŠ”
λ¬΄ν•œ 루프 μ½”λ“œ
data, (ip, port) = sock.recvfrom(1024) μ†ŒμΌ“μ„ 톡해 μ΅œλŒ€ 1024 Byte의 데이터λ₯Ό
μˆ˜μ‹ ν•œ λ’€ IPμ£Όμ†Œμ™€ 포트 번호λ₯Ό λ³€μˆ˜μ— μ €μž₯
print("Sender: {} and Port: {}".format(ip, port)) 데이터λ₯Ό 보낸 ν΄λΌμ΄μ–ΈνŠΈμ˜
IP μ£Όμ†Œμ™€ 포트 번호λ₯Ό 좜λ ₯
print("Received message: {}".format(data)) μˆ˜μ‹ ν•œ λ©”μ‹œμ§€ λ‚΄μš© 좜λ ₯

4.  Command Line에 μ•„λž˜μ™€ 같이 μž…λ ₯ν•˜μ—¬ Python 파일 μ‹€ν–‰

$ sudo python3 udpPacket.py


++  sudo & 파일 μ‹€ν–‰ λͺ…λ Ήμ–΄

$ sudo [μ‚¬μš©ν•  인터프리터] [μ‹€ν–‰ν•  파일λͺ…].py
 sudo λͺ…λ Ήμ–΄λŠ” 슈퍼 μœ μ €(Super User) κΆŒν•œμœΌλ‘œ λͺ…령을 μ‹€ν–‰ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ˜λ©°, μ‚¬μš©ν•  μΈν„°ν”„λ¦¬ν„°μ˜ μ’…λ₯˜μ™€ μ‹€ν–‰ν•  파일λͺ…을 뒀이어 μž…λ ₯ν•˜λ©΄ 파일의 μ½”λ“œκ°€ μ‹€ν–‰λœλ‹€.

5.  νŒŒμΌμ„ μ‹€ν–‰μ‹œν‚¨ μƒνƒœμ—μ„œ 우츑 μƒλ‹¨μ˜ λ°”λ₯Ό 눌러 New Window 클릭

6.  μƒˆλ‘œμš΄ μ°½μ—μ„œ nc(netcat) λͺ…λ Ήμ–΄λ₯Ό μ•„λž˜μ™€ 같이 μž…λ ₯ ν›„ Enter 클릭

$ nc -u 10.0.2.15 9090

 


++  netcat (nc) λͺ…λ Ήμ–΄

$ nc -[μ˜΅μ…˜] [λͺ…령이 μˆ˜μ‹ ν•  Port Number]
 netcat (nc) λͺ…λ Ήμ–΄λŠ” λ„€νŠΈμ›Œν¬ 연결을 생성 및 κ΄€λ¦¬ν•˜λŠ” 역할을 μˆ˜ν–‰ν•˜λŠ” μœ ν‹Έλ¦¬ν‹°λ‘œ, λ‹€μ–‘ν•œ μ˜΅μ…˜λ“€κ³Ό ν•¨κ»˜ μ‚¬μš©ν•  수 μžˆλ‹€.

 μœ„와 같은 μ‚¬μš© ν˜•μ‹μ„ 가지며, λͺ…λ Ήμ–΄ μ‹€ν–‰ μ‹œ μ§€μ •ν•œ ν¬νŠΈμ—μ„œ λ“€μ–΄μ˜€λŠ” λ„€νŠΈμ›Œν¬ 연결을 μˆ˜μ‹ ν•˜κ³  ν•΄λ‹Ή 연결에 λŒ€ν•œ 데이터λ₯Ό ν‘œμ‹œν•œλ‹€.

 

nc λͺ…λ Ήμ–΄ μ˜΅μ…˜ μ„€λͺ…
- l ncλ₯Ό λ¦¬μŠ€λ‹ λͺ¨λ“œ, 즉 μ—°κ²° μš”μ²­μ„ μˆ˜μ‹ ν•˜λŠ” λͺ¨λ“œλ‘œ μ„€μ •
- n 호슀트 및 포트λ₯Ό 숫자둜 ν‘œμ‹œν•˜κ³ 
DNS 이름 해석을 λΉ„ν™œμ„±ν™”
- u UDP ν”„λ‘œν† μ½œμ„ μ‚¬μš©ν•˜μ—¬ μ—°κ²°μ„ μˆ˜μ‹ 
- v μ—°κ²° 및 데이터 전솑과 κ΄€λ ¨λœ 정보λ₯Ό μžμ„Έν•˜κ²Œ(verbose) ν‘œμ‹œ

7.  μƒˆλ‘œμš΄ μ°½μ—μ„œ μ „μ†‘ν•˜κ³ μž ν•˜λŠ” λ¬Έμžμ—΄ μž…λ ₯  -->  이전 μ°½μ—μ„œ μ„±κ³΅μ μœΌλ‘œ 메세지λ₯Ό λ°›μ•„ 좜λ ₯ν•˜λŠ” 것을 확인

μž…λ ₯ν•œ λ¬Έμžμ—΄μ€ 'hello'