본문 바로가기

보안

보안기사 - TCP, UDP

TCP


  • Connection Oriented Protocol (연결 지향 프로토콜)
    물리적으로 전용회선이 연결되어 있는 것처럼 가상의 (논리적인) 연결통로를 설정해서 통신하는 방식 = 가상회선방식(Virtual Circuit)
    논리적 연결통로를 통해 데이터를 주고받음으로써 데이터의 전송순서를 보장 = 순서제어(Sequence Control)
    Stream 기반의 전송방식 (데이터를 정해진 크기로 전송하는 것이 아니라 임의의 크기로 나누어 연속해서 전송)

  • Reliabe Protocol (신뢰할 수 있는 프로토콜)
    1. Flow Control (흐름 제어)
      상대방이 받을 수 있을 만큼만 데이터를 효율적으로 전송
      Sliding window 제어 방식 사용 (상대방이 수신 가능한 크기(window size) 내에서 데이터를 연속해서 전송하는 방식. 매 segment 전송 시마다 ACK을 수신한 후 전송하면 RTT가 길어질 경우 throughput이 매우 떨어지므로 효율적으로 전송하기 위해 상대방이 받을 수 있는 범위 내에서 연속적으로 전송)
    2. Error Control (오류제어)
      오류나 누락 발생 시 재전송을 수행하여 데이터의 오류나 누락이 없는 안전한 전송을 보장
    3. Congestion Control (혼잡제어)
      네트워크의 혼잡정도에 따라 송신자가 데이터 전송량을 제어
      혼잡정도는 데이터의 손실 발생 유무로 판단 (누락 발생시 네트워크 혼잡한 상태로 판단하여 전송량 조절)

TCP 프로토콜 구조



필드명 설명
Source Port 출발지(송신) 포트 번호
Destination Port 목적지(수신) 포트 번호
Sequence Number 송신 데이터 순서 번호 (첫번째 바이트의 순서번호) -> 순서제어
초기 순서번호(ISN)은 0이 아니라 임의의 수를 할당해서 사용
Acknowledgment Number 상대방이 다음에 전송할 순서 번호 (ACK와 함께 해당 필드에 상대가 다음에 전송할 순서 번호를 담아서 전송)
HLEN 헤더 길이. 4byte 단위로 표시. *기본헤더 20bytes (+ 옵션 헤더 최대 40bytes)
Reserved 사용X
Control Flags URG (Urgent pointer is valid) : 긴급 데이터 전송
ACK (Acknowledgment is valid) : 수신확인응답(ACK) 설정
PSH (Request for Push) : 송수신 버퍼에 있는 데이터를 즉시 처리
RST (Reset the connection) : 연결 중단 (강제종료)
SYN (Synchronize sequence numbers) : 연결 설정
FIN (Terminate the connection) : 연결 종료 (정상종료)
Windows Size 수신측에서 송신측에 보내는 Receiver window size. 수신버퍼의 여유 공간 크기 -> 흐름 제어
송신측에서는 상대방의 윈도우 사이즈 범위내에서 수신측의 ACK을 기다리지 않고 연속적으로 전송 => sliding window 제어방식
Checksum 헤더 포함 전체 segment에 대한 오류 검사 위한 필드
Urgent Pointer 긴급 데이터(URG 플래그 설정) 포함한 경우 사용하는 필드로 긴급 데이터의 위치값을 담는다
  • 포트 분류 방식
    포트는 상위 어플리케이션/서비스/소켓을 식별하기 위한 식별자
    IANA 기구를 통해 관리

    • 사용 목적
      1. well-known port (0~1023) : 잘 알려진 서비스에 예약된 포트 (FTP - 21/tcp, TELNET - 23/tcp, HTTP - 80/tcp)
      2. registered port (1024~49151) : 제조사가 IANA에 용도를 등록해서 사용 (MS-SQL - 1433/tcp, Oracle - 1521/tcp, MySQL - 3306/tcp)
      3. dynamic port (49152~65535) : 일반적으로 클라이언트 포트로 사용
    • 사용 권한
      1. privileged port (0~1023) : 관리자 권한으로 사용 가능
      2. unprivileged port (1024~65535) : 일반 사요자 권한으로 사용 가능

TCP 분할(Segmentaion)과 재조합(Reassembly)



  • MSS (Maximum Segment Size)
    TCP 네그먼트 데이터부의 최대 바이트수를 의미
    연결 설정과정에서 상호간에 MSS 정보를 주고 받음
    Frame의 MTU에 영향을 받는다 (MSS = MTU - IP헤더 - TCP헤더)
    Application 계층에서 전달된 데이터는 TCP 계층에서 MSS 크기에 따라 분할 발생, 분할된 세그먼트는 수신측에서 재조합되어 application 계층으로 전달

