민오리

[네트워크 실습] Syn Flooding 공격&대응 과정 본문

전공수업/Network

[네트워크 실습] Syn Flooding 공격&대응 과정

secu_jeong 2019. 12. 14. 22:21

1. TCP 프로토콜이란? 

 

TCP 프로토콜 과정은 3단계로 이루어진다. CLIENTSERVER에 접속을 요청하는 SYN패킷을 보낸다. 이때 CLIENTSYN을 보내고 SYN/ACK 응답을 기다리는 SYN_SENT상태가 된다.

SERVERSYN 요청을 받고 CLIENT 에게 요청을 수락한다는 ACKSYN FLAG가 설정된 패킷을 발송하고 CLIENT가 다시 ACK으로 응답하기를 기다리는 SYN_RECEIVED 상태가 된다. 이때 SERVERCLIENT의 접속을 받아들이기 위해 메모리에 일정공간을 확보해 둔다.

CLIENTSERVERACK을 보내고 그 이후부터는 연결이 이루어져 데이터가 오가게 되는 것이다. 이때 SERVER의 상태가 ESTABLISHED이다.

이 방식이 TCP의 연결방식인 3WAY HAND SHAKE이다.

 

2. SYN FLOODING 과정 

 

이때 CLIENTSYN 패킷 만을 계속적으로 보내고 ACK을 보내지 않게 되면 SERVER CLIENT의 연결을 받아들이기 위해 메모리 공간을 점점 더 많이 확보해둔 상태에서 대기하게 된다.

SYN+ACK 패킷을 받은 SERVERCLIENT 로부터 응답이 올 것을 기대하고 반쯤 열린 이른바 “Half Open” 상태가 되어 대기 상태에 머무른 후 일정 시간 후에 다음 요청이 오지 않으면 해당 연결을 초기화 하게 되는데, 초기화하기 전까지 이 연결은 메모리 공간인 백 로그 큐(Backlog Queue)에 계속 쌓이게 된다. 또한 공격자는 매 패킷마다 IP를 랜덤으로 바꿔 공격해 SERVER는 위조된 CLIENT주소로 SYN+ACK을 보내기 때문에 SERVERACK을 받을 수 없게 된다. 공격이 위조된 연결 시도를 초기화하기 전에 위조된 새로운 요구가 계속 들어오게 되거나 위조된 새로운 요구가 연결을 초기화하는 속도보다 더 빨리 이루어진다면 SYN 패킷이 어느 정도 백 로그 큐에 저장이 되다가 결국 꽉 차게 되어 더 이상의 연결을 받아들일 수 없는 상태, 즉 서비스 거부 상태가 된다. 이처럼 백 로그 큐가 가득 찼을 경우에 공격을 당한 해당 포트로만 접속이 이루어지지 않을 뿐 다른 포트에는 영향을 주지 않고, 또한 서버에 별다른 부하도 유발하지 않고, 다른 DoS 공격과는 달리 많은 트래픽을 유발하는 공격이 아니기 때문에 쉽게 파악이 되지 않는 공격 형태이다.


3. 공격 과정 

1) 피해자: Debian (192.168.75.129)

   공격자: Kali2 (192.168.75.128)

2) 피해자의 서버에서 Index.html 수정하고 apache서버 시작

 

사진 1

 

apache 서버 실행 후 index.html의 모습

 

3) 공격자 kali2에서 피해자 Debian 한테 hping3 공격

 

공격자 가상머신에서 hping3 공격한 모습

hping3 --rand-source (공격대상 ip) -p 80 -S --flood

 

Hping3 옵션

옵션 내용

--rand-source

공격자의 IP주소를 랜덤하게 생성

192.168.75.129

공격 대상의 IP주소

-p 80

80번 포트에 대해 패킷 전송

-S

TCP 패킷 중 SYN만 전송

-flood

시스템이 생성 가능한 만큼 빠른 속도로 패킷 보낸다

 

wireshark에서 캡쳐된 ip.dst==192.168.75.129  인  SYN 패킷 
wireshark 에서 캡쳐된 IO 그래프
피해자 Debian 192.168.75.129에서 캡쳐된 SYN 패킷

