TCP 서버를 열어놓고 TCP 클라이언트로 데이터를 보내고 스니퍼로 확인해본다.
192.168.4.117의 33333번 포트로 데이터를 보내고 받는다.
'bugday' 라는 데이터를 전송하는데 총 10번의 패킷을 주고 받는것을 확인할 수 있다.
패킷을 하나하나 분석해보자.
----------------------------3 way handshake 시작-------------------------
첫번째 패킷b'\x00\x05f#0\x19\x00\x0c)o\xad\x1a\x08\x00E\x00\x00<\x90Z@\x00@\x06\x18\xf6\xc0\xa8\x0b\xa6\xc0\xa8\x04u\xda\x1c\x825\xa6\x90\x87\xdf\x00\x00\x00\x00\xa0\x029\x08\xdb\x1a\x00\x00\x02\x04\x05\xb4\x04\x02\x08\n\x00+\x17\x85\x00\x00\x00\x00\x01\x03\x03\x06'
ethernet 헤더(14)
b'\x00\x05f#0\x19\x00\x0c)o\xad\x1a\x08\x00'
IP 헤더(20)
b'E\x00\x00<\x90Z@\x00@\x06\x18\xf6\xc0\xa8\x0b\xa6\xc0\xa8\x04u'
TCP 헤더(20)
b'\xda\x1c\x825\xa6\x90\x87\xdf\x00\x00\x00\x00\xa0\x029\x08\xdb\x1a\x00\x00'
TCP 헤더 options(20)
b'\x02\x04\x05\xb4\x04\x02\x08\n\x00+\x17\x85\x00\x00\x00\x00\x01\x03\x03\x06'
192.168.11.166 -> 192.168.4.117
tcp.srcport : 클라이언트의 임의의 포트 값
tcp.dstport : 서버가 지정한 포트 값
tcp.seqnum : 패킷이 잘 도착했나 acknum을 받기위한 4바이트 크기의 임의의 값
tcp.acknum : 처음 보내는 패킷이므로 0의 값을 갖는다.
tcp.headerlen_flag : 헤더의 크기는 options필드까지 합쳐서 40byte
플래그는 '000000010'로 SYN(동기화요청)
두번째 패킷
\x825\xda\x1c\x1c\x1b\xb5\x0f\xa6\x90\x87\xe0\xa0\x128\x90\x11S\x00\x00\
192.168.4.117 -> 192.168.11.166
tcp.seqnum : 클라이언트에게 패킷이 잘 전송되었나 acknum을 받기위해 서버 seqnum을 생성
tcp.acknum : 클라이언트에게 SYN(동기화요청)을 받았다는 의미로 클라이언트의
seqnum에 1을 더한 값을 acknum으로 돌려준다.
tcp.headerlen_flag : 플래그 '010010' 으로 ACK/SYN(응답과요청)을 의미
세번째 패킷
192.168.11.166 -> 192.168.4.117
tcp.seqnum : 서버에서 응답한 acknum를 그대로 seqnum으로 전송
tcp.acknum : 서버 seqnum에 1을 더한 값을 acknum으로 돌려준다.
tcp.headerlen_flag : 플래그 '010000' 으로 ACK(응답)을 의미
-----------------------------------3 way handshake 끝----------------------
-----------------------------------데이터 전달 시작--------------------------
네번째 패킷
192.168.11.166 -> 192.168.4.117
tcp.seqnum : 다시 클라이언트가 보내므로 seqnum이 같음
tcp.acknum : 다시 클라이언트가 보내므로 acknum이 같음
tcp.headerlen_flag : options필드가 12바이트(데이터제외)
이때 options필드 뒤에 전달할 데이터가 붙음
플래그 '011000' PSH/ACK로 (데이터전달/응답)
다섯번째 패킷
192.168.4.117 -> 192.168.11.166
tcp.seqnum : 클라이언트에게 받은 acknum을 그대로 seqnum으로 전송
tcp.acknum : 클라이언트 seqnum + 데이터의크기(6)
tcp.headerlen_flag : '010000' ACK(응답)
여섯번째 패킷
192.168.4.117 -> 192.168.11.166
tcp.seqnum : 다시 서버가 보내므로 seqnum이 같음
tcp.acknum : 다시 서버가 보내므로 acknum이 같음
tcp.headerlen_flag : 플래그 '011000' PSH/ACK로 (데이터전달/응답)
일곱번째 패킷
192.168.11.166 -> 192.168.4.117
tcp.seqnum : 서버에게 받은 acknum을 그대로 seqnum으로 전송
tcp.acknum : 서버의 seqnum + 데이터의크기(6)
tcp.headerlen_flag : 플래그 '010000' ACK(응답)
-----------------------------------데이터 전달 끝---------------------------
-----------------------------------연결 종료 시작--------------------------
여덟번째 패킷
192.168.4.117 -> 192.168.11.166
tcp.seqnum : 클라이언트가 보낸 acknum을 그대로 seqnum으로 전송
tcp.acknum : 클라이언트가 보낸 seqnum을 그대로 acknum으로 전송
tcp.headerlen_flag : 플래그 '010001' ACK/FIN(응답/연결종료)
아홉번째 패킷
192.168.11.166 -> 192.168.4.117
tcp.seqnum : 서버가 보낸 acknum을 그대로 seqnum으로 전송
tcp.acknum : 서버의 seqnum + 1 해서 acknum으로 전송
tcp.headerlen_flag : 플래그 '010001' ACK/FIN(응답/연결종료)
열번째 패킷
192.168.4.117 -> 192.168.11.166
tcp.seqnum : 클라이언트가 보낸 acknum을 그대로 seqnum으로 전송
tcp.acknum : 클라이언트의 seqnum + 1 해서 acknum으로 전송
tcp.headerlen_flag : 플래그 '010000' ACK(응답)
-----------------------------------연결 종료 끝------------------------
'Hacking > Network' 카테고리의 다른 글
[21일차] ACK 패킷까지 보내서 ESTABLISHED 상태 만들기 (0) | 2017.10.25 |
---|---|
[20일차] SYN 패킷 만들어서 보내고 ACK/SYN 받아오기 (0) | 2017.10.24 |
[18일차] TCP 헤더 분석 (0) | 2017.10.23 |
[17일차] UDP 체크섬 계산법과 패킷 보내기 (0) | 2017.10.19 |
[16일차] IP 패킷 분할해서 핑 보내기 (0) | 2017.10.15 |
WRITTEN BY