연결 설정 과정 (3-way handshake)



  1. 1단계
    최초 클라이언트는 서버와 연결 설정을 위한 연결 요청 패킷(SYN 패킷)을 전송
    'active open' - 연결 요청을 위해 능동적으로 포트를 열고 있는 상태
    'passive open' - 연결 요청을 수용하기 위해 수동적으로 포트를 열고 있는 상태
    SYN은 상호간에 순서 번호를 동기화하자는 의미(synchronize)
    최초 SYN 패킷을 보낸 TCP(소켓) 상태를 'SYN_SENT' 상태라 한다

  2. 2단계
    클라이언트의 연결 요청(SYN 패킷)에 대한 수신확인응답(ACK)과 함께 서버에서 클라이언트로 연결 요청(SYN 패킷)을 보내 상호간에 연결 요청 수행
    ACK를 하게 되면 반드시 ACK number를 설정하는데 그 의미는 상대방이 다음에 보낼 패킷의 순서번호를 의미
    상대방의 SYN 패킷을 수신한 TCP(소켓) 상태를 'SYN_RECEIVED' 상태라 한다

  3. 3단계
    서버의 연결요청(SYN 패킷)에 대해 수신확인응답(ACK)을 전송한 후 최종적으로 연결 설정이 완료 된다
    연결 설정이 완료되면 TCP(소켓) 상태는 'ESTABLISHED' 상태가 된다

데이터 송수신 과정

재전송(Retransmission) 과정



TCP는 모든 세그먼트 전송 시마다 재전송 타이머가 동작
재전송 타임아웃(Retrasmission Time Out) 동안 상대로부터 ACK 응답이 없으면 송신자는 해당 패킷이 누락된 것으로 판단하여 재전송
혼잡제어 관정에서 재전송 타이머 만료에 의한 재전송이 발생하는 상황은 매우 혼잡한 상태로 판단 (-> 전송량 확 줄이고 점점 높임)

빠른 재전송(Fast Retransmission) 과정



TCP는 수신측이 기대했던 순서번호가 아닌 그 이후 순서 번호의 세그먼트를 수신하면(일부 세그먼트의 손실/지연 발생이나 순서가 맞지 않는 상황) 즉시 기대하는 순서 번호의 세그먼트를 요청하는 ACK 패킷을 전송
클라이언트는 중복(Duplicate) ACK가 두번 발생할 때까지는 일시적으로 서버에 전달한 세그먼트의 순서가 맞지 않는 상태로 판단
세번 발생하면 해당 세그먼트가 누락된 것으로 판단하여 재전송을 수행
재전송 타임아웃 발생 이전에 중복 ACK가 세 번 발생하면 즉시 재전송을 수행하므로 이를 빠른 재전송이라 한다
혼잡제어 관점에서는 재전송 타이머 만료에 의한 재전송에 비해 덜 혼잡한 상태로 판단 (-> 전송량 조금 줄임). 이는 일부 세그먼트의 누락은 발생했지만 나머지 세그먼트는 정상적으로 수신되었기 때문

연결 종료 과정 (4-way handshake)



  1. 1단계
    클라이언트는 서버와의 연결 설정을 종료하기 위한 연결 종료 패킷(FIN + ACK 패킷)을 전송
  2. 2, 3단계
    클라이언트의 연결 종료 요청에 대한 수신확인응답(ACK) 전송
    서버는 해당 서버 어플리케이션에서 TCP 연결 종료를 할 때까지 대기한 후 종료되면 클라이언트에 연결 종료 패킷(FIN + ACK 패킷)을 전송
  3. 4단계
    서버의 연결 종료 패킷을 수신한 클라이언트는 즉시 연결을 종료하는 것이 아니라 서버에 마지막 ACK를 보낸 후 2MSL(Maximum Segment Lifetime) 시간 동안 대기
    이는 마지막 ACK응답이 안전하게 상대에게 전송됨을 보장하기 위함. 만약 서버가 마지막 ACK를 수신하지 못했다면 FIN+ACK 재전송이 발생할 것이고 이를 처리하기 위해 일정 시간 대기

연결 요청 거부 (강제 종료)



클라이언트가 TCP 연결을 위해 SYN 요청을 전송했으나 서버에 해당 포트가 준비되어 있지 않으면, RST + ACK 패킷을 클라이언트에 전송하여 연결 요청을 거부
RST + ACK 패킷을 수신한 클라이언트 TCP는 즉시 종료(CLOSED) 상태가 됨

