취약점분석 (Blue Team)/Network

[Network] IP Spoofing

poiri3r 2026. 6. 5. 14:46

이번 포스팅은 IP Spoofing입니다.

4계층에서의 DDOS 공격을 다루고 싶었는데 사전 지식으로 IP Spoofing에 대한 부분이 필요할 것 같더라고요.

간단하게만 다뤄보도록 하겠습니다.

출처 : https://www.cloudflare.com/learning/ddos/glossary/ip-spoofing/

IP 스푸핑의 개념 자체는 매우 쉽습니다.

패킷의 출발지 IP (source IP)를 가짜로 속이는 공격 기법입니다.

IP 헤더의 source IP 필드는 송신자가 직접 넣는 값이기 때문에 수신자 입장에서는 이게 진짜 IP가 들어왔는지 검증이 어렵습니다.

다음과 같은 상황을 보겠습니다.

client의 ip가 1.2.3.4인데 악의적인 사용자 eve가 SrcIP를 1.2.3.4로 위장하여 서버로 보냈습니다.

이게 기본적인 ip spoofing입니다.

만약 서버가 IP주소를 기반으로 패킷을 처리하는 로직이 있다면 이러한 공격에 아주 취약할 것입니다.

IP 기반의 접근 제어를 사용하는 경우거나, UDP 서비스를 외부에 열어둔 경우가 있습니다. (UDP 서버는 검증 X)

두번째 사진은 TCP 연결에서의 IP spoofing입니다.

이런 경우 서버에 대한 공격이 유효하지는 않습니다.

SYN 패킷에서 Src IP를 조작해서 보내더라도 서버가 Client로 SYN+ACK을 보냅니다.

client 입장에서는 TCP 연결을 요청한적이 없는데 응답이 왔으니 패킷을 가지고 있다가 폐기할 것입니다.

하지만 이런 TCP 연결도 악용될 수 있습니다.

L4 DDOS 공격의 일종인 SYN Reflection 공격입니다.

아까의 경우에서 SYN 패킷을 각기 다른 서버로 100개를 보낸다고 생각해보겠습니다.

(극단적으로 100개가 아니라 10000개라고 생각해도 됩니다)

Server는 Source IP만 보고 Client로 서로 다른 서버로부터 SYN+ACK를 100개 받게될 것입니다.

이때 client에 부하가 발생하게 됩니다.

자세한 내용은 다음에 다루겠지만, 이런식으로 TCP 연결도 악용될 수 있습니다.

또 이런 reflection 공격의 경우에는 공격자를 찾아내기가 직접적인 공격들에 비해 상당히 어렵습니다.

물론 효율이 좋은 공격 방식은 아닙니다.

 

그리고 공부하면서 알게된건데, burp suite로 ip를 변경하는거랑 IP Spoofing은 조금 다릅니다.

포스팅 하기 전에는 실습으로 burp suite로 내 ip주소 바꾸는걸 생각했었는데 생각해보니 엄연한 프록시네요.

그래서 

이런 ip주소 알려주는 사이트를 대상으로 IP spoofing을 하려고 했는데, 곰곰히 생각해보니까 IP 조회 페이지같은 경우는 전부 TCP 연결이기 때문에 정상적인 spoofing이 불가능 합니다.

 

그래서 노트북을 켜서 노트북으로 제 컴퓨터 ip로 바꿔서 패킷을 보낸뒤, SYN+ACK이 들어오는지 확인해보겠습니다.

scapy를 이용해서 작성을 했고,

from scapy.all import IP, TCP, send
import random

spoofed_src_ip = "내 PC 주소"

target_ip = "인터넷상 아무 주소"

target_port = 443

# 임의의 출발지 포트
src_port = random.randint(1024, 65535)

packet = (
    IP(src=spoofed_src_ip, dst=target_ip)
    /
    TCP(
        sport=src_port,
        dport=target_port,
        flags="S",
        seq=random.randint(0, 4294967295)
    )
)

print("[*] Sending spoofed SYN packet")
print(f"[*] Source IP: {spoofed_src_ip}")
print(f"[*] Destination IP: {target_ip}:{target_port}")

send(packet, verbose=True)

이런 코드를 사용했고, www.naver.com 으로 보냈습니다. 

패킷이 3개 도착했고, syn+ack를 포함한 패킷이 있습니다.

제 pc에서 첫번째 syn,ack에 대한 답장을 안하니 다시 재전송을 한 패킷도 보입니다.

 

python의 scapy를 썼는데 scaapy외에도 hping, packETH 등 여러가지 방법이 있긴 합니다.

 

잠깐만 냅둬도 패킷이 정말 수없이 많이 쌓이네요,

이거 일일히 분석하는것도 쉽지 않아 보입니다.

빅데이터 처리 관련 공부도 해보고 싶네요.

 

읽어주셔서 감사드리고 다음 포스팅에서 뵙겠습니다.

오늘하루 정말 열심히 글쓰고 있네요 ㅎ