네트워크/네트워크

구루 2012. 5. 25. 11:41

 

TCP Syn Flooding 공격 원리

 

TCP Syn Flooding 공격은 Dos(서비스 거부 공격)의 일종입니다.

 

TCP Syn Flooding 공격은 TCP의 취약점을 이용한 공격의 형태입니다. TCP는 '3 Way handshaking'이라는 정해진 규칙으로 통신을 수행합니다. Syn Flooding은 '3 Way handshaking' 흐름을 이용한 공격 방법입니다.

 

악의적인 공격자는 서버에 접속을 요청하는 SYN 만 수행하고 서버로 부터 응답을 받은 후 SYN + ACK 응답을 보내지 않습니다. 이렇게 되면 서버는 응답이 올 것을 기대하고 반쯤 연린 이른바 'Half open' 상태가 되어 대기 상태레 머무른 후 일정 기간(75초) 후에 다음 요청이 오지 않으면 해당 연결을 초기화하기 전까지 이 연결을 메모리 공간인 백로그큐(Backlog Queue)에 계속 쌓이게 됩니다.

 

그런데, 이 위조된 연결 시도를 초기화하기 전에 위조된 새로운 요구가 계속 들어오게 된다면 또한 위조된 새로운 요구가 연결을 초기화하는 속도보다 더 빨리 이루어진다면 서버의 백로그큐가 꽉 차게 되어 더 이상 서버의 연결을 받아들일 수 없는 상태가 됩니다. 즉, 서비스 거부 상태로 들어가게 됩니다.

 

이처럼 백로그큐가 가득 찼을 경우 공격을 당한 해당 포트로만 접속이 이루어지지 않을 뿐 다른 포트에는 영향을 주지 않고, 또한 서버에 별다른 부하도 유발하지 않으므로 관리자가 모르는 경우가 많습니다. 또한 다른 Dos 공격과는 달리 많은 트래피을 유발하는 공격이 아니므로 쉽게 파악이 되지 않는 공격 형태입니다.

 

 

 

공격 탐지 방법

 

netstat 명령어를 사용하여 공격을 탐지합니다. netstat 명령어는 시스템의 각종 네트워크 정보를 알려주는 명령어로 네트워크 연결, 라우팅 현황, 인터페이스 통계 등의 정보를 확인할 수 있게 해줍니다.

 

리눅스의 경우에는

 

> netstat -na | grep SYN

 

Active Connections
Proto  Local Address    Foreign Address        State
TCP   192.168.0.1:1111   222.222.222.222:2222   SYN_RECV
TCP   192.168.0.1:1112   222.222.224.222:2223   SYN_RECV

 

명령어를 사용하여 출력 결과를 확인합니다. 이 때 출력 메시지가 많이 보인다면 SYN Flooding 공격을 당하고 있는 것으로 판단하면 됩니다.

 

윈도우의 경우에는 grep 명령어가 존재하지 않습니다. 이 때 대체할 수 있는 명령어가 find 명령어입니다. find 명령어는 파이프 라인을 사용해 특정 문자열을 솎아내는 유용한 명령어입니다.

 

> netstat -na | find "SYN"

 

처럼 사용하여 결과를 확인할 수 있습니다.


 

 

공격 대처 방법

 

1. 백로그 큐를 늘려준다.

 

서비스 거부에 돌입하게 되는 것은 백로그큐가 가득차서 다른 접속 요구를 받아들이지 못하기 때문이므로 백로그큐의 크기를 늘려주는 것이다. 그러나 이 방법은 임시적인 대책일 뿐, 지속적으로 많은 TCP SYN Flooding 공격을 당할 때는 결국 백로그큐가 가득 차게 되므로 근본적인 해결 방안은 아니다.

 

2. Syncookies 기능을 켠다.

 

Syncookies는 '3-way handshake' 진행과정을 다소 변경하는 것으로 TCP 헤더의 특정 부분을 뽑아내어 암호화 알고리즘을 이용하는 방식으로 '3-Way handshake' 가 성공적으로 이루어지지 않으면 더 이상 소스 경로를 거슬러 올라가지 않는다. 따라서 적절한 연결 요청에 대해서만 연결을 맺기 위해 리소스를 소비하게 되는 것이다.

 

3. 기타 시스템의 네트워크 설정을 최적화한다.

 

 

 

보충설명

 

실제 공격지 IP를 추적하는 것은 거의 불가능합니다.

 

대부분의 Dos 공격이 그러하듯이 SYN Flooding 공격도 소스 IP를 위장해 들어오기 때문에 netstat으로 보이는 IP를 실제 공격지 IP라고 판단해서 해당 IP로 역공격을 해서는 안 됩니다. 공격을 당하는 서버에서 공격지를 아는 방법은 없으며 상위 라우터와 해당 라우터가 연결되어 있는 ISP 업체와 긴밀하게 협조가 되었을 때만 그나마 추적이 가능합니다. 그러나 사실상 협조가 이루어져도 추적하기란 매우 어려운데, 만약 라우팅 경로가 20개 이상 되는 곳에서 공격한다면 20개 라우터를 관리하는 모든 관리자와 동시에 협조가 이루어져야 하고 공격이 실제 이루어지고 있는 당시에 추적이 되어야 하므로 매우 어렵다고 할 수 있습니다.

 

라우터나 방화벽에서 차단 가능하다.

 

라우터 등 네트워크 장비로 유명한 시스코 시스템즈에서는 TCP SYN Flooding 공격을 차단하기 위해 TCP 인터셉트라는 솔루션을 제안했습니다.

 

TCP 인터셉트는 두가지 방식으로 구현 가능한 데, 첫 번째 방식은 '인터셉트 모드'라 하여 말 그대로 라우터로 들어오는 SYN 패킷 요청을 그대로 서버에 넘겨주지 않고 라우터에서 일단 가로채어 서버를 대신하여 SYN 패킷을 요청한 클라이언트와 연결을 맺고, 연결이 정상적으로 이루어지면 이번에는 클라이언트를 대신하여 서버와 연결을 맺은 다음 두 연결을 투명하게 포워딩하여 연결시켜주는 방식입니다. 따라서 존재하지 않는 IP로부터 오는 SYN 요청은 서버에 도달하지 못하게 되는 것입니다.

 

두 번째는 와치(Watch) 모드라고 하여 인터셉트 모드와 달리 라우터를 통과하는 SYN 패킷을 그대로 통과시키고 일정 시간동안 연결이 이루어지지 않으면 라우터가 중간에서 SYN 패킷을 차단하는 방식입니다.

 

 

 

와 정말 블로깅 잘하시네요^^
감사합니다. ^^