글 작성자: nouu

http://www.yes24.com/Product/Goods/83538369

 

보안 실무자를 위한 네트워크 공격 패킷 분석 - YES24

저자의 풍부한 실무 경험을 바탕으로 보안 업무를 담당하고 있는 실무자와 보안에 입문하고자 하는 독자를 위해 쓰였다. 이 책은 포트 스캔, DDoS, SMB 해킹, 웹 해킹, RAT 악성 코드, 메일 서버 해킹

www.yes24.com

 

해당 서적을 바탕으로 작성하였습니다. 

 

 

 

 

특정 TCP Flags를 다량으로 전송해서 장비의 CPU나 메모리, 운영체제의 자원을 고갈시키는 공격 유형을 자원 고갈 공격이라고 한다. 이 공격은 대부분 TCP 세션을 맺는 과정의 취약점을 이용한 공격이다. 

 

TCP라고 하더라도 3-way-handshake를 완벽히 맺어지지 않은 상태에서는 여러 필드들을 조작할 수 있으며, 큰 크기로 위조하여 대역폭 공격처럼 사용할 수 있다. 

 

 

 

 

많은 자원 고갈 공격 유형중에서 TCP의 3-way-handshake 과정에서 발생 가능한 SYN Flooding 공격을 살펴 볼 것이다. 일단 SYN Flooding의 원리를 정확하게 파악하려면 3-way-handshake의 원리를 파악해야 한다. 

 

 

https://sjlim5092.tistory.com/35

 

TCP 3 way handshake 내용 정리

TCP three-way handshake 란? TCP 는 Connection-Oriented (연결 지향) 프로토콜 입니다. 이 말은 프로토콜에 의해 연속적으로 패킷의 상태 정보를 확인하고 유지하는 것을 기본으로 한다고 생각할 수 있습니

sjlim5092.tistory.com

 

1. 클라는 서버에게 SYN을 전송한다.

2. SYN을 전송받은 서버는 정상적으로 수신했다는 의미로 SYN-ACK를 1로 전송한다. (이후 상태를 Half-Open 상태라고 한다.)

3. 클라는 SYN-ACK을 정상적으로 수신하였다는 의미로 ACK를 서버에게 전송 후 세션이 맺어진다. 

4. 이후 클라는 서버에게 데이터를 요청하는 패킷을 보내고 상호 간 데이터를 송수신한다.

 

 

 

 

SYN Flooding의 가장 큰 특징은 공격자가 TCP 출발지 IP를 존재하지 않는 IP로 위조하여 SYN을 전송한다는 특징이 있다. 이러한 행위를 한다면 서버는 수신받은 SYN에 대해서 무조건 존재하지 않은 IP를 위해 SYN-ACK을 전송하고 돌아올 ACK를 기다릴 것이다. 이 상태를 우리는 Half-Open 상태라 부르며, 서버는 SYN-RECVED 상태를 가진다. 하지만 존재하지 않는 클라 IP는 ACK를 다시 서버에게 보내지 않을 것이며, 서버는 이 ACK를 언젠가 돌아온다고 믿기 때문에 이것을 대비하여 3-way-handshake 관련 정보를 backlog-queue 메모리에 저장하고 특정시간(default 75초)이 지나면 backlog-queue에서 삭제한다. 

 

 

 

 

BackLog란?

https://techpad.tistory.com/62

 

네트워크 연결 최대 개수

