본문 바로가기
프로그래밍/NETWORK HACKING

[네트워크 보안] TCP 헤더 / 클래스 정의

by B T Y 2017. 7. 12.
반응형

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)








반응형

댓글