본문 바로가기

Network Hacking

31~32일차] HTTP Packet analysis, HTTP GET FLlOODING, HTTP Slow Read

Server-A [웹 서버] (10.10.10.10)

#> yum -y install httpd

#> vi /var/www/html/index.html                                 // 홈디렉터리에 간단히 NETWORK-A 출력해주는 html파일 작성

 

 

Server-B [클라이언트] (10.10.10.20)

#> yum -y install elinks                                            // 웹 브라우저 설치

#> elinks 10.10.10.10                                               // 웹 서버 접속

# 결과 : 서버가 클라이언트의 요청에 따라 응답을 해주는 것을 확인 할 수 있다. 이제 이 과정을 wireshark로 캡쳐해 보자.

 

 


 

HTTP transaction : 웹 브라우저가 웹 서버에 하나의 요청을 보내고 웹 서버가 요청을 처리하여 응답을 전송하는 한 번의 과정을 트랜잭션이라고 한다. 

1). 웹 브라우저가 웹 서버가 설치된 호스트에 연결한다.

2). 웹 브라우저는 요청 패킷을 만든다.

3). 웹 브라우저는 요청 패킷(헤더,데이터)을 전송하고 기다린다.

4). 웹 서버는 요청 패킷을 받고 헤더와 데이터로 분리한다. 웹 서버는 요청을 처리하고 응답 패킷을 만든다.

5). 웹 서버는 응답 패킷을 웹 브라우저에게 보내고 강제로 연결을 끊는다. 

특징 : 연결 당 하나의 트랜잭션을 수행하고 각 트랜잭션은 상호 무관한다. 그러므로, 웹 서버는 연속되는 각 트랜잭션을 독립적인 사건으로 다룬다.

장점 : 웹 서버의 부하를 줄일 수 있으므로 동시에 많은 클라이언트를 지원할 수 있다.

 

 

[Server-A와 Server-B의 과정을 wireshark로 캡쳐]

 

(정말 간단하게 클라이언트가 요청을하고 그에 대한 응답을 해준다. )

 

 

※ 클라이언트의 요청(Request)    

# Request Line : 요청 종류(request type), 자원(url), HTTP 버전(version) 등을 정의

 

 

 

 

※ 서버의 응답(Response)

# Statue Line : HTTP version, Status code, Status phrase [중요]! 상태코드를 보고 웹 페이지가 어떻게 동작했는지 유추 가능하다.

 

 

 

※ 상태코드의 종류

 

 # 200, 400, 403, 404, 500, 501, 503 정도는 필수적으로 알고 있어야 한다.

 


 

1. HTTP GET Flooding (Slowloris Attack)

TCP 3Way Handshake 과정 이후 정상적으로 보이는 트랜잭션이 추가적으로 발생되는 DDoS 공격 기법이다. 일반적으로 DDoS 공격은 웹 서버를 대상으로 DDoS 공격이 발생되며, TCP 세션 연결 이후 발생하는 일반적인 공격 형태가 바로 HTTP Get Flooding 형태가 그것이다. 다시 말하면, HTTP Get Flooding은 정상적인 TCP 연결 과정 이후 정상적으로 보이는 HTTP Transaction 과정이 수행되는 DDoS 공격 기법이다. 직접 wireshark로 캡쳐하여 살펴보자.

 

※ Tool : slowhttptest (Application Layer DoS를 시뮬레이션 하기위한 툴 )  slowhttptest-1.6-2.el6.x86_64.rpm

 

[NETWORK-V]

#> yum -y localinstall slowhttptest-1.6-2.el6.x86_64.rpm      //위의 slowhttptest를 다운받은 다음할 것

#> slowhttptest -c 4000 -g -o slowloris -i 10 -r 100 -t GET -x 3 -p 3 -u http://10.10.10.10     // 서버 NETWORK-A를 공격

#> 옵션을 해석하자면 4000개의 세션을 연결 시도하며(c), 소켓의 변화되는 상태 통계(g)생성, 보고서 출력 파일 생성(o), slowloris방식의 공격(slowloris), 데이터 전송 간격 10(i), 초당 연결하는 세션의 개수(r), 요청을 GET방식으로(t), 바이트 최대길이 3(x),  3초가 흘러도 응답이 없을 시 접속이 불가능 하다고 판단(p), 타겟 URL(u)

 

 

※ 공격한 부분을 flooding한 결과를 확인해 보자. -->get_flooding.pcapng

 

# 많은 세션중에 한 세션만을 확인해보자.

# 가장 먼저 3Way-Handshake를 하고 tcp 방식으로 추가 정보를 보내는데 그부분을 hex view로 살펴보면 다음과 같다.

 PDU는 특정 계층의 프로토콜 안에서 두 개의 실체간에 교환되는 세분화된 데이터 블록의 단위를 기술적인 이름으로 구분해 부르는 것을 말한다. 그러나, 많은 수의 사람들이 PDU나 프레임 등으로 엄격하게 구분해 사용하지 않고, 네트웍을 통해 이동하는 모든 데이터 단위를 그저 패킷이라고 부르는 경우가 많다.

# 정상적인 http는 0d 0a(\r\n)을 2번 보내면서 header line이 끝났다는 것을 의미하는데, 다음과 같이 \r\n을 한번만 보냄으로서, 서버입장에서는 아직 더 보낼것이 있는 것으로 인지하고 세션을 일정 시간동안 유지한다.

# 서버는 일단 받았다는 ack메시지를 보내며 메시지가 더 올거라 생각하고 세션을 유지한다.

 

 

결론 : 이런식으로 HTTP Transaction을 맺지 못하고, 아주 많은 임의의 포트로 이러한 세션을 유지하면 결국 서버는 더 이상 서비스를 수행할 수 없는 지경에 이른다.

# service availables : no

 

 

 

2. Slow Read

공격자가 TCP 헤더 중에 Window Size 항목을 최소로 설정하여 웹서버에게 전송하는 공격방법, 즉 Window는 최대 받을 수 있는 데이터를 뜻하는데 공격자가 이 Window를 아주 작은 값으로 설정한 다면 서버입장에서는 아주 작은 단위로 데이터를 나눠서 패킷을 보내게 된다. 그러면 오랫동안 한 세션이 끊기지않는데 이를 이용해서 여러 세션을 유지하게 함으로서 서버에게 부하를 가해 더 이상 서비스를 할 수 없도록 하는 것이다.

 

[NETWORK-V]

#> slowhttptest -X -c 1000 -r 200 -w 10 -y 20 -n 5 -z 32 -p 3 -u http://10.10.10.10     //windowsize를 점점 작게 만든다.

# 해당 공격에 대한 캡쳐 -->  HTTP_Slow_Read.pcapng 

 

# 한 패킷과정을 필터링해서 살펴보면 Window의 크기가 점점 줄어들고 나중에가서 TCP ZeroWindow에 도달한다.

# 이러한 패킷들이 수백가지가 한번에 들어오면서 서버는 결국 서비스를 하지 못하게 된다.