하나의 서버가 얼마나 많은 연결을 제한하고 있는지 궁금하시나요? 이 글을 통해 그 답을 얻을 수 있기를 바랍니다. listen (sockfd, backlog) 흔히 소켓(Socket) 을 이용한 서버 프로그램은 listen(sockfd, b

techpad.tistory.com

 

소켓을 이용한 서버 프로그램들은 listen(sockfd, backlog) 함수를 이용하여 클라이언트의 접속을 기다리게 된다. sockfd 인자는 파일의 최대 개수와 관련이 있으며, backlog 인자는 연결되지 않은 요청에 대해 큐를 만듦으로서 큐에 넣을 수 있는 최대 큐와 관련하고 있다. SYN_Flooding에 의해 큐가 가득 찼다면 ENCONNREFUSED 에러를 발생시킨다. 

 

backlog의 최대 값은 sys/socket.h에 정의된 SOMAXCONN을 참조한다. sysctl 명령어를 이용하면 값을 확인하고 원하는 개수로 수정할 수 있다. 자세한건 tcp/ip 소켓 프로그래밍을 통해 더 많은 통찰력을 얻을 수 있을 것 같다...

 

 

이러한 back-log queue의 성질에 의해서 위조된 IP로부터 3-way-handshake를 지속적으로 요청하면 언젠가는 backlog-queue가 가득 차서 더 이상 정상 접속도 연결할 수 없는 상태가 될 것이다. 이것이 SYN Flooding의 원리이다. 

 

정리 

1. 공격자가 출발지의 IP를 위조

2. 공격자가 IP를 위조하여 서버는 3-way-handshake를 통해 세션을 맺으려 하지만 SYN RECV에서 클라의 ACK이 안오기 때문에 Half-open 상태를 유지한다. 

3. 공격자는 계속된 공격으로 결국 서버의 back-log queue가 쌓이면서 ENCONNREFUSED 에러를 발생. 서버의 자원을 고갈시킨다.

 

이것이 SYN Flooding의 핵심 3가지. 사실 원리는 별거 없다. 

 

 

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=nobless_05&logNo=50082436157 

 

TCP,SYN Flooding 공격

SYN Flooding 공격은 서버별로 동시 사용자의 접속수가 제한되어 있으므로 존재하지 않는 클라이언트가...

blog.naver.com

 

netstat -an 명령어를 쳐서 소켓의 연결 상태를 보면 결국 다음과 같은 모양이 나온다. 

 

netstat 상태 정리

상태 설명
LISTEN 서버의 데몬이 정상 동작하여 접속 요청을 기다리는 상태
SYN-SENT 로컬의 클라이언트 어플리케이션이 원격 호스트에 연결을 요청한 상태
SYN_RECEIVED 서버가 원격 클라이언트로부터 접속 요구를 받아 클라이언트에게 응답했지만 아직 클라이언트에게 확인 메시지는 받지 않은 상태
ESTABLISHED 3-way-handshake가 완료되고서 서로 연결된 상태
FIN-WAIT1/CLOSE-WAIT/FIN-WAIT2 서버에서 연결을 종료하기 위해 클라이언트에게 종결을 요청하고 회신을 받아 종료하는 과정의 상태
CLOSING 흔하지 않지만 확인 메세지가 전송 도중 분실된 상태
TIME-WAIT 연결은 종료되었지만 분실되었을 가능성이 있는 느린 세그먼트를 위해 당분간 소켓을 열어놓은 상태
CLOSED 종료되어 완전히 연결이 끊어짐

 

 

 

 

 

위조된 IP로부터 DDos 공격이 발생하다 보면 실제로 존재하는 IP로 위조되는 경우도 발생할 것이다. 위조된 IP로 사용된 클라이언트는 SYN을 요청하지 않았음에도 SYN-ACK을 수신하여 Riset 패킷으로 응답하며, Riset 패킷을 수신한 공격 대상 서버는 backlog-queue에서 삭제하기 때문에 공격이 성공하지 못한다. 

 

즉 공격자는 출발지 주소를 존재하지 않는 주소로 변조를 잘 해야 될 것이다. 

 

발퀄이긴 하지만 그래도 만족한다.

 

 

 

 

 

 

일반적인 SYN Flooding의 형태

 

일반적인 SYN Flooding 공격을 한다면 다음과 같은 패킷들을 볼 수 있다. 출발지 IP를 봐서는 공격자가 여러 조작된 아이피를 지속적으로 victim 서버 192.168.100.50에 SYN을 전송하고 있으며, 다음과 같이 Flags가 SYN이 1인 형태를 볼 수 있다.

 

또한 다음의 공격 패킷들은 SYN 크기가 60바이트로서 크기만으로 볼 때 단순한 거대한 SYN  패킷이 아닌 아주 일반적인 SYN 요청이므로 일반적인 SYN Flooding 형태라고 볼 수 있다. 

 

 

 

 

 

대역폭 공격으로 활용된 SYN Flooding

 

정상적인 SYN 패킷은 데이터를 가질 수 없다. 그렇기 때문에 일반적으로 60 ~ 80 바이트의 패킷 크기를 갖는다. 하지만 대역폭 공격(회선의 bandwidth의 가용성을 침해하는 공격)에 사용되는 SYN 패킷들은 의도적으로 큰 크기의 패킷으로 만들며, 의미 없는 값을 데이터에 포함시켜 크기를 크게 한다.

 

 

 

 

SYN Flooding 대응 방안 : 서버 구간에서 대응방안

1. Back-log queue의 크기를 변경한다. 

SYN Flooding의 공격 기법은 결국 backlog queue를 가득 채워서 자원을 고갈시키는 것이다. 그렇기 때문에 backlog queue를 조금이라도 더 크게 설정해준다. 

sysctl -w net.ipv4.tcp_max_syn_backlog=9012

 

2. syncookies 활성화한다. 

syncoockies란 3-way-handshake 당시 TCP 헤더의 특정한 부분을 추출해서 암호화 알고리즘을 이용한다. SYN을 수신한 서버는 접속 관련 정보를 SYN-ACK에 포함해서 전송 후 backlog queue에는 해당 정보를 저장하지 않는다. 이 때문에 SYN Flooding에서 발생하는 backlog queue 취약점을 보완할 수 있다.

 

 

 

 

SYN Flooding 대응 방안 : 차단 장비에서 설정 방안

서버 구간에서 대응을 해도 한계가 있기 때문에 inline 형식으로 Anti-DDos와 같은 전용 차단 장비가 있어야 한다. 전용 차단 장비의 다양한 기능을 이용하여 대응을 할 수 있다. 

 

1. 위조된 IP 차단 

2. syncoocies 기능 활성화 

3. First SYN Drop

4. 출발지 IP별 임계치 기반 차단

5. 비정상 크기 SYN 패킷 차단