HTTP Method / GET Flooding / Slowloris

2017. 8. 1. 20:35WebHacking/Web




< 요청 헤더 Method에 따른 응답들 >


1> GET


[ GET Method Code ]


[ GET Method 실행화면 ]


GET방식으로 해당 페이지에 대한 정보를 요청한다

Message-Body에 해당 페이지의 소스코드가 담겨져서 응답이 왔다


2> OPTIONS

[ OPTIONS Method Code ]


[ OPTIONS Method 실행화면 ]


해당 웹 페이지에 사용할 수 있는 메서드들의 종류들을 알려줍니다


3> HEAD

[ HEAD Method Code ]


[ HEAD Method 실행화면 ]


GET메서드와 같지만 차이점은 메시지 바디가 없다는 것 뿐이다



< GET Flooding >

단순하게 GET방식의 요청을 무수히 많은 PC에서 보내면 타겟이 되는 PC는 과부화가 발생한다

[ GET Flooding Code ]



< Slowloris Attack >

[ Slowloris Code ]


헤더는 마지막 문장에 "\r\n"(CRLF) 을 넣음으로써 헤더의 끝을 알린다

헤더의 끝에 \r\n을 없애서 전송한다면 어떻게 될것인가?

서버는 헤더가 끝이 아니라고 인식하고 계속 헤더의 내용을 읽어드리려고 대기한다

이러한 요청을 무수히 많이 보내면 타겟 서버는 과부화가 발생한다


[ Slowloris 실행 ]


HTTP통신은 이전에 말했듯이 요청을 보내고 응답을 받으면 TCP통신을 자동으로 끊어지도록 동작한다

타겟 서버와 TCP통신이 끊어지지 않고 계속해서 ESTABLISHED상태임을 확인할 수 있다


[ Wireshark Capture ]


아래 파란색 상자로 체크해놓은 부분이 Slowloris Attack 부분이다

연결이 끊어지지 않고 서버는 계속해서 대기하고 있음을 확인할 수 있다

서버에서 설정한 TTL시간만큼 대기하므로 해당 시간에 도달하기 전에 헤더요청을 하나 더 보낸다

소스코드에서 time모듈을 사용해서 TTL 60초가 되기전에 59초마다 헤더요청을 보내도록 설계하였다



< Slow Read Attack >

[ SlowRead Code ]


헤더에서 데이터 바디 부분에 데이터가 있다면 해당 데이터의 타입과 길이를 명시해주어야 한다

여기서, 데이터의 길이를 99999999 만큼 큰 크기의 요청패킷을 보내면 어떻게 될까?

서버는 99999999만큼의 데이터를 하나씩 천천히 읽어들이고 연결을 계속 유지된다

이러한 패킷들을 무수히 많이 보내게 되면 타겟 서버는 과부하 상태에 빠지게 된다


[ SlowRead 실행 ]


타겟 서버와 TCP연결이 끊어지지 않고 ESTABLISHED상태를 유지하고 있다

서버는 99999999만큼의 데이터를 천천히 계속 읽어들인다