netstat -an | grep SYN


4) 보안 기법 적용

백 로그 큐 사이즈 늘리기

백 로그 큐

sysctl -w net.ipv4.tcp_max_syn_backlog=1024

 

서비스 거부 상태가 되는 것은 백 로그 큐가 가득 차서 다른 접속 요구를 받아들이지 못하기 때문에 백 로그 큐의 크기를 늘려주면 된다. 현재 시스템에 설정된 백 로그 큐의 크기는 필요 이상으로 작게 설정되어 있기 때문에 백 로그 큐 사이즈를 늘려 제한된 용량을 늘려준다. 그러나 이 방법은 임시적인 방법일 뿐, 지속적인 공격을 당하여 로그 값이 다 차게 되기 때문에 근본적인 해결 방법은 아니다.

그렇기 때문에 백 로그 큐의 값을 늘려주는 것과 함께 syn cookies 기능도 설정해줘야 한다.

 

② syncookies 설정

syn cookies는 백 로그 큐가 가득 찼을 경우에도 정상적인 접속 요구를 계속 받아들일 수 있도록 해주기 때문에 가용성을 최대한 확보할 수 있으므로 SYN_FLOODING 공격에 대비한 가장 효과적인 방법 중 하나이다.

syncookies 설정

sysctl -w net.ipv4.tcp_syncookies=1

 

③ iptables을 이용한 차단

iptable이란 리눅스 상에서 방화벽을 설정하는 도구로서 특정 조건을 가지고 있는 패킷에 대해 허용(ACCEPT)과 차단(DROP)등을 지정할 수 있다.

iptable
설정값

iptables -A INPUT -s 192.168.35.1 -d 192.168.75.129 -j ACCEPT: 출발지 ip 192.168.35.1(라우터 ip)에서 도착지 192.168.75.129로 들어오는 패킷은 허용한다.

iptables -A INPUT -s 192.168.75.1 -d 192.168.75.129 -j ACCEPT: 출발지 ip 192.168.75.1(라우터 ip)에서 도착지 192.168.75.129로 들어오는 패킷은 허용한다.

iptables -A INPUT -s 192.168.35.247 -d 192.168.75.129 -j ACCEPT: 출발지 ip 192.168.35.247      (컴퓨터 ip)에서 도착지 192.168.75.129로 들어오는 패킷은 허용한다.

iptables -A INPUT -s 0.0.0.0/0 -d 192.168.75.129 -j DROP: 모든 ip에서 도착지 192.168.75.129로 들어오는 모든 패킷을 차단한다.

Iptables 옵션

옵션 내용

-A

새로운 정책을 추가한다

-s

패킷 송신지

-d

패킷 수신지

-j

규칙에 맞는 패킷을 어떻게 처리할 것인가를 명시한다.

ACCEPT

허용한다

DROP

차단한다.

Iptables -nL

현재 설정된 iptable의 목록을 보여준다.

Iptables-save

현재 변경한 iptable의 내역을 저장한다.

 

위 명령어 적용 결과: 통신을 위해 라우터에서 전송하는 패킷은 허용한다. 또한 테스트를 위해 공격자 kali2뿐만 아니라 모든 ip를 차단하고 가상머신이 아닌 컴퓨터의 ip만을 허용한다.

 

kali2 에서 192.168.75.129로 패킷 전송이 차단된 화면

 

컴퓨터에서  192.168.75.129 로 패킷 전송이 완료된 화면

④ netstat -an | grep SYN_RECV 실시간 모니터링

공격이 이루어지고 있는 상황은 netstat -an을 통해 확인 가능하다. 연결 요청중인 목록 중 SYN_RECV 로 되어있는 요청이 많을 경우 Syn Flooding 공격 상황을 의심해 볼 있다. SYN_RECV로 된 요청이 많고, 해당 요청 IP가 비정상적인 경우 Syn Flooding 공격일 가능성이 아주 높다.

 

'전공수업 > Network' 카테고리의 다른 글

[네트워크 실습] SQL Injection 공격 실습  (0) 2020.06.26
Comments