본문 바로가기

work/network

IP Fragmentation and Teardrop Attack

출처 : http://misman95.egloos.com/1848177

패킷 헤더

모든 IP패킷은 다음과 같은 정보를 포함하는 패킷에 관한 정보를 저장하는 IP 헤더를 가지고 있다.

  • Version
  • IHL(Internet Header Length)
  • Type of Service
  • Total Length
  • Identification
  • Flags
  • Fragment Offset
  • Time to Live
  • Protocol
  • Header Checksum
  • Source Address
  • Destination Address
  • Options
  • Padding

참조: RFC791 – Internet Protocol

다음 3가지는 패킷의 단편화에 관련된다.

  • Identification
  • Flags
  • Fragment Offset

Identification(16 비트)

사이즈가 데이터는 복수의 IP패킷으로 나누어 송신한다. 분할된 데이터인지, 아니면 별개의 데이터인지 식별하기 위해 사용된다.

Flags(3비트)

IP패킷의 분할을 제어할 사용된다.

Bit 0: 예약됨(미사용)
Bit 1: DF
값이 0이면 분할 가능. DF값이 1이면 분할 불가
Bit 2: MF
값이 0이면 마지막 Fragment, MF값이 1이면 다음 분할 패킷이 존재함.

Fragment Offset(13 비트)

분할된 패킷의 원래 데이터의 어느 부분에 위치하는지를 가리킨다. 단위는 8옥텟(64비트)으로, 최개 8 X8,192 = 65536옥텟.

IP 헤더와 마찬가지로 TCP(Transmission ControlProtocol) 헤더도 패킷에 관한 정보를 가지고 있다. 다음은 TCP 헤더에 대한 정보이다.

  • Source Port
  • Destination Port
  • Sequence Number
  • Acknowledgement Number
  • Data Offset
  • Flags
  • Window
  • Checksum
  • Urgent Pointer
  • Options
  • Padding

참고: RFC793 – Transmission Control Protocol

패킷 분할

디폴트 MTU(1,500) 사용하는 네트워크에서 2366바이트의 패킷을 송신하려면, 패킷을 2개로 나눠야 한다(분할).

번째 패킷:

  • 1,500바이트(IP헤더: 20바이트, TCP헤더: 24바이트, 데이터: 1,456바이트)
  • DF비트가 0(분할가능), MF비트가 1(추가 분할 패킷이 존재)
  • Fragmentation Offset 0

번째 패킷

  • 910바이트(IP헤더: 20바이트, TCP헤더: 24바이트, 데이터: 866바이트)
  • DF비트가 0(분할가능), MF비트가 0(마지막 분할 패킷)
  • Fragmentation Offset 182 (1456/8).

공격 패킷의 분할

분할 패킷은 방화벽의 블록킹 룰을 회피할 사용될 있다.

이것은 Fragment옵셋의 값을 변조함으로써 가능하다. 방법은 번째 패킷의 Fragment 옵셋을 매우 낮은 값으로 설정하여, 번째 패킷 다음에 번째 패킷을 추가하는 것이 아니라, 번째 패킷의 TCP헤더와 데이터 부분을 덮어 쓰는 것이다.

패킷 필터링 방화벽에 의해 TCP 23(TELNET) 포트는 블록, 25(SMTP) 오픈되어 있는 네트워크가 있다고 하자. 네트워크의 TELNET서비스에 접속하려면 다음과 같은 2개의 패킷을 송신한다.

번째 패킷:

  • Fragmentation Offset 0.
  • DF 비트가 0(분할가능), MF비트가 1(추가 분할 패킷이 존재)
  • TCP헤더의 목적지 포트가 25. 25번은 방화벽을 통과할 있으므로.

번째 패킷:

  • Fragmentation Offset 1. 이것은 번째 패킷이 번째 패킷의 처음 8비트만 남기고 전부 덮어쓰기한다.
  • DF비트가 0(분할가능), MF비트가 0(마지막 분할 패킷)
  • TCP헤더의 목적지 포트를 23번으로 설정. 이것은 블록되어야 하나 여기에서는 통과된다.

패킷 필터링 방화벽은 번째 패킷의 Fragment Offset 0보다 값인지 확인한다. 값이 0보다 크면 방화벽은 패킷이 다른 패킷의 Fragment라고 판단하여 그냥 통과시켜 버린다.

2개의 패킷이 목적지에 도착하면, 재조립된다. 번째 패킷이 번째 패킷의 내용을 거의다 덮어쓰기하므로, 조립되고 후의 패킷은 23 포트로 가게 된다.

Teardrop 공격

Fragment 이용한 DoS공격으로서 Teardrop 있다. Teardrop공격은 Fragmentation Offset 위조하여 Offset 중복하는 부정한 IP Fragment 패킷을 생성, 공격 대상에게 송신한다. 수신한 측에서는 재조립을 없으므로 시스템이 다운되는 등의 사태가 발생한다. 문제는 패치를 적용함으로서 해결할 있다.