[21.10.5] 자원 고갈 공격과 대역폭 공격 SYN Flooding
http://www.yes24.com/Product/Goods/83538369
해당 서적을 바탕으로 작성하였습니다.
특정 TCP Flags를 다량으로 전송해서 장비의 CPU나 메모리, 운영체제의 자원을 고갈시키는 공격 유형을 자원 고갈 공격이라고 한다. 이 공격은 대부분 TCP 세션을 맺는 과정의 취약점을 이용한 공격이다.
TCP라고 하더라도 3-way-handshake를 완벽히 맺어지지 않은 상태에서는 여러 필드들을 조작할 수 있으며, 큰 크기로 위조하여 대역폭 공격처럼 사용할 수 있다.
많은 자원 고갈 공격 유형중에서 TCP의 3-way-handshake 과정에서 발생 가능한 SYN Flooding 공격을 살펴 볼 것이다. 일단 SYN Flooding의 원리를 정확하게 파악하려면 3-way-handshake의 원리를 파악해야 한다.
https://sjlim5092.tistory.com/35
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) 함수를 이용하여 클라이언트의 접속을 기다리게 된다. 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
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 패킷 차단
'보안' 카테고리의 다른 글
[21.10.12] snort 룰에 대한 고찰 - 1 (0) | 2021.10.13 |
---|---|
[21.10.9] IDS / IPS에 대한 고찰(실습에 대한 내용 정리) (0) | 2021.10.09 |
[21.10.1] 대역폭 공격 중 Fragmentation Flooding에 대한 고찰 (0) | 2021.10.01 |
[21.9.29] 퓨전 IT 소설 악성코드를 읽고... (0) | 2021.09.29 |
[21.9.27] DDoS 공격 개요 (0) | 2021.09.27 |
댓글
이 글 공유하기
다른 글
-
[21.10.12] snort 룰에 대한 고찰 - 1
[21.10.12] snort 룰에 대한 고찰 - 1
2021.10.13 -
[21.10.9] IDS / IPS에 대한 고찰(실습에 대한 내용 정리)
[21.10.9] IDS / IPS에 대한 고찰(실습에 대한 내용 정리)
2021.10.09 -
[21.10.1] 대역폭 공격 중 Fragmentation Flooding에 대한 고찰
[21.10.1] 대역폭 공격 중 Fragmentation Flooding에 대한 고찰
2021.10.01 -
[21.9.29] 퓨전 IT 소설 악성코드를 읽고...
[21.9.29] 퓨전 IT 소설 악성코드를 읽고...
2021.09.29