출처 : 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 패킷을 생성, 공격 대상에게 송신한다. 수신한 측에서는 재조립을 할 수 없으므로 시스템이 다운되는 등의 사태가 발생한다. 이 문제는 패치를 적용함으로서 해결할 수 있다.