어플리케이션(7) 계층 취약점 공격
"7계층" DDoS 공격의 한 유형
공격자가 동일한 동적 콘텐츠에 대한 HTTP GET 요청을 다량으로 발생
⇉ 웹 서버(공격대상)가 해당 요청을 처리하기 위해서 서버 자원을 과도하게 사용
⇉ 정상적인 요청을 처리하지 못 하도록 서비스 부하 일으킴
이러한 형태의 공격에서는 여러 컴퓨터 또는 기타 장치를 조정하여 대상 서버로부터 이미지, 파일, 기타 자산에 대한 여러 요청을 보냅니다. 공격 대상이 들어오는 요청과 응답으로 넘쳐나면 합법적인 트래픽 소스의 추가 요청에 대해 서비스 거부가 발생합니다.
httpflooder.pl
파일 준비perl ./httpflooder.pl -a GF -t 100 -n 1000 -u /index.php -h 10.0.0.50
※ 서버에 부하가 많은 동적(jsp, asp, php 등) 콘텐츠 자료를 GET Request
HTTP Get Flooding 패킷 분석
공격 대상 웹서버 URL 주소를 지속적으로 변경하면서, 다량으로 GET 요청을 발생시키는 서비스 거부 공격
⇒ 특정 URL로 과다 요청하는 것에 대한 임계치 기반의 공격을 탐지하는 DDoS 대응 장비 우회 의도
hulk.py
파일을 이용해 Hulk DoS 공격 시작URL 정보에서 파라미터 값 계속 변경 ⇒ 임의의값 만들어서 요청
❗웹서버에서는 HTTP Request 요청 시 GET , POST 방식으로 전송되는 변수를 hash 구조로 관리
이런 특성을 악용하여 조작된 수 많은 파라미터 값을 POST 방식으로 웹서버로 전달
⇉ 웹 서버는 다수의 해시 충돌(Hash Collision)이 발생
⇉ 해시테이블에 접근하는 시간이 급속도로 증가
⇉ 정상적인 파라미터 조회가 느려짐 (조회 시 많은 CPU 자원을 소모)
⇉ 서비스 거부 공격
java -jar "hashdostester.jar"
실행 후 공격대상 입력, 요청 사이즈 200 조정하고 Start 클릭
URL : 공격대상
요청 파라미터 정보는 “파라미터명=파라미터값”&“파라미터명=파라미터값” 반복
HTTP Dos 툴로 TCP 세션을 정상적으로 연결 후,
HTTP 패킷 요청(GET 메소드)시에 불완전한 헤더값을 보내어 커넥션을 유지하게 둔 채 새로운 HTTP 연결을 반복해서 시도하는 방법
HTTP 헤더
각 필드는
\r\n
(개행문자)로 마무리되고,
헤더의 가장 끝은\r\n\r\n
로 구성되어 있음
[HTTP Response Format] https://hazel-developer.tistory.com/145
서버 입장에서는 TCP 3-Way Handshake가 맺어진 이후
HTTP 헤더의 끝을 인식하기 위해 \r\n
를 두 번 받아야 한다.
❓만약, 두 번째 \r\n
이 오지 않을 경우, 헤더 정보가 아직 전송 중이라고 인식하고 연결을 유지
Slowloris는 이러한 점을 악용
=> \r\n
을 한번만 보낸 상태에서 마지막 개행문자를 보내지 않고 지속적으로 의미없는 변수를 전송
=> 세션 고갈
=> HTTP 세션을 계속 잡아두게 하는 공격
대응방안 : 연결 타임아웃 시간을 적절히 짧게 두어 의심되는 연결이 종료되도록 한다
slowloris.pl
을 이용해 HTTP DOS 공격을 시작perl ./slowloris.pl -dns 10.0.0.50
Header와 Body를 구분하는 0d0a0d0a
가 아닌, 0d0a
(=\r\n
)에서 끝냈다는 것은 아직 전송할 헤더가 남았음을 의미
HTTP POST Method를 사용하여 헤더의 Content-Length 필드에 임의의 큰 값을 설정하여 전송한 후, 소량의 데이터(1byte)를 느린속도로 전송하여 세션연결을 유지하며 공격하는 방식
클라이언트와 서버가 정상적인 3-Way Handshaking을 거친 다음
⇉ 클라이언트가 POST 데이터를 보낼 때, Content-Length 필드를 20000으로 지정 한 후, 서버로 전송
⇉ 서버는 클라이언트에서 20000 Byte의 데이터가 들어올때 까지 해당 세션을 열어둠
⇉ 하지만 클라이언트는 1초에 1Byte씩 전송
⇉ 20000초(5시간 30분)동안 세션이 유지됨
slowhttptest -X -c 1000 -r 500 -w 10 -y 20 -n 5 -z 32 -p 3 -u http://10.0.0.50
TCP의 흐름 제어 = 연결된 상호간에 수신 가능한 양만큼만 데이터를 전송하는 제어방식
TCP 헤더의 Window 필드 ⇒ 수신측에서 수신 가능한 여유 공간의 크기를 담아서 송신측에게 전달하는 헤더 필드
if, 수신측에서 여유 공간이 없다면, Zero Window Packet으로 응답
공격자는 이런 TCP 흐름 제어 특성을 이용하여 HTTP 요청을 보낸 후 Window 사이즈 크기를 0으로 조작하여 지속적으로 서버에 전달하여 서버가 요청에 대한 응답 메세질를 전송하지 못하고 연결을 지속으로 유지하도록 한다
웹서버의 연결 자원이 모두 소진되어 정상적인 요청을 받을 수 없는 상태로 만드는 공격
iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 30 -j DROP
웹 캐시?
- 웹 문서(HTML, 이미지 등)를 캐쉬 서버에 미리 저장하여, 원본 서버 대신 전송해 주는 기술
- 사용자 응답 속도 향상, 원본 서버의 부하 감소 -> 서비스 안정성 증대