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 |