본문 바로가기

IT/WinpcapProgramming

windump를 사용하여 TCP/IP 패킷 분석하기

/* 
written by kaspy (kaspyx@gmail.com)
*/ 


windump를 이용하여 tcp 패킷을 분석해 보았다. 

아래와같은 명령어로 실행하였다.

기본적인 사용법과 다운로드는 여기 링크 참조!!  -> Link

(1번 네트워크 인터페이스의 7778번 포트를 감청)


서버쪽에서는 nc -l  -p 7778 을 사용하여 7778번 포트를 열어 접속을 기다리게 하였다.(리눅스 서버)

클라이언트에서는 nc를 사용하여 7778번 포트에 접속한다음 hello 라는 문자열을 보내고 ctr + c 하여 접속을 끊었다.(윈도우 클라이언트)


TCP 통신 패킷 분석

tcp/ip 통신은 안정형 통신 방법으로 데이터를 주고 받을때마다 ACK 및 S/N 번호로 데이터가 오고가는 순서를 보장할수있다. 일명 3 Way Handshake 기법인데 windump 를 통해 패킷을 분석해 보았다.

1) 연결 할때

우선 내컴퓨터의 네트워크 인터페이스 카드에 대한 정보는 아래와 같다.

(mac 주소 및 IP 주소)

nc를 이용하여 접속했을때 나온 패킷 덤프는 아래와 같다.


Ethernet header (빨간색 박스)


Dest addr(6 byte) => 00:09:97:c7:26:07

Src addr(6 byte)  => 00:24:be:66:ef:b8

Type ( 2byte ) => 0x0800 (IP packet)

 

IP header (이어서 빨간색 박스)


     version(4 bit)+header length(4 bit)+type of service(8 bit)+total length(16 bit)

    +identification(16 bit)+flags(3 bit)+fragment offset(13 bit)

    +time to live(8 bit)+protocol(8 bit)+header checksum(16 bit)

    +source IP address(32 bit)

    +dest IP address(32 bit)


version(4 bit)+header length(4 bit) => 0x45

0100 0101(2) 여기서 0100 header version : 4, header length: 0101, 5

type of service => 0

total length => 0x30

idectification(2 byte) => 0x3803

flags (3bit) => 0x04 : 패킷을 분할하지 않겠다는 뜻, fragment offset(13bit)=>패킷 조각 오프셋: 0x0

time to live(1 byte) => 0x80 TTL: 128

protocol( 1byte) => 0x06 : TCP 패킷이라는 뜻

check sum(2byte) = 0x0000

source IP address( 4 byte) => a5 f6 43 d3 => 해당 헥스 값을 10진수로 바꾸면 IP주소가됨

0xaf : 165 0xf6: 246 0x43: 67 0xd3: 211

dest IP address(4 byte) => a5 f6 0c d7

0xaf : 165 0xf6: 246 0x0c :12 0xd7: 215

 

TCP Header (노란색 박스)


source port number(16)+dest port number(16)

 + sequence number(32)

 + acknowledgment number(32)

 + header length(4)+reserved(6)+URG+ACK+PSH+RST+SYN+FIN+window size(16)

 + TCP checksum(16)+urgent pointer(16)

 

sequence number=ISN(Initial Sequence Number)

                  + (# of bytes sent so far in this tcp connection)

acknowledgment number=next sequence number expected from the other part

 

source port number (2 byte) => 0x b6 8b : 46731

dest port number (2 byte) => 0x 1e 62 : 7778

sequence number (4 byte) => 0x f1 01 c7 00 : 4,043,425,536

acknowledgment number (4 byte) => 0x00 00 00 00

length(4)+reserved(6)+URG+ACK+PSH+RST+SYN+FIN =>

 

0x70 02 => 0111 0000 0000 0010 (2)

header length( 4bit ) => 7 (4 바이트 단위 이므로 * 4) : 28


- Control flag bit 정보

 URG

 ACK

PSH 

 RST

SYN

 FIN

flag bit ( 6 bit) => 00 00 10 SYN 패킷

 

window size (2 byte) => 0x2000 ( 8192)

check sum ( 2 byte) => 0x9cb9 ( 40121)

urgent pointer(2 byte) => 0x00

초록색 박스

클라이언트에서 sequence number 0xf101c700로 서버에게 보냈을 때 다시 서버에서는 sequence number +1을 하여 acknowledgment number(0xf101c701)을 보내 주었다.

서버에서는 Code bit 7011 Code bit( 01 00 10)으로 표현할수 있는데 이는 SYN/ACK 를 다시 클라이언트에게 응답을 해줌

주황색 박스

이후 클라이언트는 서버에서 보내준 sequence number(0x46623e05) +1을 하여 acknowledgment number(0x46623e05)을 보내어줘서 잘 받았다고 알려주고 Code bit 01 00 00 패킷(ACK)을 보내주고 이제 통신을 하기 위한 3 Way HandShake의 절차를 마쳤음.


2) 데이터 전송 하고 연결을 끊을때

Dest addr(6 byte) => 00:09:97:c7:26:07 (서버)

Src addr(6 byte)  => 00:24:be:66:ef:b8 (클라이언트)

Type ( 2byte ) => 0x0800 (IP packet)

 Control flag bit 정보

 URG

 ACK

PSH 

 RST

SYN

 FIN

 화면에서 유심히 봐야 할 내용을 박스로 쳤는데, 파란 박스는 SequenceNumber Acknowledeg Number 그리고 빨간 박스는 데이터, Flag 비트는 노란색으로 표시 하였다.

1 패킷을 보내는 것은 클라이언트 hello라는 내용을 gets로 입력받아서 서버에게 보내주는 패킷 내용입니다. SequenceNumber 0xf10f7c01로 보내 주었고, 플래그 비트는 011000 으로 표시 될수 있는데 이전 패킷을 잘 받았다는 표시 ACKPSH : Push.  Buffer를 따로 플래그로 두워 보내는데, 채워지는것을 기다리지 않고 데이터를 전달한다는 뜻으로 해석된다.

2 패킷은 1번 패킷을 잘받았다는 플래그비트 ACK을 클라이언트에게 보내주며 Acknowledeg Number는 클라이언트에서 보내어준 SequenceNumber 0xf10f7c01에서 클라이언트에게 받은 데이터의 개수(5)를 더해서 0xf10f7c06을 보내어 주었다.

3 패킷은 클라이언트가 이제 접속을 종료하겠다는 패킷을 보내준 내용플래그 비트가 010001으로 ACK FIN 플래그 비트가 셋팅 되어 있습니다.

  4 패킷은 서버가 이제 클라이언트의 종료를 잘받았다고 ACK 플래그를 보내주고 접속을 서로 끊음.