본문 바로가기
Python

Python을 이용한 TCP_SYN_Flooding 공격 구현

by 웹하는빡통 2020. 7. 13.

TCP(연결 지향 프로토콜): 메시지르 보내기 전에 3-Way-handshake 과정을 통해 메시지를 정상적으로 전달하는 방식이다.   
먼저 syn flooding 공격을 설정하기 전 3-way-handshake 과정에 대해 알아보자 
TCP는 세 차례의 패킷들을 주고받는 과정을 거쳐야한 TCP 연결(Connection)이 성립(establish)이 된다. 패킷을 주고 받는 내용은 아래와 같다. 

 


먼저 Client는 Server와 통신하기 하기 위해 SYN 패킷(sequence number 포함)을 생성해서, Server에게 전달 한다.

 
ServerSYN 패킷(sequence number 포함)과 받은 SYN의 대답 격인 ACK 패킷(acknowledgement number 포함)을 Client에게 전달한다. 그리고 Server는 Client의 접속을 받아들이기 위해, RAM(메모리)에 일정 공간을 확보한다. 그 다음  acknowledgement number의 값은, 방금 받은 SYN 패킷의 sequence number 값에 일정 값을 증가시켜서 보낸다.


그리고 다시 Client는 방금 받은 SYN의 대답 격인 ACK 패킷(acknowledgement number 포함)을 Server에게 전달한다. 여기서도 마찬가지로 acknowledgement number의 값은, 방금 받은 SYN 패킷의 sequence number 값에 일정 값을 증가시켜서 보냄으로써 Client는 Server에 Established 상태로 연결이 된다. 

이것이 3-way-handshake 동작 과정이다. 자 그럼 이제 TCP_SYN_Flooding 공격에 대해 알아보자. 

 

SYN_Flooding 공격은 Dos(서비스 거부 공격)에 일종이으로 TCP 연결 과정 중 3-Way Handshake 과정에서 Half-Open 연결 시도가 가능하다는 취약점을 이용한 공격으로 공격대상 시스템은 외부로부터 접속 요청을 더 이상 받아들일 수가 없게 되어 정상적인 서비스를 제공할 수 없게 되는 공격방식이다.  

즉, 공격자가 대량의 SYN 패킷을 공격대상자에게 전송하면 대상자는 SYN/ACK 패킷을 전달하는데 이때 공격자가 ACK 패킷을 보내지 않으면 대상자 시스템은 일정 시간동안 신호를 기다리게 된다. 

 

 

SYN_Flooding 공격 과정. 

 

 

 

1) 클라이언트가 SYN만 보내고 아무런 동작을 하지 않는다면 해당 연결 요청은 TCP Connection Timeout 시간동안 계속 SYN Backlog Queue에 남아있게 된다.

 

2) 다수의 클라이언트가 고의로 이런 행동을 한다면 SYN Backlog Queue는 가득 차게 된다.

 

3) SYN Backlog Queue가 가득차면 더이상의 연결요청을 받아 들일 수 없게된다.

 

※ Backlog Queue

  • 3-Way-Handshake를 위해 연결이 진행중인 요청을 담아두는 큐
  • SYN Backlog Queue엔 SYN을 보내온 연결요청 정보가 임시로 저장된다.
  • 서버는 SYN에 대해 SYN/ACK을 보내고 ACK을 받기 전까지 저장해 두는 것이다.
  • 큐가 가득차면 다른 연결을 받아들일 수 없게 된다.

 

TCP_SYN_Flooding 소스코드.

 

 

실행 결과. 

공격 카운터 갯수를 1만개로 설정하고 프로그램을 실행 시킨다.

 

와이어 샤크로 확인 한 결과 출발지 주소를 무작위로 조작하여 해당 목적지 주소에 대량에 SYN 패킷을 보내는 것을 알 수 있다. 

 

※ 해당 부분은 가상머신에서 실습하길 바란다. 

댓글