우클릭방지

글 목록

2020년 10월 21일 수요일

[HTTP DDoS] Slowloris 공격

이번 포스팅에서 Slowloris 라는 DDoS 공격 방법에 대해 정리한다. 

# HTTP 요청헤더의 시작과 끝

웹서버는 클라이언트의 요청을 받으면 요청 내용을 처리한 후 되돌려 준다. 

그렇다면 웹서버는 클라이언트의 요청의 전체를 어떻게 구분할까? 
다시말하면 요청 내용의 시작과 끝을 어떻게 구분할까? 

HTTP 요청/응답을 자세히 들여다 보면 다음과 같이 구성되어 있다.

위 붉은색 표시가 요청이고, 아래 파란색 부분이 응답에 해당한다. 

Slowloris 는 위와 같이 HTTP 요청 방식 중 "GET" 을 이용한 공격이다. 


GET 방식은 요청 내용 (Method, URL, Version) 과 다수의 요청 헤더로 이루어진다. 

요청 헤더는 "헤더 명 : 헤더 값(value)" 형태로 이루어 지는데.. 위 Host, Connection 등이 이에 해당된다. 
요청 헤더의 각각의 구분은 줄바꿈 (CRLF) 로 하고 있다. 
즉, 예를 들면 Host, Connection 은 각각의 헤더 정보이며 이를 구분하기 위해 새로운 줄에 위치하고 있음을 알수 있다. 
(Host와 Connection 은 한줄에 같이 존재할 수 없음)

그럼 각 요청마다 헤더의 내용들이 모두 상이할텐데..  서버는 요청 헤더가 모두 전달되었는지 어떻게 알 수 있을까? 
다시 말해서 위 내용을 예로 들면.. 클라이언트가 전달한 요청 헤더가 Host 부터 Accept-Language 까지가 전부인데.. 과연 Accept-Language가 마지막 요청 헤더인지 어떻게 알수 있을까?

답은 "줄바꿈(CRLF) 2번" 이다. 
줄바꿈 2번이 전달되면 웹서버는 요청 헤더가 모두 전달되었다고 인식한다. 

Wireshark 에서 해당 내용을 살펴보자. 


헤더간 구분은 위와 같이 줄바꿈으로 하는걸 볼수 있다. 
Host 헤더(왼쪽)의 끝부분과 Cache-Control 헤더(오른쪽) 의 끝부분을 보면 줄바꿈(CRLF)을 의미하는 Hex 값인 "0d0a" 가 있다. 

헤더의 마지막 부분을 보자. 


요청 헤더의 마지막 부분에 줄바꿈(CRLF)을 의미하는 "0d0a" 가 2번 반복되는 것을 확인할 수 있다. 
이와 같이 클라이언트는 웹서버에게 줄바꿈(CRLF) 2번을 전송하여 서버에게 헤더 전송의 끝을 알린다. 

# Slowloris 공격

Slowloris 는 바로 GET Method의 요청 헤더 전송 형태를 악의적으로 이용하여 웹서버의 TCP 세션 수를 가득 채워 서비스 불가상태(Deny of Service)를 만드는 공격 방법이다. 

Slowloris 는 헤더 종결자인 줄바꿈(CRLF) 2회를 의도적으로 1회만 보내서 웹서버에게 더 전달될 헤더 정보가 있는것처럼 인식하게 하여 세션을 유지하게 한다. 

아래 그림을 참고하자. 


일반적으로는 클라이언트와 웹서버간 TCP 세션 수립 이후 요청을 보내면, 웹서버는 그에 맞는 응답을 회신한다. 
이때, 요청을 자세히 들여다 보면 HTTP 요청 헤더의 종결자로 줄바꿈(CRLF) 2번이 사용됨을 알수 있다. 

Slowloris 공격은 다음과 같이 요청 헤더의 종결자를 보내지 않는 형태를 띈다. 


헤더의 마지막에 종결자를 의미하는 줄바꿈(CRLF) 2회를 보내지 않는다. 
1회만 전달해서 웹서버에게 마치 더 전송될 요청 헤더가 있는것처럼 속여서 세션을 오래 유지하게 하는 것이 Slowloris 이다. 

이런 요청을 많은 클라이언트를 이용하여 특정 웹서버로 공격하면 웹서버는 처리할 수 있는 최대 TCP 세션 풀(Pool) 을 가득 채워 더이상 세션을 맺지 못하게 되어 DoS 상태에 빠지게 된다. 



--- 끝 ---





댓글 없음:

댓글 쓰기