TCP 헤더 / 클래스 정의에 대해서 정리한다.
L4: UDP, TCP
- 흐름제어, 오류제어, ...
- 주소체계: 포트(port), well-known port
* well-known port
ssh: 22
telnet: 23
ftp: 21
dns: 53
http: 80
imap: 143
pop3: 110
mysql: 3306
...
- 기본 포트이긴하지만 서비스 설정에 따라서 달라질수 있다.
- 리눅스는 /etc/services에서 well-known port 확인 가능하다.
TCP( Transmission Control Protocol ): 전송 제어 프로토콜
- 신뢰기반
- UDP에 비하면 느리다.
1). 출발지 포트(2바이트)
2). 도착지 포트(2바이트)
3). 시퀀스 넘버(4바이트)
4). Acknowledge 넘버(4바이트)
* 3, 4번 필드를 통해서 흐름제어, 오류제어, ...를 한다.
5,6). tcp header length(4비트) & tcp flag(6비트) (2 바이트)
( 나머지 6비트는 예약된 필드이다 )
7). 윈도우 사이즈 (2바이트)
8). 체크섬 (2바이트)
9). 긴급 포인트 | 더미 (2바이트)
* URG flag의 경우 긴급 포인트로 사용되고 아닌경우는 20바이트를 채우기위한 패딩 용도로 사용된다.
* TCP 헤더 길이는 가변적이다.
- tcp.py 클래스 정의
tcp.py
import struct
class Tcp:
def __init__( self, raw=None ):
if raw != None:
self._src = raw[:2]
self._dst = raw[2:4]
self._seq = raw[4:8]
self._ack = raw[8:12]
self._len_and_flag = raw[12:14]
self._window_size = raw[14:16]
self._chksum = raw[16:18]
self._point_or_dummy = raw[18:20]
else:
self._len_and_flag = b'\x00\x00'
@property
def header( self ):
return self._src + self._dst + self._seq + self._ack + self._len_and_flag + \
self._window_size + self._chksum + self._point_or_dummy
@property
def src( self ):
(src,) = struct.unpack('!H', self._src)
return src
@src.setter
def src( self, port ):
self._src = struct.pack('!H', port)
@property
def dst( self ):
(dst,) = struct.unpack('!H', self._dst)
return dst
@dst.setter
def dst( self, port ):
self._dst = struct.pack('!H', port)
@property
def seq( self ):
(seq,) = struct.unpack('!L', self._seq)
return seq
@seq.setter
def seq( self, seq ):
self._seq = struct.pack('!L', seq)
@property
def ack( self ):
(ack,) = struct.unpack('!L', self._ack)
return ack
@ack.setter
def ack( self, ack ):
self._ack = struct.pack('!L', ack)
@property
def length( self ):
(len,) = struct.unpack('!H', self._len_and_flag)
len = (len & 0xFF00) >> 8
return len
@length.setter
def length( self, len ):
(flag,) = struct.unpack('!H', self._len_and_flag)
flag = flag & 0x00FF
@property
def flag( self ):
(flag,) = struct.unpack('!H', self._len_and_flag)
flag = flag & 0x00FF
return flag
@flag.setter
def flag( self, flag ):
(len,) = struct.unpack('!H', self._len_and_flag)
len = (len & 0xFF00) << 8
tmp = len + flag
self._len_and_flag = struct.pack('!H', tmp)
@property
def window_size( self ):
(window_size,) = struct.unpack('!H', self._winodw_size)
return window_size
@window_size.setter
def window_size( self, size ):
self._window_size = struct.pack('!H', size)
@property
def chksum( self ):
(chksum,) = struct.unpack('!H', self._chksum)
return chksum
@chksum.setter
def chksum( self, chksum ):
self._chksum = struct.pack('!H', chksum)
@property
def point_or_dummy( self ):
point_or_dummy = struct.unpack('!H', self._point_or_dummy)
return point_or_dummy
@point_or_dummy.setter
def point_or_dummy( self, pd ):
self._point_or_dummy = struct.pack('!H', pd)
'프로그래밍 > NETWORK HACKING' 카테고리의 다른 글
[네트워크 보안] TCP 포트 스캔 / TCP SYN 패킷 전송 (0) | 2017.07.14 |
---|---|
[네트워크 보안] 스니퍼를 이용한 TCP 이해 (0) | 2017.07.12 |
[네트워크 보안] UDP를 이용한 DDOS - UDP Flooding (0) | 2017.07.05 |
[네트워크 보안] udp 체크섬 계산 / 포트 스캐닝 (0) | 2017.07.04 |
[네트워크 보안] IP Fragment( 단편화 ) (0) | 2017.07.02 |
댓글