어느날 Wireshark로 패킷을 분석중이였는데 A PC에서는 Fragment offset값이 1480으로 보여졌는데 B PC에서는 185로 보여지는 증상이 있어 찾아보게 되었다.
우선 Fragment Offset이란 네트워크상으로 패킷을 보낼 때 한번에 전송할 수 있는 최대치(MTU)1 를 초과하게되면 패킷을 여러개로 쪼개서 보내게되는데 이런 현상을 단편화(Fragment)라고한다. 단편화가 발생하게되면 보내는쪽에서 각 패킷에 일련번호를 붙여 패킷의 순서를 구분하게되는데 그 값을 Fragment offset 값이라고 한다. 아래는 일반적인 IP Header의 구조이며 자세한 설명은 추후 포스팅하겠다.
![](https://lasthackers.com/content/uploads/2020/10/image.png)
만약 아래처럼 size가 3500 Bytes인 Data를 전송하려면 아래와 같이 3개의 패킷으로 나뉜다. 그런데 IP Protocol을 사용하여 인터넷상으로 패킷을 보내려면 각 패킷마다 새로운 헤더를 붙여줘야한다. 따라서 실제 보내어지는 데이터는 헤더를 제외한 만큼 단편화되어 전송된다. 아래의 예시를 보자.
![](https://lasthackers.com/content/uploads/2020/10/image-1.png)
1번 패킷은 20 Bytes(IP Header) + 1480 Bytes(Data) = Total length 1500 Bytes
Flag값은 More flagments set (뒤에 단편화된 패킷이 두개 더 있기 때문에)
Fragment offset값은 첫번째 패킷이기 때문에 0
첫번째 패킷을 보내면 1480 Bytes를 보냈고 3500 – 1480 = 2020 Bytes가 남아있다.
2번 패킷은 20 Bytes(IP Header) + 1480 Bytes(Data) = Total length 1500 Bytes
Flag값은 More flagments set (뒤에 단편화된 패킷이 한개 더 있기 때문에)
Fragment offset값은 두번째 패킷이기 때문에 1480 (첫번째 패킷이 1480까지 보냈기때문에)
두번째 패킷을 보내고 나면 총 2960 Bytes를 보냈고 3500 – 2960 = 540 Bytes가 남았다.
그리고 여기서 이글의 제목과 같은 문제가 발생했다.
![](https://lasthackers.com/content/uploads/2020/10/image-2.png)
어떤글에서는 185라고 설명하고 어떤글에서는 1480이라고 설명하니 뭐가 맞는지 모르겠었는데 위의 IP Header표를 보면 Total length 필드는 16bit이고 Fragment offset 필드는 13bit여서 만약 65500 Bytes처럼 엄청 큰 데이터를 단편화하게되면 offset 필드가 작아서 명시할 수 없으므로 8로 나눠서 표기하는 185가 맞다고한다.
위의 내용 관련하여 Wireshark 3.2.2 버전 릴리즈노트에도 버그 내용이 설명되어있다. 해당 내용은 아래 링크로 확인 가능하다. (근데 본인의 버전은 3.2.4인데 왜 저렇게 표기되는지는 모르겠다..)
https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=16344
마지막으로 3번째 패킷은 20 Bytes(IP Header) + 540 Bytes(Data) = Total length 560 Bytes
Flag값은 0 (단편화된 마지막 패킷이라서)
Fragment offset값은 마지막 패킷이기 때문에 (1480+1480)/8 = 370
Wireshark에서는 단편화된 패킷을 정리해서 보여주기때문에 분석하기 편하다.
![](https://lasthackers.com/content/uploads/2020/10/image-3.png)
IP Fragment 관련 공격으로는 Tear Drop, Bonk, Boink 등이 있으며 현재는 대부분 OS패치로 인해 효과를 줄 수 없는 공격들이다.
1) MTU (Maximum transmission unit, 최대 전송단위) : Ethernet에서는 일반적으로 1500 Bytes이고, Jumbo frame의 경우에는 일반적으로 최대 9000 Bytes까지 보낼 수 있다.