SYN Flooding 공격이란?
신플루딩공격이란 TCP세션이 연결될 때의 취약성을 이용한 서버공격이다.
먼저 TCP의 기본적인 연결단계는 아래와 같습니다.
- A(소스서버)가 B(목적지서버)에게 접속을 요청하는 SYN패킷을 보낸다.
- B는 요청을 수락한다는 SYN과 ACK패킷을 A에게 보낸다.
- A가 B에게 ACK를 보내면 연결이 이루어지고 본격적이 데이터교환이 이루어진다.
위의 2번단계에서 목적지서버(B)는 소스서버(A)가 ACK패킷을 보내주기를 계속적으로 기다리는 것이 아니라
일정시간 후 요청이 오지 않으면 백로그큐(Backlog Queue)가 허용하는 공간에 연결정보(로그)를 보관하게 됩니다.
이러한 상태가 지속적으로 요청되어 연결정보(로그)가 쌓이게 되면 목적지서버(B)의 특정서비스가 마비될 수 있습니다. 이러한 공격을 DOS공격의 일종인 SYN Flooding 공격이라고 합니다.
Syn 로그 기록후 Timeout 까지의 대기시키는데 그 타임아웃 시점보다 짧게 Syn 요청을 해서 스택을 채워네트웍을 마비시키기도 하고 Invalid 한 값의 Syn으로 무차별적으로 이루어 지기도 한다.
SYN Flooding 공격탐지
- SYN_RECV 가 있으면 공격에 노출되었다고 보면 된다.
~$ netstat -na | grep SYN tcp 0 0 61.250.171.252:28004 94.9.83.63:3072 SYN_RECV tcp 0 0 61.250.171.252:28004 3.7.244.2:3072 SYN_RECV tcp 0 0 61.250.171.252:28004 48.32.206.32:3072 SYN_RECV ~$ netstat -na |grep SYN | wc -l 146 정상적인 경우라면 거의 0이어야 함
- SYN Cookies가 작동할 때 SYN Flooding공격이 있으면 messages 파일에 아래와 같은 내용이 출력된다.
#Possible SYN flooding on port 80. Sending cookies.
SYN Flooding 공격막기
이러한 신플루딩 공격을 차단하기 위해서는 백로그큐의 사이즈를 늘려주는 방법과 tcp_syncookies값을 1로 설정하는 방법이 있습니다.
- SYN backlog사이즈 증가
cat /proc/sys/net/ipv4/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 로 현재 서버의 신쿠키 값을 확인해서 0으로 되어 있다면
sysctl -w net.ipv4.tcp_syncookies=1 ← 요렇게 값을 1로 바꿔줍니다.~$ cat /proc/sys/net/ipv4/tcp_syncookies 1 ~$ sysctl \-w net.ipv4.tcp_syncookies=1 error: permission denied on key 'net.ipv4.tcp_syncookies' ~$ sudo 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
- IP직접막기
- 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 Then execute the command :- # /sbin/sysctl -p
- iptables 조회 (block추가나 해재후에 확인 절차. 아래는 default iptables 조회시의 output)
~$ iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
공격툴
http://packetstormsecurity.nl/DoS/
0 comments | Add Comment
'Hacking' 카테고리의 다른 글
Conducting an Insider Attack (0) | 2011.09.08 |
---|---|
"Apache Killer" a DDoS using the Range HTTP Header (0) | 2011.09.07 |
DDOS 대비 방법 (1) | 2011.08.31 |
Penetration Testing for Web Applications (Part Three) (1) | 2011.08.31 |
Penetration Testing for Web Applications (Part Two) (0) | 2011.08.31 |