패킷 내용 검사하기

WiresharkBeginner
지금 연습하기

소개

물리적인 택배를 추적할 때, 배송 라벨을 읽는 것만으로도 목적지를 알기에 충분한 경우가 많습니다. 하지만 때로는 상자 안에 실제로 무엇이 들어 있는지 확인해야 할 때가 있습니다.

네트워크 분석에서 IP 주소와 포트를 확인하는 것은 배송 라벨 (패킷 헤더) 을 읽는 것과 같습니다. 그러나 웹 페이지의 텍스트, 다운로드한 파일, 심지어 암호화되지 않은 비밀번호와 같은 진정한 가치가 있는 정보는 패킷의 페이로드 (payload) 안에 숨겨져 있습니다.

이 헤더와 페이로드의 구분은 사이버 보안의 기본입니다. 헤더는 트래픽의 출처, 목적지, 사용 중인 프로토콜과 같은 라우팅 관련 질문에 답을 줍니다. 반면 페이로드는 무엇이 요청되었는지, 무엇이 반환되었는지, 민감한 데이터가 노출되었는지와 같은 콘텐츠 관련 질문에 답을 줍니다. 숙련된 분석가는 해결하려는 문제에 따라 이 두 가지 관점을 자유롭게 오갑니다.

이 실습에서는 tcpdump를 사용하여 상자를 열고 네트워크 패킷의 실제 내용을 검사하는 방법을 배웁니다. 단순히 라벨만 캡처하는 것이 아니라 패킷 전체를 캡처하는 방법과, 사람과 컴퓨터가 모두 읽기 쉬운 형식으로 원시 데이터를 표시하는 방법을 탐구합니다. 마지막으로, Linux 텍스트 도구를 사용하여 흐르는 네트워크 트래픽에서 일반 텍스트로 된 비밀 정보를 직접 추출하는 연습을 합니다.

Snaplen 증가 (전체 패킷 캡처)

패킷 내부를 들여다보려면 먼저 tcpdump가 패킷 전체를 제대로 캡처하고 있는지 확인해야 합니다. 기본적으로 구버전 tcpdump와 일부 네트워크 도구는 하드 드라이브 공간을 절약하기 위해 모든 패킷의 끝부분을 잘라내고 헤더만 캡처하려는 경향이 있습니다.

이러한 절충안은 패킷 캡처가 항상 완전성과 비용 사이의 균형을 맞추는 작업임을 보여줍니다. 짧은 패킷을 캡처하면 저장 공간을 덜 차지하고 속도가 빠를 수 있는데, 이는 트래픽이 많은 네트워크에서 중요합니다. 반면 전체 패킷을 캡처하면 더 많은 증거를 보존할 수 있어 문제 해결 및 포렌식 작업 시 중요합니다. 항상 정답인 설정은 없습니다. 분석가는 질문의 내용, 환경, 성능 예산에 따라 선택합니다.

단일 패킷에서 캡처되는 데이터의 양을 "스냅샷 길이 (snapshot length)" 또는 줄여서 snaplen이라고 합니다. 페이로드를 확인하려면 도구에 데이터를 자르지 말라고 지시해야 합니다. 이는 -s 플래그를 사용하여 제어합니다. snaplen 을 0으로 설정 (-s 0) 하면 tcpdump가 가능한 최대 길이를 사용하도록 지시하는 특별한 설정이 되어, 데이터가 누락되지 않도록 보장합니다.

백그라운드 환경에는 이미 포트 8080에서 실행 중인 간단한 웹 서버가 준비되어 있습니다. 데이터를 깔끔하게 캡처하기 위해 timeout이라는 유용한 Linux 명령어를 사용하여 tcpdump를 정확히 10 초 동안만 자동으로 실행하겠습니다.

다음 명령어를 실행하세요. 이 명령어는 루프백 인터페이스 (lo) 에서 캡처를 시작하고, 포트 8080을 필터링하며, 전체 패킷을 캡처 (-s 0) 하고, 결과를 백그라운드에서 ~/project/traffic.pcap 파일로 저장 (& 기호 사용) 합니다:

sudo timeout 10 tcpdump -i lo port 8080 -s 0 -w ~/project/traffic.pcap &

tcpdump가 백그라운드에서 조용히 감시하는 동안, 캡처할 흥미로운 웹 트래픽을 생성해야 합니다. curl 명령어를 사용하여 로컬 웹 서버에서 숨겨진 파일을 요청하세요:

curl http://localhost:8080/secret.txt

웹 서버가 요청에 응답하여 SecretPayloadData123이라는 텍스트가 출력되는 것을 볼 수 있습니다. 10 초 timeout 타이머가 종료되어 백그라운드 tcpdump 프로세스가 닫힐 때까지 잠시 기다리세요. Enter 키를 몇 번 누르면 백그라운드 작업 완료 메시지가 나타나는 것을 확인할 수 있습니다.

모든 것이 제대로 작동했는지 확인하기 위해 디렉토리 내용을 나열하여 캡처 파일을 확인하세요:

ls -l ~/project/traffic.pcap

