메뉴 닫기

(Wireshark) IP Fragment Offset 1480? 185? 표기 오류

어느날 Wireshark로 패킷을 분석중이였는데 A PC에서는 Fragment offset값이 1480으로 보여졌는데 B PC에서는 185로 보여지는 증상이 있어 찾아보게 되었다.

우선 Fragment Offset이란 네트워크상으로 패킷을 보낼 때 한번에 전송할 수 있는 최대치(MTU)1 를 초과하게되면 패킷을 여러개로 쪼개서 보내게되는데 이런 현상을 단편화(Fragment)라고한다. 단편화가 발생하게되면 보내는쪽에서 각 패킷에 일련번호를 붙여 패킷의 순서를 구분하게되는데 그 값을 Fragment offset 값이라고 한다. 아래는 일반적인 IP Header의 구조이며 자세한 설명은 추후 포스팅하겠다.

[그림1] IP Header

만약 아래처럼 size가 3500 Bytes인 Data를 전송하려면 아래와 같이 3개의 패킷으로 나뉜다. 그런데 IP Protocol을 사용하여 인터넷상으로 패킷을 보내려면 각 패킷마다 새로운 헤더를 붙여줘야한다. 따라서 실제 보내어지는 데이터는 헤더를 제외한 만큼 단편화되어 전송된다. 아래의 예시를 보자.

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가 남았다.
그리고 여기서 이글의 제목과 같은 문제가 발생했다.

어떤글에서는 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에서는 단편화된 패킷을 정리해서 보여주기때문에 분석하기 편하다.

IP Fragment 관련 공격으로는 Tear Drop, Bonk, Boink 등이 있으며 현재는 대부분 OS패치로 인해 효과를 줄 수 없는 공격들이다.

1) MTU (Maximum transmission unit, 최대 전송단위) : Ethernet에서는 일반적으로 1500 Bytes이고, Jumbo frame의 경우에는 일반적으로 최대 9000 Bytes까지 보낼 수 있다.

0 0 votes
Article Rating
구독
Notify of
guest

0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x