Layer 4 : UDP, TCP

        - 흐름 제어, 에러 제어 , . . .(TCP만 가지고 있는 기능이다.)

- 주소체계: 포트(port), well-known port

 

 

*  well-known port

  ssh: 22 //tcp

  telnet: 23 //tcp

  ftp: 20,21 //tcp

  http: 80 //tcp

  imap: 143 //tcp

  pop3: 110 //tcp

  mysql: 3306

  smtp: 25 //tcp

  NNTP : 119 //tcp

  HTTPS(SSL) : 443 //tcp

   

               dns: 53  //udp

  dhcp: 67,68 //udp

  SNMP:161,162 //udp

  TFTP: 69 //udp

 

TCP ( Transmission Control Protocol ) : 전송 제어 프로토콜

 

  - 신뢰기반

  - UDP에 비하면 느리다.

  - 수신을 했는지 안했는지 확인한다.

 

1). 출발지 포트(2바이트)

2). 도착지 포트(2바이트)

3). 시퀀스 넘버(4바이트) 

4). Acknowledge 넘버 (4바이트)    // 흐름제어 에러제어등을

                                                    하는 것들

5,6). tcp header length(4비트)& tcp flag     (2바이트)

7). 윈도우 사이즈(2바이트)

8). 체크섬(2바이트)

9). 긴급 포인트 | 더미(2바이트)

 

 

 

 

 

 

TCP 헤더

packet.py

 

 

 

 

 

sniffer.py

 

 

 

 

 

python3 tcp_sniffer.py 실행 시

UDP와는 다르게 한번 데이터를 보내면 저런식으로 많은 양이 스니퍼 된다(그래서 UDP보다 신뢰성이 높다.)

 

 

 

 

 

TCP sniffer 분석

 

 

 

 

tcp flag는 6개의 비트로 나누어져 있다.

 

      0   0 0 0  0  0

      U  A P R  S  F  

 

F - Finish(FIN)

S - Synchronize(SYN)

R - Reset(RST)

P - Push(PSH)

A - Acknowledegement(ACK)

U - Urgent(URG)

 

 

SYN(Synchronization:동기화) - S : 연결 요청 플래그

 

TCP 에서 세션을 성립할 때  가장먼저 보내는 패킷, 시퀀스 번호를 임의적으로 설정하여 세션을 연결하는 데에 사용되며 초기에 시퀀스 번호를 보내게 된다.

 

ACK(Acknowledgement) - Ack : 응답

 

상대방으로부터 패킷을 받았다는 걸 알려주는 패킷, 다른 플래그와 같

이 출력되는 경우도 있습니다.
받는 사람이 보낸 사람 시퀀스 번호에 TCP 계층에서 길이 또는 데이터 양을 더한 것과 같은 ACK를 보냅니다.(일반적으로 +1 하여 보냄) ACK 응답을 통해 보낸 패킷에 대한 성공, 실패를 판단하여 재전송 하거나 다음 패킷을 전송한다.

 

RST(Reset) - R : 제 연결 종료

재설정(Reset)을 하는 과정이며 양방향에서 동시에 일어나는 중단 작업이다. 비 정상적인 세션 연결 끊기에 해당한다. 이 패킷을 보내는 곳이 현재 접속하고 있는 곳과 즉시 연결을 끊고자 할 때 사용한다.

 

PSH(Push) - P : 밀어넣기(DATA)

 

TELNET 과 같은 상호작용이 중요한 프로토콜의 경우 빠른 응답이 중요한데, 이 때 받은 데이터를 즉시 목적지인 OSI 7 Layer 의 Application 계층으로 전송하도록 하는 FLAG. 대화형 트랙픽에 사용되는 것으로 버퍼가 채워지기를 기다리지 않고 데이터를 전달한다. 데이터는 버퍼링 없이 바로 위 계층이 아닌 7 계층의 응용프로그램으로 바로 전달한다.

 

URG(Urgent) - U : 긴급 데이터
Urgent pointer 유효한 것인지를 나타낸다. Urgent pointer란 전송하는 데이터 중에서 긴급히 전당해야 할 내용이 있을 경우에 사용한다. 긴급한 데이터는 다른 데이터에 비해 우선순위가 높아야 한다. 
 EX) ping 명령어 실행 도중 Ctrl+c 입력

 

FIN(Finish) - F : 연결 종료 요청
세션 연결을 종료시킬 때 사용되며 더이상 전송할 데이터가 없음을 나타낸다.



 

 

 

스니퍼에 뜨는 내용중 가장 첫 번째   

 

 

 

 

flag 

 0   0 0 0  1  0

U  A P R  S  F  

