컴퓨터 네트워크- TCP Session Tracker

하스코딩·2025년 3월 6일

1. 개요 및 목적

TCP Session Tracker는 우리가 인터넷을 사용하면서 네트워크에서 발생하는 TCP 세션을 추적해 각 세션의 상태,송수신 데이터,연결상태 등을 기록하고 분석하는 도구이다.

전체적인 구성은 크게 아래 3단계에 걸쳐 TCP Session Tracker를 만들어 볼 것이다.

  • 1단계: pc에서 오고가는 트래픽 모니터링 및 트래킹
  • 2단계: (모드1) 3-Way Handshake 및 데이터 스트림 나열
  • 3단계: (모드2) TCP 데이터 스트림 재조합

2. 단계별 구현 및 출력 결과 분석

2.1 pc에서 오고가는 트래픽 모니터링 및 트래킹

  • 우선 세션 목록을 명확히 하기 위해 내 사설 ip를 찾아 출력하고, 이 ip를 기준으로 연결된 세션들을 캡쳐해 출력하려고 했다.
  • TCP에서는 handshaking을 마치게 되면 이를 ‘establish’또는 ‘세션이 맺어졌다’라고 한다. 이렇게 맺어진 세션들은 활성화되었다가, 4-way handshaking을 통해서 끊어지기도 한다.
  • 만약 새로운 세션이 맺어진다면 세션 리스트에 추가하고 번호를 매기며, Active 상태로 설정해준다.
  • 그리고 FIN또는 RST플래그가 활성화되면, 이를 감지해 끊어진 세션으로 간주해 closed 상태로 바꿔준다.
    세션들의 나열 형식은 “번호)src ip : src port -> dest ip: dest port (활성화 여부)”로 설정했다. 이때 엔터키를 눌러 캡처를 종료하도록 했다.

2.2 3-Way Handshake 및 데이터 스트림 나열

  • 앞서 출력된 세션 번호 중 하나를 선택하고, 두 가지 모드 중 하나를 선택한다.
    그 중 모드 1(3-Way Handshake 및 데이터 스트림 나열)을 선택한다.
  • 이때 해당 세션의 3-way handshake가 먼저 출력되고,데이터 스트림들이 출력된다.
  • 데이터 스트림은 C(client)->S(server)로 방향을 명시하여 페이로드 크기와 함께 출력하도록 했다.
  • 또한 중복된 패킷들은 제거하고, 페이로드 크기가 0인 패킷들도 제거해 출력하니 훨씬 깔끔해 졌다.

2.3 3단계.TCP 데이터 스트림 재조합

  • http 테스트 사이트(http://www.testingmcafeesites.com/)를 사용했다. 그리고 세션 목록을 출력해주었다.

  • 이번엔 세션 번호를 입력한 후 모드 2(TCP 데이터 스트림 재조합)를 선택한다.

  • 모드2는 해당 세션에 대해 패킷을 순서대로 재조립하고, raw 데이터를 출력하여 실제 전송된 데이터 내용을 보여준다. 이때 사람이 읽을 수 있는 텍스트로 디코딩해줬다.

  • HTTP 응답 데이터
    (데이터의 타입=html, 데이터의 크기=522byte 등 기타 보안 및 캐싱 관련 정보)

  • HTML 본문
    (html, head, <body 태그로 구성된 웹 페이지의 HTML 내용)

  • HTTP 요청 데이터
    (HTTP 메소드 GET으로 /testcat_al.html 요청)

3. 주요 소스코드 분석

3.1 사설 IP 주소 확인 (get_private_ip)

  • 자신의 사설 IP 주소를 반환하여 패킷 필터링 및 세션 추적에 사용한다.
  • UDP 소켓을 이용해 공용 DNS 서버(8.8.8.8)와 연결하여 송신 IP를 추론한다.

3.2 TCP 세션 상태 업데이트 (update_session_state)

  • 캡처된 패킷의 TCP 플래그(SYN, FIN, RST)를 확인하여 세션 상태를 결정한다.
  • 그리고 그 결과로 "Active" 또는 "Closed" 상태를 반환한다.

3.3 패킷 처리 (process_packet)

  • 실시간으로 캡처된 패킷을 분석하여 TCP 세션 데이터 저장소(sessions)에 추가한다.
  • 송수신 IP와 포트를 기반으로 세션을 식별한다.

3.4 3-way handshake 및 데이터 스트림 정보 출력(display_session_details)

  • 선택된 세션의 3-Way Handshake 상태와 데이터 스트림 정보를 출력한다.

3.5 TCP 데이터 스트림 재조합 (reassemble_tcp_stream)

  • 선택된 세션의 TCP 데이터 스트림을 SEQ 번호 기준으로 재조합하여 출력한다.
  • UTF-8로 디코딩된 텍스트를 출력하거나 디코딩 실패 시 원시 데이터를 출력한다.

4. 회고

  • 사실 처음에 ip를 사용자의 ip로 한정해 출력해보기 전에는 너무 난잡한 출력에 헤매기만 했었다.
  • 그리고 handshake도 제대로 출력하기까지 굉장히 오랜 시간이 걸렸다.
  • 비교적 마지막 모드2의 구현에 있어서는 금방 해냈던 것 같아 다행이었다.
  • 이제 이 소스코드를 사용해 사용자의 ip를 기준으로 맺어지는 세션들을 모두 트래킹하여 목록으로 출력할 수 있게 되었다.
  • 그리고 더 자세히 알고 싶은 세션의 번호를 입력하고, 두 가지 모드 중 하나를 선택하여 원하는 데이터 스트림 형태를 볼 수 있도록 하는데 성공했다.

0개의 댓글