연결 중단 (abort)



연결상태에 있는 클라이언트가 연결을 즉시 중단해야할 필요가 있을 경우 'RST + ACK' 또는 'RST' 패킷을 서버에 전송
이를 수신한 서버 TCP는 즉시 종료(CLOSED) 상태가 됨

연결 상태의 클라이언트가 연결을 즉시 중단해야할 필요가 있을 경우...
-> ACK flag 있는 패킷 받았으면 RST 만 설정하여 응답
-> ACK flag 없는 패킷 받았으면 RST+ACK 패킷으로 응답

Out-of-Path 모드 차단 장비가 활용하는 방식
: TAP 장비를 이용해 NW 흐름에 영향 없이 트래픽을 복제하는 방식 (연결 차단하고 싶으면 대량의 TCP RST 패킷을 양쪽(서버, 클라이언트)으로 날려 연결이 끊어지는 것처럼 만든다)

TCP Session Hijacking

TCP의 세션 관리 취약점을 이용한 공격
TCP는 연결 설정 과정을 통해 상호간에 세션을 생성한 후 다음 식별자를 통해 상호간에 인식
- 출발지 IP와 port, 목적지 IP와 port, Sequecne Number와 Acknowledgment Number
TCP 세션 하이재킹은 위와 같은 세션 식별정보를 공격자가 위조하여 세션을 탈취하는 공격

공격자는 정상적인 사용자의 출발지 IP와 Port로 위조하고 Sequence Number를 예측하여 세션을 탈취



  • 공격 시나리오
    1. 공격자는 클라이언트와 서버 사이에서 ARP 스푸핑을 통해 둘 사이의 TCP 식별정보를 탈취하기 위한 스니핑을 진행
    2. 패킷을 스니핑하던 공격자는 정상적인 클라이언트의 IP 주소로 위장한 TCP 패킷에 정상적인 클라이언트의 TCP 식별정보를 담아 서버로 전달
    3. 서버는 공격자의 위조된 패킷에 대해 정상 응답(ACK)을 준다. 해당 응답은 공격자뿐만 아니라 정상 클라이언트에게도 전달되고 클라이언트 입장에서는 데이터를 보내지 않았는데 ACK number가 증가된 응답을 받게 되는 상황이 발생
    4. 잘못된 응답(ACK number가 틀린)을 받은 정상 클라이언트는 이를 교정하기 위한 ACK를 전송
    5. 서버 입장에서는 정상 클라이언트가 보낸 잘못된 ACK 패킷을 다시 교정하기 위해 ACK 메시지를 전송
    6. 이러한 과정이 반복적으로 대량 발생하게 되는데 이를 'ACK Storm'이라 한다
      공격자에 의해 해당 세션의 Sequence #와 ACK #가 조작된 것이므로 정상 클라이언트와 서버 간에 아무리 교정을 위한 ACK를 보내도 이를 해결하지 못함
    7. 공격자는 최종적으로 정상 클라이언트에게 RST(강제종료) 메시지를 전달해 연결을 강제로 종료하고 자신은 서버와의 세션을 유지

참고 : https://darksoulstory.tistory.com/420

UDP


  • Connectionless Protocol (비연결형 프로토콜)
    논리적 연결 설정 과정이 없어 datagram 전송 시마다 주소 정보를 설정해서 전송
    데이터의 순차적 전송 보장X
    데이터를 정해진 크기로 전송하는 datagram 기반 전송방식 사용 (TCP는 stream)
  • Unreliable Protocol (신뢰할 수 없는 프로토콜)
    신뢰성있는 TCP와 달리 흐름제어, 오류제어, 혼잡제어 등을 수행하지 않음
    실질적으로 IP 기반에 포트 정보를 이용해 상위 송수신 어플리케이션을 식별해주는 역할 정도만 수행
  • 장점
    1. 단순, 가벼운 프로토콜, 빠른 전송 속도
    2. 비신뢰적이므로 대량 데이터의 송수신은 부적절하며 주로 한번의 패킷 송수신으로 완료되는 서비스에 많이 사용
      ex) DNS (53/udp), NTP (123/udp), DHCP (67, 68/udp)

UDP 프로토콜 구조



필드명 설명
Source Port 출발지 포트 번호
Destination Port 목적지 포트 번호
Total Length 헤더와 데이터부를 포함한 전체 길이
Checksum 전체 데이터그램에 대한 오류 검사위한 필드