SYN_Flooding공격이란 TCP세션이 연결될 때의 취약성을 이용한 공격
정상적인 상태
먼저 TCP의 기본적인 연결단계는 아래와 같습니다.
- A(소스서버)가 B(목적지서버)에게 접속을 요청하는 SYN패킷을 보낸다.
- B는 요청을 수락한다는 SYN과 ACK패킷을 A에게 보낸다.
- A가 B에게 ACK를 보내면 연결이 이루어지고 본격적이 데이터교환이 이루어진다.
SYN Flooding 공격을 받고있는 모습
위의 2번단계에서 목적지서버(B)는 소스서버(A)가 ACK패킷을 보내주기를 계속적으로 기다리는 것이 아니라일정시간 후 요청이 오지 않으면
백로그큐(Backlog Queue)가 허용하는 공간에 연결정보(로그)를 보관하게 됩니다.
이러한 상태가 지속적으로 요청되어 연결정보(로그)가 쌓이게 되면 목적지서버(B)의 특정서비스가 마비될 수 있습니다.
이러한 공격을 DOS공격의 일종인 SYN Flooding 공격이라고 합니다.
Syn 로그 기록후 Timeout 까지의 대기시키는데 그 타임아웃 시점보다 짧게 Syn 요청을 해서 스택을 채워네트웍을 마비시키기도 하고 Invalid 한 값의 Syn으로 무차별적으로 이루어 지기도 한다.
SYN Flooding 공격탐지
- SYN_RECV 가 있으면 공격에 노출되었다고 보면 된다.
# netstat -an | grep SYN
tcp 0 0 192.168.0.0:80 94.9.83.63:3072 SYN_RECV
tcp 0 0 192.168.0.0:80 3.7.244.2:3072 SYN_RECV
tcp 0 0 192.168.0.0:80 48.32.206.32:3072 SYN_RECV
# netstat -an |grep SYN | wc -l
146
정상적인 경우라면 거의 0이어야 함
- SYN Cookies가 작동할 때 SYN Flooding공격이 있으면 messages 파일에 아래와 같은 내용이 출력된다.
#Possible SYN flooding on port 80. Sending cookies.
SYN Flooding 공격막기
이러한 SYN Flooding 공격을 차단하기 위해서는 백로그큐의 사이즈를 늘려주는 방법과 tcp_syncookies값을 1로 설정하는 방법이 있습니다.
- SYN backlog사이즈 증가
tcp_max_syn_backlog 파일을 통해 현재 서버의 백로그큐 값을 확인
# cat /proc/sys/net/ipv4/tcp_max_syn_backlog
1024
1024 보다 작으면 아래 명령어로 1024 이상으로 설정해줍니다.
sysctl -w net.ipv4.tcp_max_syn_backlog=1024
- SYN Cookie설정
위와 같이 백로그큐의 값을 늘려주더라도 이 방법은 임시적인 방법일 뿐, 지속적인 공격을 당하게 된다면 결국 로그값이 가득차게 되겠죠.
그렇기 때문에 백로그큐의 값을 늘려주는 것과 함께 신쿠키 기능도 설정해줘야 합니다.
cat /proc/sys/net/ipv4/tcp_syncookies 명령어로 현재 서버의 SYN 쿠키값을 확인해서 0으로 되어 있다면
sysctl -w net.ipv4.tcp_syncookies=1 ← 이렇게 값을 1로 바꿔줍니다.
# cat /proc/sys/net/ipv4/tcp_syncookies
1
# sysctl \-w net.ipv4.tcp_syncookies=1
net.ipv4.tcp_syncookies = 1
신쿠키는 백로그큐가 가득 찼을 경우에도 정상적인 접속요구를 계속 받아들일수 있도록 해주므로 신플루딩 공격에 대비한 가장 효과적인 방법중 하나입니다.
- IP TABLES
- IP직접막기
~$ iptables -A INPUT -s <Source IP> -j DROP
- Rule추가
~$ iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
~$ iptables -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
~$ iptables -A INPUT -p tcp --tcp-flags FIN,RST FIN,RST -j DROP
~$ iptables -A INPUT -p tcp --tcp-flags ACK,FIN FIN -j DROP
~$ service iptables save
~$ service iptables restart
- sysctl.conf에 rule추가
~$ vi /etc/sysctl.conf
# Enable TCP SYN cookie protection
net.ipv4.tcp_syncookies = 1
# Decrease the time default value for tcp_fin_timeout connection
- net.ipv4.tcp_fin_timeout = 30
# Turn off the tcp_window_scaling
net.ipv4.tcp_window_scaling = 0
# Turn off the tcp_sack
net.ipv4.tcp_sack = 0
# /sbin/sysctl -p
- iptables 조회
# iptables -L
참고 : http://hack3r.tistory.com/2207
'Gift > Security' 카테고리의 다른 글
[정보보안기사] 암호학(4) (0) | 2017.08.08 |
---|---|
[정보보안기사] 암호학(3) (0) | 2017.08.06 |
[정보보안기사] 암호학(2) (0) | 2017.08.05 |
[정보보안기사] 암호학(1) (0) | 2017.08.04 |
[정보보안기사] 정보보호관리 요약 (0) | 2017.08.03 |