DoS(Denial of Service) 정의

  • DoS공격은 상대방 서버가 서비스를 하지 못하도록 하는 서비스 거부 공격
  • 공격대상이 수용할 수 있는 능력 이상의 정보나 사용자 또는
    네트워크의 용량을 초과시켜 정상적으로 작동하지 못하게 함
  • 공격의 종류에는 특정 프로그램의 취약점을 이용한 공격, 네트워크
    특성상 발생하는 취약점 공격, 무차별 공격, 서버 및 시스템 마비 등
  • 분산 환경에서 발생할 수 있는 DoS공격을 DDoS(Distributed DoS)라 함












DoS 공격 유형


<출처: University of TORONTO>

1) Ping of Death

- Ping of Death 공격의 기본은 Ping을 이용하여 ICMP 패킷을 정상적인 크기보다 아주 크게 만드는 것

 이렇게 만들어진 패킷은 네트워크를 통해 라우팅되어 공격 네트워크에 도달하는 동안 아주 작은 조각(fragment)이 됨

 자세한 사항은 (http://kkn1220.tistory.com/76 참고)

 공격 대상 시스템은 이렇게 작게 조각화된 패킷을 모두 처리해야 하므로 정상적인 Ping의 경우보다 많은 부하가 걸림

- RFC-791 Internet Protocol에 따르면 헤더를 포함한 IP 패킷의 최대길이는 65,535(=16비트-1=2^16-1)까지로 제한되어 있다.

Ping of Death

 결국 공격자가 65,535보다 큰 사이즈의 패킷을 보내게 되면 수많은 조각이 생성되고 해당 Buffer가 overflow되어, 대상 시스템 및 서버는 충돌이 일어난다.

 통상적으로 IP 패킷의 헤더는 특별한 옵션이 없으면 20바이트를 보내고, ICMP ECHO request 패킷은 8바이트의 ICMP 헤더를 사용하기 때문에 실제 데이터 길이의 최대값은 65,507(65,535-20-8)바이트가 된다. 하지만 요새 시스템은 비정상적으로 큰 ICMP 데이터를 발생시키지 못하도록 하기 때문에 많이 막혀있다.

 기본적인 ping을 살펴보자

192.168.100.3(window)에서 192.168.100.5(target-ubuntu)로 ping을 보내고 kali에서 tcpdump로 5번을 지켜보았다.
귀찮아서 3번에 tcpdump를 안한것은 아니다.

기본적으로 ping은 32바이트(window)를 보낸다.(리눅스의 경우 56) 
그렇기 때문에 위에서 설명했듯이 32+20(ip header)+8(request packet) 총 60바이트의 길이가 출력될 것이다.

즉, 총 length는 60을 확인할 수 있다.


앞서 요새 많이 막혔다고 하는데 실제로 다음과 같다.

실제 보낼 수 있는 데이터 길이의 최대값은 65,507(65,535-20-8)바이트이다.

윈도우의 경우 65500을 넘지 못한다.

kali의 경우 65507까지만 허용한다.

65,507을 넘을 경우 허용하지 않는다.

jolt2라는 툴을 사용하면 된다고 몇 개의 다큐먼트들이 있지만 다음에...(윈도우 NT, 2000 시스템 가능 확인 필요)

2) SYN Flooding (그림 출처: wiki)

- SYN flooding이란 SYN을 넘치게 하는 것을 뜻한다. 즉 클라이언트가 서버의 SYN Queue를 overflow시켜 서버를 오동작하거나 충돌시키는 공격이다.

위의 그림은 정상적인 3-way handshake 내용이다. 

1. 클라이언트 alice는 서버에 접속을 요청하는 SYN패킷을 보낸다. 이 때 상태는 SYN/ACK 응답을 기다리는 SYN_SENT이다.

2. 서버는 SYN요청을 받고 alice에게 요청을 수락한다는 ACK와 SYN flag가 설정된 패킷을 발송하고 alice의 ACK응답을 기다린다. 이때 서버의 상태는 SYN_RECEIVED이다.

