허가된 HTTPS 세션 읽기

WiresharkBeginner
지금 연습하기

소개

Lantern Room은 작은 종이 랜턴 워크숍을 운영합니다. 예약 애플리케이션은 HTTPS를 사용하므로 일반적인 캡처에는 예약 세부 정보 대신 암호화된 통신이 보입니다. 이 통제된 학습 서비스와 합성 방문자를 분석할 권한이 있습니다. 먼저 정상 참조 기록을 읽고, 새 방문을 직접 만들고 캡처합니다.

다른 허가된 분석가가 열 수 있는 실제 PCAPNG 파일과 별도의 TLS 키 로그를 만듭니다. 기본적인 Wireshark 탐색, 표시 필터, 간단한 터미널 입력과 경로 지식이 필요합니다. 프로그래밍이나 인증서 관리는 필요하지 않습니다. Desktop의 Terminal Emulator와 Wireshark 창을 사용합니다. 이 실습은 자체 파일과 로컬 서비스를 독립적으로 준비합니다. 소요 시간은 읽기와 일반적인 입력 오류를 포함한 작성자의 추정치입니다.

정상 참조 기록을 읽을 수 있게 설정하기

이 단계에서는 정상 예약을 복호화하고 결과를 입증하는 필드를 배웁니다.

Desktop에서 시작합니다. 왼쪽 아래의 Applications → Terminal Emulator를 열고 다음 전체 명령을 실행합니다. Wireshark를 닫을 때까지 이 터미널은 사용 중입니다.

wireshark -C Booking /home/labex/project/booking/input/casebook.pcapng

-C Booking은 준비된 초기 빈 설정 프로필 Booking을 선택합니다. 프로필은 분석 창의 설정을 저장합니다. 제목 표시줄의 최대화 버튼으로 Wireshark를 최대화합니다. 입력 캡처와 input/casebook.keys는 읽기 전용 원본입니다. 작업 결과는 output/에 저장하세요.

HTTPS는 애플리케이션 대화를 암호화하는 TLS 안에서 HTTP를 전달합니다. TCP는 양 끝점 사이에 TLS 레코드를 전달합니다. 이 기록은 TLS 1.3과 HTTP/1.1을 사용합니다. 로컬 서비스는 127.0.0.1:18443이고 Hazel의 로컬 시험용 주소는 127.0.0.21입니다. 이 주소들은 같은 학습 컨테이너 안에 있으며 서로 다른 물리적 컴퓨터가 아닙니다.

표시 필터 입력란에 http를 입력하고 Enter를 누릅니다. 처음에는 복호화된 HTTP 행이 없습니다. 입력란을 비우고 TLS 핸드셰이크와 암호화된 Application Data를 확인합니다. 핸드셰이크는 세션을 설정하고 Application Data는 예약 메시지를 운반합니다. 캡처만으로는 평문을 얻을 수 없습니다.

TLS 키 로그에는 허가된 클라이언트가 특정 세션용으로 의도적으로 기록한 비밀 정보가 들어 있습니다. 비밀번호 목록이나 서버 인증서가 아닙니다. 서버 인증서나 RSA 개인 키는 이 TLS 1.3 세션의 비밀 정보를 대체하지 못합니다. 실무에서는 캡처와 키 로그를 민감한 정보로 취급하고 허가된 분석 범위에서만 공유하세요. 여기의 신원, 예약, 비밀 정보는 모두 로컬 연습용입니다.

Edit → Preferences를 엽니다. Protocols를 펼치고 프로토콜 목록을 클릭한 뒤 tls를 입력하여 TLS를 선택합니다. (Pre)-Master-Secret log filename에 다음 절대 경로를 입력합니다. Reassemble TLS records spanning multiple TCP segments와 Reassemble TLS Application Data spanning multiple TLS records를 켠 상태로 두고 OK를 누릅니다.

/home/labex/project/booking/input/casebook.keys

다시 http 표시 필터를 적용합니다. POST 요청 하나와 HTTP 응답 하나가 보입니다. 여전히 비어 있으면 필터를 지우고 파일 경로의 철자를 확인한 뒤 TLS 설정으로 돌아갑니다. 잘못되거나 무관한 키 로그는 Application Data를 암호화된 상태로 남기지만, 요청이 없었다는 증거는 아닙니다.

