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

2017. 3. 12. 10:44보안 & 해킹/정보 보안

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




1. 목적


- HTTP Slow POST공격에 대해 이해한다.


- RUDY 공격을 실습해본다.


- 패킷을 보고 분석해본다.


- 대응방법을 알아본다.




2. 이해


HTTP 플러딩 공격의 원리 참조 - http://cafe.naver.com/kalilinux/367


HTTP POST 메소드에서 content-length 값을 지정하여 서버의 가용량을 할당하는데,


공격자가 서버에게 낮은 수의 데이터 단위를 보내도록 하여 서버측이 부하가 발생하는 원리이다.



RUDY는 R-U-Dead-Yet의 약자로서 풀어쓰면 'Are you dead yet?'


의역하면 '너 아직도 안죽었니?' 정도의 의미가 되겠다.


Children Of Bodom - Are you dead yet? 이라는 Death Metal 의 제목으로부터 유래했다고 생각된다.


혹시나 들어보고 싶다면 위의 유튜브 링크로 들어가보길...




3. RUDY 공격 실습


피해자 환경 : Ubuntu server 14.04_shopping mall, Apache Webserver

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


도구 설치와 옵션은 이전 링크 참조한다.



주의사항 : 이 도구는 Apache서버의 특성을 타겟으로 만들어졌다.

slowloris 공격과 같은 경우에는 Apache가 아니라도 공격이 가능하나 RUDY, Slow Read, Apach Killer 공격 옵션은 아파치가 아닐 경우(Custom Webserver, IIS Webserver)에는 공격이 통하지 않는것이 확인되었다. 또는 POST 공격대상이 없는 경우에도 마찬가지일 수 있다. 

웹서버의 특성마다 다를 수 있기에 참조하길 바라며 실습으로는 Apache를 이용하였다.


(역시나 Slowloris 공격이 default 옵션 인 이유가 있다.)



위 옵션값을 참조하여 RUDY 공격을 수행하기 위한 옵션은 다음과 같다.


1
slowhttptest --4000 -100 -200 -4096 -t WHACKUR -3 --o rudy -u http://192.168.10.131
cs



기타 옵션은 이전과 동일하기에 달라진 부분만 적도록 하겠다.


-B : RUDY 공격 타입


-s : 헤더의 내용 길이.  Content-Length의 길이를 설정해준다.


과거 보고서의 기준으로는 이 도구의 Content-Length길이는 100,000,000 이었으나 지금은 4096이 Default 값이다. (1억은 너무하잖아..)




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




Service available : NO 를 통해 웹서버가 멈춘 것을 알 수 있다.



Follow TCP Stream을 통해 보면 아래와 같은 형식들이다.







Stream 값을 올리며 탐색해보면 이 형식의 패킷이 공격패킷임을 알 수 있다. 정상 패킷의 TCP 스트림은 client (공격자) 와 server (피해자) 간의 통신이 왔다갔다 하는 과정이 보이는데 stream 값들을 보면 일방적으로 요청한 후 서버는 기다리기만 할 뿐이다.





이는 Content-Length에 의존적인 과거 RUDY 툴과 공격방식이 달라진 것으로 보인다.


이전 버전의 RUDY 툴에서의 공격 패킷은 아래와 같다.




[이전 버전의 RUDY 공격 1]




[이전 버전의 RUDY 공격 2]




결국 지금의 RUDY 공격은 Content-Length의 길이가 얼마가 되었든 POST BODY를 아에 안보낸다고 유추할 수 있다.



이를 증명하기 위해 Content-Length의 길이를 2로 설정한 후 다시 공격을 시도해 보았다.


1
slowhttptest --4000 -100 -200 -2 -t WHACKUR -3 --o rudy -u http://192.168.10.131
cs



Content-Length를 2로 했지만 마찬가지로 웹서버는 금방 죽어버렸다.




Report 결과







4. 방어책


- 이전과 마찬가지로 Signature 기반으로 필터링할 수 있다.

- 과거 도구는 Content-Length를 적당히 설정하여 그 이상을 요구하면 차단이 가능했으나 최근 툴에서는 무의미해보인다.

- 연결 Time out 설정으로 일정 시간 이상 연속된 데이터를 보내지 않는 접속자에 대하여 차단할 수 있다.


아래는 KISA DDoS 방어 가이드를 참조한 방법이다.


RequestReadTimeout header=5 body=8

# header=5

# HTTP Header Request가 5초 이내에 완료되지 않으면, FIN 패킷을 보내 연결을 해제

하며, 이 때 Apache Server는 408 Response Code로 응답 한다. Timeout이 지난 후

Connection을 종료한다.

# body=8

# POST 요청 이후 8초 동안 데이터가 오지 않을 시 FIN을 보내 연결 해제를 요청하고

RST로 Connection을 종료한다. 일반적인 POST Request 시 Apache Server는 3-Way

Handshake 이후 POST Request의 Content-Length 값만큼의 데이터가 수신될 때까지

Connection을 Open 상태로 수신을 기다린다.


<RequestReadTimeout 지시자의 사용 예>



RequestReadTimeout header=10 body=30

# Client의 요청 header 전송완료는 10초 이내 , 요청 body 전송 완료는 30초 이

내로 제한

RequestReadTimeout body=10,MinRate=1000

# client의 요청 body 전송완료는 10초 이내로 제한, 단 client가 data를 전송할

경우 1,000bytes 전송 시점마다 1초씩 증가


<RequestReadTimeout 지시자 활용 예>


- 한 IP에서 동시 연결에 대한 임계치를 설정하도록 한다.




5. 실습결과 첨부파일


normal.pcapng

rudy.csv

rudy.html

rudy.pcapng





참고 스크린샷 자료 출처 


이전 버전의 RUDY 공격 1 : Slow DoS(서비스거부) 공격과 대응. 전영도. 모니터랩 

이전 버전의 RUDY 공격 2 : Content-Length 통제기반 HTTP POST DDoS 공격 대응 방법 분석. 이 대 섭, 원 동 호. 성균관대학교 정보통신공학부