Security/Network

DoS(Denial of Service, 서비스 거부 공격)

bonggang 2019. 9. 24. 02:39

개인의 정보 보안 학습을 위해 작성되었습니다. 본 게시물을 불법적으로 활용하실 경우 혹은 본 게시물로 인해 발생하는 모든 문제에 대한 책임은 당사자에게 있으며, 작성자는 어떠한 법적 책임도 지지 않음을 밝힙니다. 해당 문서를 열람하는 것은 이에 대해 동의하는 것으로 간주합니다.


 

서비스 거부 공격은 서버가 처리할 수 있는 능력 이상의 것을 요구하여, 다른 서비스를 정지 시키거나 시스템을 다운시키는 공격이다. 일반적으로 이 공격의 주 목적은 네트워크 기능을 마비시키는 것이다.

DoS 종류는 크게 취약점 공격형, 자원 고갈 공격형, 분산 서비스 거부(DDoS, Distributed Dos) 공격으로 분류된다.

 

DoS 취약점 공격형


오류가 있는 네트워크 패킷 처리 로직에 문제가 있을 때, 그 문제를 이용하여 공격 대상의 오동작을 유발시키는 형태의 공격이다.

Boink, Bonk, TearDrop 공격

오류 제어 로직을 악용하여 시스템의 자원을 고갈시키는 공격이다. IP 패킷의 전송이 잘게 나누어졌다가 다시 재조합하는 과정의 약점을 이용한 공격으로, 패킷의 순서, 손실된 패킷의 유무, 손실된 패킷의 재전송 요구 등 3가지 사항을 위반함으로써 공격 대상 시스템에 DoS 공격을 가한다.

Bonk는 처음 패킷을 1번으로 보낸 후 두 번째, 세 번째 패킷 모두 시퀀스 넘버를 1번으로 조작하는 방식을 사용.

Boink 공격은 처음 패킷을 정상적으로 보내다가 중간에 계속 일정한 시퀀스 넘버를 사용.

TearDrop은 IP 패킷의 offset 중첩을 이용한 공격으로, 패킷을 겹치게 또는 일정한 간격의 데이터가 손실되도록 전송하여 패킷 재조합 과정에서 오류가 발생하도록 유도하는 방식을 사용.

Land 공격

패킷을 전송할 때 출발지 IP주소와 목적지 IP주소 값을 똑같이 만들어서 공격 대상에게 전송하는 방법입니다. 현재는 대부분의 OS가 이 공격을 기본적으로 막을 수 있도록 보안 기능을 제공하여 거의 쓰이지 않는 공격이다.
(대부분의 운영체제와 방화벽이 송수신측 IP가 동일할 경우 폐기해버림)

 

DoS 자원 고갈 공격형


자원 고갈 공격은 네트워크 대역폭이나 시스템의 CPU, 세션 등의 자원을 소모시키는 형태의 공격이다.

Ping of Death 공격

초기 DoS 공격으로 가장 흔히 사용되어 온 공격으로 ICMP 패킷의 재조합을 이용한 공격이다.

네트워크의 연결상태를 점검하기 위한 ping 공격을 보낼 때, 패킷을 최대한 길게(65,500바이트) 보내면 패킷은 네트워크의 특성에 따라 수백, 수천 개의 패킷으로 잘게 분할된다. 결과적으로 공격 대상 시스템은 대량의 작은 패킷을 수신하게 되고, 네트워크가 마비되는 원리다. 즉, 수신측의 재조합 과정에서 부하가 발생하거나 BOF(Buffer OverFlow)를 발생시켜 서비스 이용을 막는 공격이다.

SYN Flooding 공격

네트워크에서 서비스를 제공하는 시스템에는 동시 사용자 수의 제한이 있다. SYN Flooding 공격은 존재하지 않는 클라이언트가 서버에 접속한 것처럼 속여 다른 사용자가 서비의 서비스를 제공받지 못하게 하는 것이다.

클라이언트가 서버에 연결하기 위해 SYN 패킷을 보내면 서버는 SYN receive 상태가 되고 클라이언트로 SYN/ACK를 보낸다. 이 때, 클라이언트는 ACK 패킷을 서버로 보내지 않고 SYN 패킷만을 계속 전송하면 SYN receive 상태가 지속되며 과부화가 발생한다.

 

- TCP 3-Way Handshaking

기본적으로 TCP/IP는 3-Way Handshaking을 통해 송수신하기 위한 연결을 설정한다.

처음에 호스트 A가 서버 B에 연결하기 위해 SYN 패킷을 보내면 호스트 서버 B는 SYN을 받았다는 뜻으로 SYN/ACK 패킷을 전송한다. SYN/ACK 패킷을 받은 호스트 A는 이에 응답하는 즉, ACK 패킷을 전송하고 마지막으로 ACK 패킷을 호스트서버 B가 받으면 TCP 접속이 이루어지게 된다. 따라서 호스트 B서버가 SYN 패킷을 받으면 여기에 대한 자원을 할당하고 SYN/ACK를 보내 ACK를 기다리는데 만약 ACK 패킷이 오지 않으면 일정 시간 간격으로 SYN/ACK 패킷을 다시 보내게 된다.