POST를 선택합니다. HTTP는 요청과 응답 프로토콜입니다. POST는 데이터를 보내고 /api/bookings는 예약 리소스의 URI입니다. 요청을 마우스 오른쪽 버튼으로 클릭하고 Follow → TLS Stream을 선택합니다. Follow TLS Stream은 복호화된 애플리케이션 바이트를 보여 주지만 Follow TCP Stream은 여전히 암호화된 전송 바이트를 보여 줍니다. 필요하면 스크롤하여 양쪽을 읽습니다. 글자색만으로 발신자를 판단하지 말고 요청 행과 응답 상태 행을 읽으세요.

요청 본문은 중괄호로 감싼 이름 있는 값의 집합인 JSON입니다. visitor, attempt, workshop, slot을 읽습니다. 응답은 이를 반복하고 accepted, reason, confirmation을 추가합니다. Hazel의 정상 예약은 accepted: true, reason: "confirmed"이며 확인값은 hazel-01에 속합니다. JSON에서 true는 불리언 값, 따옴표로 감싼 값은 문자열, null은 값이 없음을 뜻합니다.

HTTP/1.1 200 OK는 서버가 이 HTTP 요청을 처리했음을 뜻합니다. 예약의 애플리케이션 결과는 JSON 필드에서 판단합니다. 이 구분은 다음 실습에서 중요합니다. JSON 뒤의 큰 공백은 실제 응답을 여러 TLS/TCP 세그먼트로 나누기 위한 의도적인 학습용 패딩입니다. 추가 예약이 아닙니다.

허가된 전체 참조 기록 읽기

응답에 반복된 attempt와 accepted, reason, confirmation을 함께 읽으세요. HTTP 상태만으로는 부족합니다.

Close로 Follow를 닫습니다. Wireshark는 핸드셰이크와 세그먼트를 포함한 선택한 TCP 연결 전체를 보여 주는 tcp.stream eq ... 필터를 남깁니다. 표시 필터는 보이는 내용만 바꿉니다. 메인 창을 닫아 프로필 설정을 저장하고 터미널을 사용할 수 있게 합니다. Booking이 참조 기록의 전체 요청과 응답을 복호화하면 설정이 완료된 것입니다.

직접 방문을 캡처하고 다시 열기

이 단계에서는 새로운 허가된 방문을 캡처하고 실제 저장된 패킷을 독립적으로 다시 엽니다.

참조 창을 닫은 뒤 Desktop의 Terminal Emulator 프롬프트에서 시작합니다. 참조 기록의 키 로그로 다른 TLS 세션을 열 수는 없습니다. 새 방문을 캡처하고 해당 비밀 정보를 캡처 옆에 보관합니다.

준비된 캡처 실행기를 실행합니다.

python3 /opt/labex/booking/capture.py

별도의 BookingLive 프로필에서 실제 Wireshark 라이브 캡처 화면이 열립니다. 고정 패킷 공급원은 루프백의 강좌 포트 18443에 해당하는 TCP 통신만 캡처하며 15분과 4 MB 제한이 있습니다. 재생이 아닌, Wireshark로 실제 바이트를 전달하는 파이프를 사용합니다. 일반적인 캡처 권한을 부여하거나 로그인 설정을 바꾸지 않습니다. 터미널과 Wireshark를 열어 둡니다. 통신을 보내기 전에 터미널의 Live packet feed ready와 활성 캡처 창을 기다립니다.

Applications → Terminal Emulator에서 두 번째 Terminal Emulator를 엽니다. 아래 패널에서 두 터미널과 Wireshark 사이를 전환할 수 있습니다. 새 터미널에서 허가된 클라이언트를 실행합니다.

python3 /opt/labex/booking/booking.py client

준비된 클라이언트는 로컬 서비스의 인증서와 호스트 이름을 검증하고 실제 예약 요청 하나를 보낸 뒤 새 세션의 비밀 정보를 /home/labex/project/booking/output/live.keys에 기록합니다. 정답을 출력하지 않고 방문 완료를 알립니다. 새로운 attempt 값은 실행할 때마다 다릅니다. your-visit 클라이언트는 127.0.0.26을 사용합니다.

