2010년 10월 15일 금요일

TCP/IP 헤더 내 맘대로...tcp[13] == 2 의 의미는 무엇일까?

tcpdump 를 이용해 패킷을 덤프하다 보면 다양한 표현식을 이용해 필터를 표현하는 경우가 많다. 많은 경우는
대략 사용되는 문자만 보더라도 의미가 파악되는 경우가 많다. 예를 들어, src 라 하면 하면 source 인 출발지가 연상되고 host 는 말 그대로 호스트를 뜻한다. 그럼 이걸 다 연결해서 보면 src host 192.168.0.0 필터의 의미를 금방 추측해 볼 수 있다. tcpdump 에서 이용되는 필터 표현방식은 큰 어려움이 없다. 그런데 아래와 같은 경우는 무엇일까?

tcp[13] == 2

얼핏 봐서는 의미가 잘 파악이 안된다. 어렵게 느껴질 수도 있는데 TCP 헤더를 생각해 보면 의외로 쉽게 풀린다.
일단 다음의 TCP 헤더 포맷을 살펴보자.
[출처 : nmap.org]

TCP 헤더 포맷은 Options 을 제외하고는 20 바이트로 구성되어 있다. 오프셋은 0 부터 시작하고, Octet 형태로 보면 첫 라인은 0 - 3 까지이고, 두번째 라인은 4-7 이다. 그렇다 바로 위에서 13 이라는 것은 바로 이 위치인 것이다. TCP 라고 하였으니 TCP 헤더를 뜻한 것이고 뒤에 들어가는 것은 헤더의 위치 값이다.

자, 그럼 두번째 라인은 4-7 까지이고, 3번째는 8-11 까지가 된다. 네번째 라인은 12-15 가 되는데 13 위치를 보면 TCP Flags 라고 되어 있다. 그렇다 바로 플래그 값을 뜻하는 것으로 대표적인 몇 가지 값을 보면 아래와 같다:

F : FIN
S : SYN
R : RESET
P : PUSH
A : ACK

TCP 3-way Handshake 라는 것을 들어보았다면 위의 용어가 익숙할 것이다. 13 위치가 플래그 라는 것은 알았는데 TCP[13] 의 '== 2' 은 무었일까? == 는 같다는 의미로 쉽게 알 수 있고, 2는 설정된 비트 값이다. 좀더 자세히 알아보도록 하겠다. 1바이트는 8 비트로 구성되어 있다. 그래서 위 헤더의 한 라인씩은 4바이트로 이루어져 있고 13 번째 위치 부분도 1바이트 구성이다. 그럼 8비트 구성일텐데, 위 플래그들을 보면 8개이다. 즉, 각 플래그는 한 비트씩 차지하고 있는 것이다. 좀더 자세하게 표현하면 아래와 같다 :

                  |C|E|U|A|P|R|S|F|
                |---------------|
                |0 0 0 0 0 0 1 0|
                |---------------|
                |7 6 5 4 3 2 1 0|

제일 아래 부분은 0-7 까지 비트를 표현한 것이고 그 윗 부분은 Set 된 비트를 의미한다. S 부분이 Set 되어 있는 상태이다. 그럼 이걸 다시 십진수로 변환해 보면 나머지는 다 0 이고 한 군데만 1 이므로 1*2 인 2가 되는 것이다. 차례로 각 계산을 세부적으로 표현하면 다음과 같아진다.

   7     6     5     4     3     2     1     0
0*2 + 0*2 + 0*2 + 0*2 + 0*2 + 0*2 + 1*2 + 0*2  =  2

이제 느낌이 팍 오는가? SYN 값이 0x02 가 되는 것이다. 그럼 TCP[13] == 2 의 의미를 다시 정리해 보면,
TCP 헤더의 13번째 Octet 위치는 TCP Flags 를 나타내는 것이고 2 는 SYN 를 표현한 것이다.

바로 TCP 패킷중 SYN 패킷만 해당하는 것을 탐지하고자 할때 사용할 수 있는 필터가 되는 것이다.


만약 PUSH 플래그를 잡고자 한다면 8 이 된다. 알고보면 어렵지 않은 부분인데, 이런 것을 모르고 해당
문법을 보게 되면 복잡함 부터 느껴지는 것은 당연하다. 이제 각 헤더의 어떤 부분도 여러분 스스로가 탐지해 낼 수 있게 된것이다.


다음번에는 패킷분석에 기본이 되는 TCP/IP 헤더 부분을 좀더 면밀히 살펴보고자 한다. 패킷분석의 기본이 되는 부분이지만, 의외로 처음 접하는 분들에겐 힘들어 보이는 부분이다. 헤더의 구성을 알게되면 패킷이라는 것에 대해 좀더 명확히 알 수 있으며, 이해가 훨씬 빨라진다. 한 패킷을 예로들어, OSI Layer 단계부터 시작해 TCP, IP 헤더까지 껴 맞춰보며 여러분들에게 명확한 이해를 제시하고자 한다.


패킷이 무엇이고, 통신이 어떻게 이뤄지며 패킷의 구성은 어떻게 이뤄지는지 이해가 잘 안된다면 꼭 보아야 할 내용이 될 것이다. 그럼 시작되는 그 날을 기약하며...



댓글 4개:

  1. 정말 도움되는 내용입니다. IP 패킷 헤더에 관한 질문이 있는데 도와주세요 ㅠㅠ

    답글삭제
    답글
    1. 질문 내용이 어떤 것인지 댓글로 남겨주세요~

      삭제
    2. 와이어샤크를 이용해서 IP패킷 헤더의 길이가 20바이트가 아닌 패킷들을 잡아내고자 해요.(Capture Filter기능을 이용해서요.)

      IP 패킷 헤더의 경우 첫번째 라인(0 ~ 3)에서 0인 부분, 즉, ip[0]에서 하위 4비트가 HELN(헤더의 길이를 결정하는 필드)필드인 걸로 알고 있어요.

      근데 글을 보니 패킷 헤더에 바이트단위로 밖에 접근할 수 밖에 없는것 같은데, 이 같은 경우 Filter에 어떻게 입력을 해야하나요..??

      ip[0] != 5 ...???? ㅠㅠ 질문이 이해가 가셨을지 모르겠네요

      삭제
    3. 즉, IP 패킷 헤더길이가 20바이트 아닌것을 잡고 싶다는 말씀이시죠. Caputure Filter 가 아닌 Display Filter 를 이용하면 참 쉽게 해결될 문제인데, Caputre 필터로 하면 조금 더 생각해 보아야 합니다. 말씀하신것과 같이 IP 헤더의 첫 부분은 Version 과 IHL 로 이루어져 있습니다. 버전이 4비트 IHL 이 4 비트 이용합니다. 그러면 이 값은 비트로 보면 01000101 이고 10진수로는 69 입니다. IPv4 트래픽 환경에서는 거의 이 값이 되죠. 자 그럼, 바로 이 값 이상으로 나오는 것을 대상으로 하면 됩니다.

      # tcpdump -i eth0 'ip[0] > 69'
      또는 ip[0] != 69 와 같이 하면 됩니다. 질문에 대한 답이 되나요? ^^

      요 내용을 좀더 풀어쓴 글을 한번 게시하도록 하겠습니다. 몇 가지 다른 예를 함께 겻들여서 말이죠.

      삭제