00:0c:29:ad:aa:91->00:0c:29:2c:c7:19
ethernet type: 0x800
192.168.6.125 : 51054 -> 192.168.6.124 : 13120
id: 13729 flag: 2 offset: 0
seq:923697176  ack:0
header length: 40
flag: 2      
동기화를 요청(TCP 3-way Handshake)

 

 

ISN( Initialized Sequence Number ) (클라이언트 번호)

   - 초기 시퀀스 번호(나만 아는 번호다.)

   - 운영체제의 의해서 랜덤하게 생성

 

 

flag 

0  1 0 0  1 0

U  A P R S F 

 

00:0c:29:2c:c7:19->00:0c:29:ad:aa:91
ethernet type: 0x800
192.168.6.124 : 13120 -> 192.168.6.125 : 51054
id: 0 flag: 2 offset: 0
seq:280830992 
ack:923697177  (서버 시퀀스 넘버)
header length: 40 flag: 18

동기화 요청에 의한 답신

        - 클라이언트의 시퀀스 넘버에 +1을 해서 돌려준다.

 

flag 

 0  1  0 0  0  0

 U  A  P R  S  F

 

00:0c:29:ad:aa:91->00:0c:29:2c:c7:19
ethernet type: 0x800
192.168.6.125 : 51054 -> 192.168.6.124 : 13120
id: 13730 flag: 2 offset: 0
seq:923697177  ack:280830993
header length: 32 flag: 16

   클라이언트 또한 시퀀스 넘버에 +1을 해서 돌려 준다.

 

이 전체 과정이 3-way handshake 라고 한다.

 

 

계속해서 보면,

 

 

flag 

 0  1   1 0  0  0

 U  A  P R  S  F

 

00:0c:29:ad:aa:91->00:0c:29:2c:c7:19
ethernet type: 0x800
192.168.6.125 : 51054 -> 192.168.6.124 : 13120
id: 13731 flag: 2 offset: 0
seq:923697177  ack:280830993
header length: 32 flag: 24

 

 

내가 서버에 hello 라는 5바이트를 보냈다.

 

 

flag 

 0  1   0 0  0  0

 U  A  P R  S  F

 

00:0c:29:2c:c7:19->00:0c:29:ad:aa:91
ethernet type: 0x800
192.168.6.125 : 13120 -> 192.168.6.124 : 51054
id: 21321 flag: 2 offset: 0
seq:280830993  ack:923697182
header length: 32 flag: 16

클라이언트에서 보낸 글자 수 + 클라이언트 식별 번호 가 된다.

 

 

 

 

 

 

 

 

[실습] TCP SYN패킷 만들기

 

vi tcp.py에 이부분만 추가

 

 

 

 

 

 

 

 

vi tcp_syn.py

 

 

 

 

 

 

 

TCP는 플래그에 따라서 다양한 통신이 존재 

 

1. 열린 포트에 대한 검색

 

1) half-open 방식(스텔스 방식)

     - 완벽히 세션을 맺지 않고 반 만 오픈한다는 뜻

     - 로그에 기록이 남지 않는다.

     - 열려 있는 경우: syn-ack로 응답이 온다.

     - 닫혀있는 경우:  rst-ack 

 

2). full-scan 방식

   - 세션을 완전히 맺는 방식

   - 로그에 기록이 남는다.

 

2. 닫힌 포트에 대한 검색

 

 - 닫혀 있는 경우에만 응답이 온다.

 

 - fin scan, null scan(플래그세팅x), x-mas scan(fin, psh, urg)

                      예전에 방화벽 우회로 사용

 

 

 

 

fin psh ,urg 로 닫힌 포트에 보냈을 때 반응 (열려있는 포트에보내면 답장안옴)

 

Raw 소켓으로 패킷을 보내는 것 자체가 공격으로 간주에 운영체제는 방어기법을 쓴다.

 

여기서 20으로 받는 Rst Ack 는 운영체제 자체에서의 방어 기법이다.

 

 

 

3. 호스트를 검색하는 방법

  - 보통은 ping을 사용

  - syn-ack 플래그를 이용 (ping으로 못하는 부분도 할 수 있다.)

 

 

이런식으로온다.

 

   

 

 

 

RST 패킷 차단

iptables -A OUTPUT -p tcp --tcp-flags rst rst -j DROP

 

 

 

'Network Security' 카테고리의 다른 글

VLAN  (0) 2019.01.21
IP  (0) 2019.01.17
UTP  (0) 2019.01.15
충돌도메인과 브로드캐스트 도메인  (0) 2019.01.14
OSI 7 계층  (0) 2019.01.11

+ Recent posts