아래 패널로 Wireshark에 돌아갑니다. 마지막 TCP 연결 종료 패킷까지 실제로 나타난 뒤 도구 모음의 빨간 Stop 사각형을 누릅니다. 클라이언트가 끝났다고 캡처 화면에 모든 패킷이 도착한 것은 아닙니다. 핸드셰이크, 암호화된 애플리케이션 통신, 마지막 FIN 또는 RST가 보여야 합니다. FIN은 TCP 한 방향을 닫고 RST는 연결을 즉시 끝냅니다. 이 통제된 클라이언트의 종료 RST는 예약 결과가 아닙니다.

File → Save As 또는 저장하지 않은 캡처의 Ctrl+S를 선택하고 pcapng 형식을 유지하여 저장합니다.

/home/labex/project/booking/output/live.pcapng

패킷 목록 텍스트나 스크린샷 대신 실제 캡처를 저장합니다. 키 로그는 따로 유지하며 Inject TLS Secrets를 사용하지 않습니다. 저장 후 캡처 메인 창을 닫습니다. 첫 터미널에서 실행기가 native dumpcap status: 0으로 끝나고 프롬프트가 돌아와야 합니다. 창을 닫으면 강좌용 공급원도 닫힙니다. 터미널 재연결은 예약 서비스를 초기화하지 않습니다.

어느 터미널에서든 초기 빈 검토 프로필로 저장 파일을 엽니다.

wireshark -C BookingReview /home/labex/project/booking/output/live.pcapng

http를 적용하면 처음에는 다시 비어 있습니다. Edit → Preferences → Protocols → TLS에서 먼저 1단계의 전체 절대 경로로 참조 키 로그 input/casebook.keys를 설정해 봅니다. OK로 적용해도 새 세션은 복호화되지 않습니다. 이제 일치하는 새 키 로그로 설정을 바꿉니다.

/home/labex/project/booking/output/live.keys

OK를 누르고 http를 적용합니다. POST 하나와 대응하는 응답이 보여야 합니다. POST를 오른쪽 클릭하고 Follow → TLS Stream을 선택합니다. 새 attempt를 읽고 응답이 같은 값을 반복하는지 확인한 뒤 accepted, reason, 고유한 confirmation을 확인합니다. 유효한 결과는 sat-14의 paper-lantern 예약 확인입니다. Follow와 메인 창을 닫습니다. 참조 세션의 비밀 정보를 빌리지 않고 실제 저장 캡처를 독립적으로 열었습니다.

직접 저장한 HTTPS 세션 다시 열기

요청과 응답은 동일한 새 attempt를 보여 줍니다. 생성된 값은 예시와 다르지만 서로 일치하는 관계가 중요합니다.

너무 일찍 중지했다면 재시도 전에 불완전한 시도를 보관합니다. 이전 출력 파일 두 개가 모두 있을 때만 터미널에서 다음 두 명령을 실행합니다. mv는 각 파일의 이름을 바꿉니다. 경로에 공백이 없으므로 따옴표가 필요하지 않습니다. 입력 파일이나 서비스는 바꾸지 않습니다.

mv /home/labex/project/booking/output/live.pcapng /home/labex/project/booking/output/live-previous.pcapng
mv /home/labex/project/booking/output/live.keys /home/labex/project/booking/output/live-previous.keys

이후 캡처 실행기 → 두 번째 터미널의 클라이언트 → 마지막 패킷 표시 → Stop → Save → Close → 다시 열기 순서를 반복합니다. live-previous 파일이 이미 있으면 먼저 사용하지 않은 다른 백업 이름을 선택합니다. 클라이언트는 캡처에 맞는 비밀 정보가 사라지지 않도록 의도적으로 live.keys 덮어쓰기를 거부합니다. 저장 경로 오류는 새 방문 없이 File → Save As로 수정할 수 있습니다. 필터 오타는 지우고 http를 다시 입력하세요. 환경을 초기화하지 마세요.

요약

Wireshark에서 허가된 참조 기록을 복호화하고 새로운 실제 HTTPS 방문을 캡처한 뒤 해당 키 로그로 저장된 PCAPNG를 다시 열었습니다. 잘못된 참조 비밀 정보로는 새 세션을 복호화할 수 없습니다. 재사용 가능한 결과는 output/live.pcapng와 output/live.keys입니다.

HTTP 상태와 예약 결과를 구분하고 응답에 반복된 attempt도 읽었습니다. 다음 실습에서는 같은 지속 연결에서 실패한 예약과 재시도에 이 구분을 적용합니다.