traffic.pcap 파일이 0 보다 큰 크기로 나열되어야 하며, 이는 잘리지 않은 전체 패킷이 안전하게 캡처되어 저장되었음을 의미합니다.

ASCII 페이로드 출력

이제 전체 패킷을 성공적으로 저장했으니, 파일을 열어 내용을 읽어볼 차례입니다. 기본적인 웹사이트, FTP 서버, 오래된 Telnet 시스템과 같은 네트워크 애플리케이션이 서로 통신할 때, 종종 페이로드 데이터를 암호화되지 않은 단순 텍스트로 전송합니다.

이것이 바로 암호화되지 않은 프로토콜이 신뢰할 수 없는 네트워크에서 위험하다고 간주되는 이유입니다. 사람이 캡처 파일에서 페이로드를 읽을 수 있다면, 동일한 트래픽을 가로채는 공격자도 읽을 수 있기 때문입니다. 즉, 패킷 검사는 단순한 분석 기법이 아니라, 현대 시스템이 왜 HTTPS 나 SSH 와 같은 암호화된 프로토콜을 선호하는지를 상기시켜 주는 작업이기도 합니다.

이 일반 텍스트를 확인하기 위해 tcpdump는 -A 플래그를 제공합니다. 이 유용한 옵션은 패킷 내부의 원시 바이너리 데이터를 사람이 읽을 수 있는 ASCII 문자로 변환합니다. 캡처 파일에서 읽을 수 있는 단어, 오류 메시지 또는 노출된 자격 증명을 빠르게 스캔하는 데 매우 효과적입니다.

-r 플래그를 사용하여 방금 생성한 캡처 파일을 읽고, -A 플래그와 함께 사용하여 ASCII 내용을 표시하세요:

sudo tcpdump -r ~/project/traffic.pcap -A

텍스트가 스크롤될 때 출력을 자세히 살펴보세요. 먼저 기술적인 패킷 헤더가 보이지만, 그 아래에 섞여 있는 실제 읽을 수 있는 영어 텍스트를 발견할 수 있습니다.

curl 명령어가 보낸 GET /secret.txt 요청과 그 뒤를 이어 웹 서버가 응답한 HTTP/1.0 200 OK 메시지를 쉽게 찾을 수 있을 것입니다. 서버 응답 패킷의 맨 아래쪽 근처에서 일반 텍스트로 노출된 숨겨진 페이로드 SecretPayloadData123을 명확하게 볼 수 있습니다.

