본문 바로가기

Security

slowloris 분석/대응방안

SlowLoris

GET 방식의 메소드는 헤더의 데이터 구분을 CRLF을 이용한다. 0D 0A 가 두번 들어가면 헤더의 끝을 나타내는데..
의도적으로 한번만 넣어서 헤더의 끝을 맺지 않음으로 서버는 헤더가 끝날때까지 지속적으로 기다리게 만든다.
익히 알려진 slowloris 공격 툴은 헤더에 X-a: b 를 전송하고 Content-Length가 42byte 라는 특징이 있다.

:: 공격에 취약한 서버
- Apache 1.x, 2.x, squid

:: 공격에 취약하지 않은 서버
- lighttpd, IIS6.0, IIS7.0, nginx, varnishd, J5K.

공격툴로 테스트를 해보면 아래와 같이 펜더가 나온다.


공격 진행중 패킷을 보면 CRLF(0d 0a) 를 한번만 보내 헤더의 끝을 맺지 않음을 알 수 있다.

slowloris의 특징인 Content_Length: 42 와 X-a: b 도 보인다.

이와 같이 공격을 수행하면 "X-a: b\r\n"의 불완전 헤더를 지속적으로 보내어 SYN->SYNACK를 반복하고 서버 측에서 FIN 패킷을 보내지 않아 계속 패킷을 기다리는 상태가 되어 결국 서비스 거부상태가 된다. 

apache의 경우 실제 공격시에는 로그가 남지 않으며 공격을 멈추면 아래와 같이 로그가 남는다.

# error_log

[error] server reached MaxClients setting, consider raising the MaxClients setting
failed: error reading the headers
failed: error reading the headers
failed: error reading the headers
failed: error reading the headers

# access_log

"GET / HTTP/1.1" 400 308
"GET / HTTP/1.1" 400 308
"GET / HTTP/1.1" 400 308
"GET / HTTP/1.1" 400 308 


:: 대응방안

-.  Timeout 설정 변경(가장 현실적인 방법)
     httpd.conf 에서  Timeout 300  ==> 5 이하로 변경 (5초동안 연속된 패킷이 오지 않을 경우 timeout시킴)

-. iptables의 connection limit(커넥션 제한) 설정
   # iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 30 -j DROP




'Security' 카테고리의 다른 글

FTP Active/Passive 정리  (0) 2017.01.06
ubuntu 환경에 SNORT & BASE & Metasploit 설치  (0) 2017.01.06
포트 스캐닝으로부터 OS 정보 숨기기  (0) 2017.01.06
R.U.D.Y DDoS  (0) 2017.01.05
윈도우 로그온 유형  (0) 2016.12.29