- NEW초롱이의 하루
- kisa
- 길은 가면, 뒤에 있다
- C언어 예술가
- Zer0 day - Zer0 day
- Information Security
- Secure-EDU
- 앙큼한유채's 일상 Story
- Library of Ezbeat (잠정 폐쇄)
- The Factory
- 안드
- 모후모후의 커뮤니티
- 공학도의 잡다한 시선
- 안드2
- IT속에 코코아
- IP주소검색(whois)
- IP주소검색(좌표포함)
- 소프트웨어 경력 관리
- 해저 케이블 지도
- MAC주소검색
- IANA
- 포트번호검색
- 자신의IP확인
- 웹페이퍼캡처
- 나의패스워드보안등급
- 웹 취약점 분석
- IT용어정리
- GitHub
- 라이브러리 모음
- 웹마당넷
- 시스템콜참고
- BCD 변환
- 보안뉴스
- 코딩도장(C, Python)
- 백준알고리즘
- 코딩테스트 연습
- 웹 사이트 테스트
- 스크립트꾸미기
- ctf대회목록
- 전자신문
- hash 크랙
- CVE
- 도메인등록
- N클라우드
- BugBountyList
- 칼리공식사이트
- CR4FTING BOX
- 아스키코드 변환
- 웹 사이트 통계 및 평가
- PDF변환
- AWS 및 클라우드 정보
- 가상화 및 서버관련
- 티오리
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 안드로이드
- Shell script
- 자바
- JSP
- RaspberryPi
- Linux
- Python
- 메소드
- 클라우드
- API
- System
- 프로젝트
- ACL
- 네트워크
- LEVIATHAN
- 리눅스
- synology
- 쉘 스크립트 기초
- GPIO
- centos docker
- Java
- GUI
- nginx
- 쉘 스크립트
- 라즈베리파이
- docker
- Android
- 그라파나
- 쉘 스크립트 if문
- Tkinter
- Today
- Total
IT창고
Network TCP(Transmission Control Protocol) 본문
TCP 헤더에 대해 알아보겠습니다.
TCP헤더는 최소 20byte의 길이를 가집니다.
TCP헤더에서 중요하게 봐야할곳은 Seq_Num과 Ack_Num입니다. 이 두개가 세션을 표현하는 필드입니다.
파이썬 클래스로 정의하겠습니다.
==============================================================
==============================================================
TCP헤더를 만들었으므로 실제 TCP통신은 어떤 식으로 이루어지는지 알아보겠습니다.
tcp sniffer를 만들어 실제 TCP통신 내용을 확인해보겠습니다.
다른 리눅스PC(192.168.1.8)에서 TCP Server를 열어두고 대기한후 리눅스PC(192.168.1.9)에서 TCP 통신을 시도해봅니다.
데이터 hello를 보내고 다시 받으면 TCP Server는 종료됩니다.
클라이언트는 즉시 종료되지만 서버측은 완전히 종료되는데 약간의 시간이 걸립니다. 이 시간동안 사용했던 포트는 사용할수없습니다.
sniffer로 통신내용을 확인해볼수있었습니다. 아래의 내용에서 사용한 sniffer의 소스를 확인해볼수있습니다.
==============================================================
==============================================================
TCP는 데이터 하나를 전달하기 위해서 복잡한 작업을 하는데 TCP헤더 하나만으로도 제어가 가능합니다. TCP는 상태정보를 가지는데 Flag 상태를 확인할수있어야 합니다.
TCP Flag |
|||||||
CWR |
ECE |
URG(Urgent) |
Ack |
Push |
Reset |
Syn |
Fin |
Fin (연결 종료) : 세션 연결을 종료할때 사용합니다.
Syn(동기화, 연결요청) : 접속요청할때 가장먼저 보내는 패킷으로 TCP 접속시 시퀀스 번호를 랜덤으로 설정해 세션을 연결합니다.
Reset(재 연결) : 현재 패킷을 보내는 곳이 지금 접속하고 있는 곳과 접속을 끊을때 사용합니다.
Push : 데이터를 즉시 목적지까지 보내라는 뜻으로 받은 데이터를 즉시 목적지인 OSI 7Layer : Application계층으로 전송하도록 합니다.
Ack(응답) : 상대방으로부터 패킷을 받은걸 알려주는 패킷으로 다른 플래그와 같이 출력되는 경우도 있습니다.
URG(긴급 데이터) : Urgent Pointer가 유효한지 나타내는 것으로 예를들어 리눅스에서 어떤 작업을 할때 Ctrl + c 를 눌러 종료할때 사용이 됩니다.
위의 사진에 있는 TCP통신 내용중 시퀀스번호와 Ack번호에 대해 알아보겠습니다.
클라이언트
33408 -> 12000 Seq:1819572075, Ack:0 Flag: 00000010 -> 랜덤으로 시퀀스번호가 생성되어 서버로 전송됩니다. (Syn상태)
이떄 시퀀스 번호를 ISU번호 즉 초기 시퀀스 번호라고 합니다.
서버
12000 -> 33408 Seq:1310797527, Ack:1819572076 Flag: 00010010 -> 서버에서는 클라이언트에게 제대로 통신이 되었다면 받은 시퀀스에 +1를 해서 Ack로 보내고 서버의 시퀀스 번호를 랜덤으로 생성하여 같이 Syn+Ack로 보내줍니다.
여기까지하면 상태에서 ESTABLISHED가 됩니다.
3-way handshake
33408 -> 12000 Seq:1819572076, Ack:1310797528 Flag: 00011000
12000 -> 33408 Seq:1310797528, Ack:1819572081 Flag: 00010000
12000 -> 33408 Seq:1310797528, Ack:1819572081 Flag: 00011000
아까 클라이언트쪽 사진을 보면 'hello'라는 데이터를 TCP서버에게 넘겼습니다. 이 데이터가 어떻게 제대로 넘어갔는지 확인하려면 시퀀스 번호를 살펴보면 됩니다. hello는 5byte로 기존의 시퀀스 번호에 +5로 받으며 서버에게 제대로 받았다면 +5가된 상태로 Ack를 날려줍니다. Seq:1819572076 -> Ack:1819572081
33408 -> 12000 Seq:1819572081, Ack:1310797533 Flag: 00010000
33408 -> 12000 Seq:1819572081, Ack:1310797533 Flag: 00010001
4-way handshake
TCP 통신은 이 시퀀스 번호로 서로임을 증명하는데 만약 이 시퀀스 번호를 유추할수있다면 Sesion Hijacking을 할수있게 됩니다.
상대의 통신을 가로챌수있기 때문인데 현재는 보안으로 시퀀스 번호는 완전 랜덤하게 바뀌었고 RET Flag가 추가로 적용되었습니다. 현재는 상대의 TCP통신을 가로채는건 거의 불가능하다고 할수있습니다.
Tip. https://en.wikipedia.org/wiki/Transmission_Control_Protocol TCP정보
'보안 > Network' 카테고리의 다른 글
Network TCP패킷만들기(2) (0) | 2018.04.04 |
---|---|
Network TCP 패킷만들기(1) (0) | 2018.04.03 |
Network UDP Flooding (0) | 2018.03.30 |
Network UDP(User Datagram Protocol) (0) | 2018.03.29 |
Network IP Fragment(단편화) (0) | 2018.03.28 |