2023. 9. 18. 17:05

DOS / DDOS ? & 공격유형

 

 

 

 

DoS 공격은 웹사이트 또는 웹 서비스가 단일 사용자의 자동화된 요청으로 넘쳐나 서비스가 중단되고 합법적인 방문자의 입장이 방해 받는 공격입니다. .

 

이 공격은 매우 많은 거짓 요청으로 네트워크를 압도하여 일시적으로 사용할 수 없게 만듭니다.
DDoS(디도스) 또는 분산 서비스 거부 공격은 여러 사용자 및/또는 봇넷을 활용하는 대규모 DoS 공격입니다.

 

 

--------------------------------------------------------------------------------------------------------------------------------------------------

 

그럼 여기서 DOS/DDOS 의 빈번한하고, 이해하기 쉬운 SYN Flooding 공격에 대해서 서술하겠습니다.

 

① Client는 SYN 패킷(sequence number 포함)을 생성해서, Server에게 전달합니다. 

    일종의, "포트 열려있나요?" 라고 문을 두드리는 과정이라고 보면 됩니다.

 

② Server는 SYN 패킷(sequence number 포함)과 받은 SYN의 대답 격인 ACK 패킷(acknowledgement number 포함)을 Client에게 전달합니다. 그리고 Server는 Client의 접속을 받아들이기 위해, RAM(메모리)에 일정 공간을 확보해둡니다.

일종의, "네, 열려있습니다." 라고 대답하는 과정이라고 보면 되며, acknowledgement number의 값은, 방금 받은 SYN 패킷의 sequence number 값에 일정 값을 증가시켜서 보냅니다.

 

③ 그리고 다시 Client는 방금 받은 SYN의 대답 격인 ACK 패킷(acknowledgement number 포함)을 Server에게 전달합니다. 일종의, "그럼 들어가겠습니다~" 라고 대답하는 과정이라고 보시면 됩니다. 여기서도 마찬가지로 acknowledgement number의 값은, 방금 받은 SYN 패킷의 sequence number 값에 일정 값을 증가시켜서 보냅니다.

 

이렇게 Client는 Server에 Established 상태로 연결이 됩니다.

위 세 차례의 패킷을 주고 받는 과정은 일련의 협상을 타결하여 악수하는 모습과 같아서, 3-way-handshake(악수) 라는 이름을 사용하고 있습니다.

 

*참고 : 연결을 끊을 때에는 4-way-handshake 라는 방식으로 끊습니다.

 

 

 

# SYN Flooding 공격은 무엇인가?

SYN Flooding은, 위 3-way-handshake의 ②번 과정에서 언급했던 내용에 집중하셔야 합니다.

"② Server는 SYN 패킷과 ACK 패킷을 Client에게 전달합니다. 그리고 Server는 Client의 접속을 받아들이기 위해, RAM(메모리)에 일정 공간을 확보해둡니다."

 

 

Client가 ①SYN 패킷만을 계속적으로 보내고 ③ACK 패킷을 안보내게 되면, Server는 Client의 연결을 받아들이기 위해 RAM(메모리) 공간을 점점 더 많이 확보해둔 상태에서 대기합니다.

그리고 Server의 RAM이 꽉 차게 되면 더이상 연결을 받아들일 수 없게되고, Server는 서비스를 서비스를 계속할 수가 없게 되죠.

 

SYN Flooding을 방어하는 방법은?

3-1. SYN Cookie

방화벽 단에서 SYN을 먼저 받고, SYN Cookie를 포함한 SYN+ACK를 보내는 방법이 있습니다. 일정 시간동안 SYN Cookie에 대한 정상적인 응답패킷이 들어오지 않으면 방화벽에서 차단해버리고, 정상적인 패킷이 들어오면 통신이 가능하게끔 해주는 방식이죠.

 

 

 

정상적인 패킷이 들어왔을 경우에는 아래와 같은 순서로 진행됩니다.

 

*용어 설명

 : SYN_C1 - SYN패킷/Client에서 생성됨/1번째 3-way-handshake

 : SYN_F1 - SYN패킷/Firewall에서 생성됨/1번째 3-way-handshake

 : ACK_F1 - ACK패킷/Firewall에서 생성됨/1번째 3-way-handshake

...

 

C는 Client에서 생성, F는 Firewall에서 생성, S는 Server에서 생성, 숫자는 몇번째 3-way-handshake 인지를 나타냅니다.

1) SYN이 들어오면, syn_cookie가 포함된 SYN+ACK을 보냅니다. 

2) 그리고 syn_cookie에 적절히 대응하는 정상적인 ACK 패킷이 들어오면, 세션을 새로 엽니다.

 

즉, 처음 방화벽과 3-way-handshake가 이루어진 것은 없는 셈 치고, 방화벽은 새로운 3-way-handshake 패킷을 서버에 연결시켜주는 것이죠.

따라서 Client는 첫 접속에 실패하는 것 처럼 보일 수도 있습니다. (Client의 재접속 요청은 순식간에 이루어지기 때문에, 사용자로서 체감상으로 느낄 수는 없을 것입니다)

 

 

3-1. SYN PROXY

방화벽 단에서 정상적인 3-way-handshake과정이 이루어지면, 그 연결을 다시 서버에게 재현시켜주는 방식입니다.입니다.

3-way-handshake 연결이 이루어지지 않은 경우에는 방화벽에서 쳐냅니다.(차단합니다)

SYN PROXY도 역시, syn_cookie를 이용해서 정상적인 3-way-handshake인지를 확인합니다.

syn_proxy는 세션을 새로 열 필요가 없습니다. client와 firewall 사이에 맺은 3-way-handshake를 firewall이 server에게 다시 재현해주기 때문에, 세션을 새로 맺을 필요가 없습니다.

Proxy Server를 중간에 하나 둔다고 생각하시면 편하지 않을까 합니다.

 

 

 

참조 원본 링크 : https://sata.kr/entry/DOSDDOS-SYN-Flooding-%EA%B3%B5%EA%B2%A9%EC%97%90-%EB%8C%80%ED%95%B4%EC%84%9C-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90