3. alice는 서버에 ACK를 보내고 이후로부터는 연결이 이루어지고 데이터가 오가게 된다. 서버의 상태는 ESTABLISHED이다.

위의 그림은 SYN flood공격 모습이다. 

1. attacker는 스푸핑된 ip를 가지고 서버에 다수의 패킷을 보낸다. 하지만 ACK를 응답하지 않기 때문에 이를 half-opened라 부른다.

2. 서버는 스푸핑된 ip가 네트워크에 존재하지 않기 때문에 SYN/ACK패킷을 보낼 수 없고, 서버의 자원은 계속 소비하게 된다.
즉 SYN Queue의 내용은 계속 유지된다.
3. 합법클라이언트 alice는 서버에 연결을 시도하지만 거절당하게 된다.

4. attacker는 무한으로 보내게 되면 결국 서버의 Queue는 추가만 되기 때문에 overflow가 발생하게 된다.


공격: kali linux(192.168.100.14) -> target pc(192.168.100.5), fake ip(192.168.100.50)

위는 kali에서 기본적으로 제공하는 hping3으로 192.168.100.5에 192.168.100.50이라는 src ip로 80번의 목적지 포트에 SYN패킷을 초당 10개씩 보내라는 것을 의미한다. (hping3 소개: http://kkn1220.tistory.com/99 참고)

tcpdump로 확인 결과 flag가 S만 출력되는 것을 확인할 수 있다.


3) land attack (그림 출처: http://docstore.mik.ua/orelly/networking_2ndEd/fire/ch04_08.htm)

- 패킷을 전송할 때 출발지 IP주소와 목적지 IP주소 값을 타겟의 IP주소 값으로 똑같이 만들어서 타겟으로 보낸다.

- 시스템은 처음 시도된 SYN에 대한 reply 패킷을 출발지 IP 주소값을 참조하여 그 값을 목적지 IP주소 값으로 설정하여 패킷을 보낸다. 그러나 이 값은 자기 자신의 IP 주소값이기 때문에 네트워크 밖으로 나가지 않고 자기 자신에게 돌아오며 land 공격은 동시 사용자를 점유하는 것 동시에 CPU부하 또한 올리게 된다.

Figure 4-9

공격: kali linux(192.168.100.14) -> target pc(192.168.100.5)

kali에서 기본적으로 제공하는 hping3을 가지고 출발지ip와 목적지ip를 타겟ip로 설정하고 포트를 100으로 설정하였다.

첫 패킷을 확인하면 192.168.100.5.100 > 192.168.100.5.100 을 확인할 수 있는데 land attack 패치 이후 이후 패킷에서는 src port가 자동 증가되어 land attack에 피해를 입지 않는 것을 확인할 수 있다.


4) smurf attack (그림 출처: https://blog.cloudflare.com/deep-inside-a-dns-amplification-ddos-attack)

1. smurf공격은 공격자가 타겟의 IP로 스푸핑한 후, 타겟이 속해 있는 broadcast network로 broadcast 요청을 보낸다.

2. ICMP request를 수신한 컴퓨터들은 타겟에 reply 패킷을 보낸다.

3. 대량의 ICMP reply를 수신한 타겟은 과부하 상태가 된다.

Deep Inside a DNS Amplification DDoS  
Attack

위의 그림을 보면 공격자는 라우터에 타겟의 주소 9.9.9.9로 스푸핑하여 요청한다. 라우터는 각각 디바이스에 타겟의 IP로 request요청을 한다. 결국 각각의 디바이스들은 타겟에 reply 패킷을 보내게 된다.

hping3 [broadcast ip] -a [target ip] [packet type] --flood

kail#hping3 192.168.100.255 -a 192.168.100.5 --icmp --flood

kali에서 tcpdump결과 5번 target에서 255번으로 request를 하였고, 실제로 8번과 6번이 현재 연결되어 있는데 reply응답을 한 것을 확인할 수 있다.

실제로 위 명령을 실행한 결과 나의 컴퓨터는 컨트롤 c로 멈추기 전 동안 정상적이지 못했다... 직접 해보시길.......


teardrop 업데이트 필요

+ Recent posts