...
E..e..@.@.............Q...P.P...P...*......
GET /secret.txt HTTP/1.1
Host: localhost:8080
User-Agent: curl/7.81.0
Accept: */*

...
E.....@.@.............P...Q.P...P...*......
HTTP/1.0 200 OK
Server: SimpleHTTP/0.6 Python/3.10.12
...

SecretPayloadData123
...

출력 전체에 흩어져 있는 많은 점 (.) 을 발견할 것입니다. 이는 완전히 정상입니다. 컴퓨터는 기본 기계 코드 (TCP/IP 헤더 등) 를 텍스트로 표시하려고 시도하는데, 표준 키보드 문자와 일치하지 않는 바이너리 값을 발견하면 대신 점을 출력하기 때문입니다.

16 진수 및 ASCII 출력 (Hexdump)

ASCII 보기 (-A) 는 일반 텍스트를 훑어보는 데는 환상적이지만, 복잡한 컴퓨터 로직을 다룰 때는 부족함이 있습니다. 바이너리 프로토콜 (DNS 요청이나 암호화된 트래픽 등) 은 ASCII 모드에서 점들의 혼란스러운 바다처럼 보이기 때문에, 네트워크 엔지니어에게는 더 정밀한 도구가 필요합니다.

16 진수 (Hexadecimal) 는 원시 바이트를 표현하는 간결한 방법이기 때문에 저수준 보안 작업에서 지속적으로 나타납니다. 컴퓨터는 데이터를 바이너리로 저장하지만, 바이너리는 사람이 직접 읽기에 너무 번거롭습니다. 16 진수는 실용적인 중간 지점 역할을 합니다. 각 16 진수 숫자는 4 개의 바이너리 비트와 깔끔하게 매핑되므로, 분석가는 0 과 1 의 긴 문자열에 파묻히지 않고도 바이트 수준의 구조를 검사할 수 있습니다.

패킷의 구조를 가장 정확하게 보려면 -X 플래그를 사용합니다. 이 플래그는 출력을 Hexdump 라고 알려진 구조화된 형식으로 변환합니다. 데이터의 정확한 16 진수 (base-16) 값을 ASCII 텍스트와 나란히 표시하여 두 가지 방식의 장점을 모두 제공합니다.

다음 명령어를 실행하여 캡처 파일을 읽고 더 상세한 hexdump 보기를 표시하세요:

sudo tcpdump -r ~/project/traffic.pcap -X

화면에 표시된 구조화된 데이터 블록을 검사하세요.

...
0x0000:  4500 0065 1419 4000 4006 28b4 7f00 0001  E..e..@.@.(.....
0x0010:  7f00 0001 8152 1f90 50b9 1017 5018 0200  .....R..P...P...
0x0020:  fe59 0000 4745 5420 2f73 6563 7265 742e  .Y..GET./secret.
0x0030:  7478 7420 4854 5450 2f31 2e31 0d0a 486f  txt.HTTP/1.1..Ho
0x0040:  7374 3a20 6c6f 6361 6c68 6f73 743a 3830  st:.localhost:80
...

출력은 세 개의 명확한 열로 정렬되어 있습니다.

가장 왼쪽 열 (0x0000:으로 시작) 은 기본적으로 눈금자 역할을 하며, 패킷 내의 정확한 바이트 위치를 알려줍니다.

중간의 넓은 섹션은 원시 패킷 데이터를 16 진수 형식으로 표시하며, 보안 분석가가 읽기 쉽도록 2 바이트 쌍으로 깔끔하게 그룹화되어 있습니다.

마지막으로, 가장 오른쪽 섹션은 해당 16 진수 데이터 행을 익숙한 ASCII 문자로 변환하여 빠른 참조 가이드 역할을 합니다.

데이터를 나란히 제시함으로써, 복잡한 네트워크 공격을 리버스 엔지니어링할 때 필수적인 비정상 문자의 정확한 바이너리 값을 찾아낼 수 있습니다.

일반 텍스트 HTTP 헤더 추출

원시 ASCII 또는 Hexdump 출력을 수동으로 검색하는 것은 작은 테스트에는 적합하지만, 수천 개의 패킷이 포함된 실제 캡처 파일을 분석할 때는 불가능한 작업이 됩니다.

이 단계에서는 또 다른 핵심 엔지니어링 아이디어를 소개합니다. 강력한 워크플로우는 종종 하나의 거대한 도구에 의존하기보다 작은 도구들을 결합할 때 나옵니다. tcpdump는 패킷을 읽는 데 능숙하고, grep은 텍스트를 검색하는 데 능숙합니다. 파이프 (|) 로 이들을 연결하면 빠르고 적응하기 쉬운 워크플로우를 만들 수 있습니다. 이러한 구성 가능성 (composability) 은 Linux 명령줄 환경의 결정적인 강점 중 하나입니다.

이를 해결하기 위해 Linux 에서는 도구를 결합할 수 있습니다. tcpdump의 ASCII 출력을 가져와 grep이라는 텍스트 검색 도구로 직접 파이프 (|) 하면, 방대한 텍스트 스트림을 즉시 필터링하여 찾고자 하는 특정 정보만 골라낼 수 있습니다.

예를 들어, 웹 트래픽을 조사하는 경우 어떤 웹사이트를 방문하고 있는지 (Host 헤더) 와 사용자가 어떤 웹 브라우저를 사용하고 있는지 (User-Agent 헤더) 를 빠르게 파악하고 싶을 수 있습니다.

다음 명령어를 실행하세요. 이 명령어는 파일을 ASCII 모드로 읽고, 텍스트를 grep으로 파이프하며, -E 플래그를 사용하여 "Host:", "User-Agent:", 또는 "HTTP"를 포함하는 행에 대한 확장 검색을 활성화합니다:

sudo tcpdump -r ~/project/traffic.pcap -A | grep -E "Host:|User-Agent:|HTTP"

즉시 복잡한 출력은 웹 트랜잭션에 대한 깔끔하고 잘 정리된 요약으로 대체됩니다:

GET /secret.txt HTTP/1.1
Host: localhost:8080
User-Agent: curl/7.81.0
HTTP/1.0 200 OK
Server: SimpleHTTP/0.6 Python/3.10.12

이 워크플로우는 사이버 보안 사고 대응에 매우 강력합니다. 검색어를 변경함으로써 이 동일한 기법을 사용하여 전체 네트워크 캡처에서 유출된 비밀번호 (예: grep -i "password"), 기밀 파일 이름 또는 알려진 악성 명령 문자열을 손쉽게 찾아낼 수 있습니다.

요약

축하합니다! "패킷 내용 검사하기" 실습을 성공적으로 완료했습니다.

단순히 네트워크 패킷의 겉모습만 보는 수준에서 벗어나, 전송되는 실제 데이터를 깊이 있게 파고드는 기술을 습득했습니다. snaplen 옵션 (-s 0) 을 사용하여 패킷 잘림을 방지하고 완전한 캡처를 보장하는 방법을 연습했습니다. 그런 다음 -A 플래그를 사용하여 읽기 쉬운 ASCII 보기를, -X 플래그를 사용하여 정밀하고 전문적인 Hexdump 분석을 수행했습니다. 마지막으로 tcpdump와 표준 Linux 텍스트 도구를 결합하여 노이즈 속에서 특정 애플리케이션 데이터를 자동으로 찾아내고 추출하는 워크플로우를 완성했습니다.

이러한 핵심 기술은 심층 패킷 검사 (Deep Packet Inspection) 의 기초입니다. 모호한 애플리케이션 버그를 해결하든, 보안 침해에 대한 상세한 네트워크 포렌식을 수행하든, 이제 여러분은 네트워크를 통해 이동하는 데이터를 정확하게 파악할 수 있는 도구를 갖추게 되었습니다.