SYN/ACK를 재전송 하는 시간을 운영체제마다 다르며 윈도우 NT/2000은 일반적으로 5번의 SYN/ACK 패킷을 서버에서 클라이언트로 보내는데 각각 3, 6, 12, 24, 48초에 보낸다. 그리고 마지막 재전송 이후에 ACK 패킷을 기다리는걸 포기하기까지 96초의 시간을 더 기다린다. 결국 총 189초 동안 윈도우 서버는 하나의 SYN 패킷에 자원을 할당해 두는 상황이 발생한다.

공격자는 이것을 악용해 SYN Flooding 공격을 한다. 공격자가 데이터의 송신지 IP주소를 존재하지 않는 IP주소나 다른 시스템의 IP주소로 위장해 목적지 시스템으로 SYN 패킷을 연속해서 전송할 경우 윈도우 시스템은 많은 SYN을 동시에 처리하게 됨으로 정상적인 다른 사용자의 연결에 응답할 수 없게 된다.(SYN Flooding 공격)

 

- Syn Flooding 공격 탐지

netstat 명령어(시스템의 네트워크 정보를 알려주는 명령어)

netstat -na 명령어를 사용하면 Local Address, Foreign Address, State 등의 정보를 확인가능한데 이 중 State 부분에 보이는 메시지를 확인해야 한다. 각각의 연결 상태는 통신 상황에 따라 매우 복잡하게 순간적으로 변화하는데, 이 중 SYN_RECEIVED 상태가 클라이언트의 확인 메시지를 기다리는 상태다. 하지만 이 메세지는 순간적으로 표시되기 떄문에 실제 netstat로 확인되는 경우는 거의 없다.

따라서 netstat -na|grep SYN_RECV로 확인해 많은 메시지가 보인다면 SYN Flooding 공격을 당하고 있는 것으로 판단하면 된다.

snort를 이용한 IDS(Intrusion Detection System) 구축

윈도우용 IDS(침입 탐지 시스템)인 Snort를 활용하여 공격을 탐지하는 방법이다. IDS는 각종 해킹수법을 이미 자체적으로 내장하고 있어 침입행동을 실시간으로 감지, 제어할 수 있는 기능을 제공한다.

 

- SYN Flooding 공격 대응

- Backlog Queue 사이즈 증가: 통신간의 연결 설정이 저장된 메모리 공간을 적절히 늘려준다.

- Syncookies 기능 설정: Syncookie 기능이 설정된 서버로 SYN 패킷이 들어온 경우, SYN 패킷의 일련번호에 1을 더하는게 아니라 출발지에 대한 정보와 암호를 만들어 해쉬함수를 이용해 쿠키를 생성해 SYN/ACK 패킷을 전송한다. 이 때 돌아온 ACK 패킷의 정보를 바탕으로 한 계산 결과가 맞다면 쿠키는 유용하나 그렇지 않다면 위조된 패킷으로 간주하여 즉각 폐기시킨다. 이 기능은 백로그 큐가 가득 찼거나, SYN Flooding 공격이 발생 시에만 반응하며, sysctl을 이용한 커널 설정을 통해 변경할 수 있다.

- 시스템 튜닝: 리눅스와 유닉스는 sysctl을, 윈도우는 레지스트리 값 수정을 이용한다.

- TCP Intercept: 라우터나 방화벽 등의 장비에서 적용하는 방법으로 2가지 모드(Intercept Mode, Watch Mode)로 나누어진다. 하지만 라우터를 통과하는 전 패킷의 상태를 체크해야 하므로 실제로 적용시키기에는 무리가 있다.

- 라우터의 egress 필터링: 나가는 패킷의 주소가 해당 대역의 IP주소인지 확인한다.

Smurf 공격

ICMP reply 패킷을 이용한 공격으로 광범위한 효과로 인하여 가장 무서운 DoS 방법 중 하나다. 송신 측의 IP를 공격할 대상의 IP로 설정한 후 수신 측의 IP를 공격대상의 네트워크와 연결된 IP들로 설정하여 패킷을 보내면 이 많은 IP들은 응답 패킷을 공격대상으로 보내게 되고 다수의 응답 패킷 수신으로 인해 과부화를 일으키는 방법이다.

 

분산 서비스 거부(DDoS) 공격


분산 서비스 거부 공격은 공격자가 한 지점에서 서비스 거부 공격을 수행하는 형태를 넘어 광범위한 네트워크를 이용하여 다수의 공격 지점에서 동시에 한 곳을 공격하도록 하는 형태의 서비스 거부 공격이다.