Slowloris 개념
Slow Loris공격은 DDoS 공격의 일종으로 'Slow HTTP Header DoS'라는 본명을 가지고 있습니다. HTTP 헤더를 조작해서 늘보처럼 천천히 헤더 정보를 보내고 서버가 연결을 기다리다가 다른 정상적인 요청을 받지 못하도록 자원을 마르게 만드는 공격입니다. HTTP이기 때문에 TCP의 특징인 3-way-handshake의 취약점을 악용하는 공격이기도 합니다. 서버 입장에서는 요청이 오고 있고 느리긴 하지만 값이 보내지기는 하니까 끊기에도 애매한 그런 상황입니다. 식당이나 카페 같은 걸로 예를 들자면 주문대 앞에서 하루종일 뭐를 시키려고 하는지 고민하고 있는 진상 손님을 생각해 보면 좋습니다. 서버 측에서 연결을 끊으려고 해도 계속 keep-alive라는 신호를 보냄으로써 연결을 계속 유지해 달라고 요청합니다. 그렇게 하면 서버 측에서는 '하 그냥 좀 많이 느린 손님인가 보다'하고 어쩔 수 없이 기다려주려고 합니다. 저 같으면 칼같이 '다음 손님!'이라고 할 텐데, 마음이 약하고 따뜻한 서버는 어떻게든 기다려주려고 합니다. 그렇게 보니 징징이도 그렇게 나쁜 친구는 아니네요.
RUDY의 개념
RUDY공격은 DDoS 공격의 일종으로 'RU-Dead-Yet?'의 약자입니다. 'Slow HTTP POST DoS'라는 본명을 가지고 있습니다. POST 방식으로 보내는 값을 비정상적으로 많게 보낸다고 하고, 천천히 조금씩 보내는 공격입니다. 주문하는 상황으로 비유하자면, 먼저 주문을 몇개를 한다고 알려줍니다. HTTP로 말하면 content-length의 값을 알려주는 것이지요. 여기서 주문을 한 천 개 정도 한다고 합시다. 일단 서버 측에서는 아 그렇구나 하고 일단 기다립니다. 그런데, 주문 하나하나를 엄청 천천히 말하는 것이지요. 예를 들면 치즈버거 하나를 주문할 때에도. 5초에 한 글자씩 말하는 겁니다. '치'라고 말하고 5초 뒤 '즈', 또 5초 뒤에 '버'라는 식으로 하나씩 보내면 답답해 죽겠지만 그래도 마음이 착한 서버는 천천히 기다려주는 겁니다. 그렇게 주문하는 사람이 많다면 주문을 받는 사람이 많아도 감당하기 힘들겠죠?
두 공격의 공통점과 차이점
이 둘은 유사한 점이 너무 많아서 헷갈리기 쉽습니다. 우선 공통점을 먼저 보고 차이점을 통해서 구분해보겠습니다.
공통점
두 공격 모두 DDoS의 일종이며, http의 tcp 방식인 3-way-handshake을 악용하여 서버의 자원을 소모시키는 공격입니다. 값을 천천히 보낸다는 특징이 있으며, 약간 모자라지만 정상적인 요청을 하는 특징이 있습니다. 진상인데 진상티를 내지 않는 것이지요. 주변에도 주문 속도가 느린 사람들을 보면 진상이라고 하기에는 조금 애매하지요? 비슷한 경우입니다. 하지만 이게 의도적이고 조금 많이 느리다면 진상이 맞을 겁니다. 이 두 공격도 그렇습니다.
차이점
Slowloris와 RUDY의 차이점은 천천히 보내는 콘텐츠의 대상이 다르다는 것입니다. Slowloris는 헤더를 천천히 보내는 것이고, RUDY는 본문의 값을 천천히 보내는 것입니다. 따라서 이름도 각각 'Slow HTTP Header DoS Attack'과 'Slow HTTP POST DoS Attack'입니다. http에서 헤더 영역이 끝났다는 것을 빈 줄을 보내서 알려주게 되는데, 이 빈줄을 계속 안보내면 헤더가 아직도 안 끝났다고 여기게 됩니다. 이런 것을 이용한 것이 Slowloris입니다. 반면, 헤더가 끝나고 본문을 보내는데 이 본문을 천천히 보내는 것이 RUDY 공격입니다. 헤더 중에도 content-length라는 헤더가 있는데 이 헤더에도 값을 잔뜩 크게 보내기 때문에 서버는 그만큼의 양이 도착해야 된다고 생각할 수밖에 없습니다.
대응법
위 두 가지 DDoS 공격에 대한 기본적인 대응법은 두 가지가 있습니다. 공격 방식이 천천히 데이터를 보낸다는 공통점이 있기 때문에 그에 대한 대응도 매우 유사하다고 볼 수 있습니다.
- 세션 임계치 설정 - mod_qos
- 적절히 짧은 타임아웃 - mod_reqtimeout
집게리아의 예를 들어보겠습니다. 뚱이가 너무 주문을 느리게 하자. 그냥 그냥 치워버리고 다른 손님을 받는 것이 바로 적절히 짧은 타임아웃입니다. 현실에서도 주문이 너무 느린 손님이 있으면 그냥 잠깐 무시하고 다른 손님부터 받는 경우가 있는데 그런 대응이 여기에서의 대응과 같습니다. 컴퓨터 서버에게 어느 정도 느린 요청이 있으면 무시하고 끊어버려라라고 설정하면 되는 것이지요. 또한, 세션 임계치를 설정해서 한 개의 IP에서 여러 개의 요청을 하거나 세션을 유지하려고 하는 경우 안된다라고 말하는 것과 같습니다. 뚱이 가족이 와서 줄을 나눠서 서서 기다리면서 주문을 하려고 한다면 저기 한 줄에서 같이 주문하라고 한 곳으로 치워버리는 것과 같습니다. 이제 느려터진 진상들을 치웠으니 마음 편하게 주문할 수 있겠네요!
'💻Information Security' 카테고리의 다른 글
Panda Web Application 제작 기록(DevLog) (0) | 2024.02.05 |
---|---|
Segfault Web Server VM 설치 및 실행법 (0) | 2024.02.04 |
TCP와 UDP의 개념과 차이점 (0) | 2024.02.01 |
XSS와 CSRF의 차이와 구분 (0) | 2024.02.01 |
Burp Suite 사용법 (0) | 2024.01.30 |