네트워크 및 보안/pcap 파일 분석기 만들기 with C언어

[pcap 파일 분석기 만들기 wich C언어] 1. pcap 파일 구조 분석

언제나휴일 2016. 5. 20. 13:05
반응형

1. pcap 파일 구조 분석



안녕하세요. 언제나 휴일, 언휴입니다.


네트워크 트래픽을 수집하고 분석하는 유틸리트는 tcpdump, tshark, wireshark 등의 무료 소프트웨어부터 사용 프로그램까지 다양합니다.


앞으로 "pcap 파일 분석기 만들기 with C언어" 카테고리에서는 별도의 라이브러리 없이 tcpdump와 tshark로 수집한 추적 파일을 분석하는 프로그램을 만들어 나갈 거예요. 이를 위해 네트워크 프로토콜에 관한 이해 및 tcpdump, tshark 등의 유틸리티 사용법 등도 필요할 수 있겠죠. 또한 네트워크 트래픽을 수집하고 분석하는 이유는 네트워크 상태 모니터링 및 네트워크 보안을 목적으로 하는 것이므로 이에 관한 얘기들도 필요할 거예요.


언제나 휴일에서는 이들에 관한 사항들을 각각의 카테고리로 정리하고 서로 연관있는 게시글을 하이퍼링크로 연결하여 입체적으로 학습할 수 있는 공간을 만들어 나갈거예요.


여기에서는 별도의 라이브러리없이 C언어로 네트워크 트래픽을 수집한 pcap 파일을 로딩하여 분석하는 프로그램을 만드는 과정을 다룰 것입니다. 이를 위해 초반에는 필요한 요소 기술을 예광탄 형태로 작성하고 중반부에 요구 분석 및 아키텍쳐링, 설계 등을 한 후에 후반부에 구현 및 테스트 등의 작업을 해 나갈거예요. 참고로 테스트는 예광탄을 만들거나 중간 중간 요소들을 작성할 때마다 단위 테스트 및 통합 테스트를 할 것입니다.


하지만 본 카테고리는 네트워크나 보안에 관심을 갖고 있는 이들이 입체적인 학습을 위해 작성하는 것으로 상용 프로그램 수준의 프로그램을 만드는 것이 아님을 밝힙니다. 그리고 보안에 관한 구체적인 기술을 프로그램 코드로 표현하는 부분은 악용할 우려가 있어서 온라인에 게시하지 않겠습니다.


모두 발언이 좀 길었죠.


이번 게시글은 pcap 파일의 구조를 알아볼 거예요. 제목은 분석이라고 했지만 큰 틀만 확인할 것이며 이미 제가 작성한 프로그램으로 캡쳐한 화면과 와이어샤크 도구의 화면으로 설명을 할 것이며 실질적인 프로그래밍은 다음 게시글부터 시작할거예요.


먼저 pcap 파일이 필요하겠죠. pcap 파일은 tcpdump로 네트워크 트래픽을 추적하여 파일로 만들거나 와이어샤크나 tshark로 추적 파일을 만든 것을 tcpdump 파일 포멧인 pcap으로 변환하여 사용할 수 있습니다.


여기에서는 와이어샤크로 만든 추적파일을 가지고 tcpdump 파일 포멧인 pcap 파일로 변환하는 작업부터 시작할게요.


와이어샤크로 파일을 열고 난 후에 Save As 메뉴를 선택하세요.

와이어샤크의 Save As 메뉴 선택


그리고 파일 형식 목록에서 tcpdump 파일 포멧인 pcap을 선택하여 저장하세요.

와이어샤크로 tcpdump 파일 포멧인 pcap 파일로 저장하기


이 부분은 현재 여러분께서는 따라할 수 없는 부분이네요. 먼저 pcap 파일 구조를 설명하기 위해 간단히 만든 분석 예광탄(온라인에 유포하지 않은 프로그램이므로 검색해도 나오지 않습니다.)으로 화면 캡쳐한 것을 보면서 설명을 하기로 할게요.


pcap 파일은 pcap 파일 헤더가 맨 앞 24바이트 있습니다. 그리고 캡쳐한 패킷마다 패킷 헤더+패킷로 구성하고 있어요. 패킷 헤더는 16바이트를 차지하며 패킷은 가변 길이입니다. 

pcap 파일 분석 예광탄

pcap 파일 헤더는 24바이트입니다.
magic(4), major version(2), minor version(2), time zone(4),time stamps(4), sanp length(4), link type(4)
struct pcap_file_header 
{
             bpf_u_int32 magic;
             u_short version_major;
             u_short version_minor;
             bpf_int32 thiszone; /* gmt to localcorrection */
             bpf_u_int32 sigfigs; /* accuracy oftimestamps */
             bpf_u_int32 snaplen;            /* maxlength saved portion of each pkt */
             bpf_u_int32 linktype;            /* datalink type (LINKTYPE_*) */
}; 

magic은 언제나 같은 값(0xA1B2C3D4, D4C3B2A1으로 보이는 이유는 byte order 때문이니다.)을 갖고 있으며 pcap 파일임을 표시하기 위함입니다. 그리고 2바이트 씩 캡쳐할 때 사용한 pcap 라이브러의 major, minor 버전 정보가 있어요. 그리고 다음 4바이트에는 표준시와 캡쳐한 지역의 시간의 차이가 들어있고 다음 4바이트는 타임 스템프입니다. 그리고 다음 4바이트는 패킷 하나 당 캡쳐할 바이트 상한 값이며 마지막 4바이트는 캡쳐한 장치 정보입니다.

패킷 헤더는 16바이트인데 time stamp(8), capture length(4),packet length(4)입니다.
struct pcap_pkthdr 
{
             structtimeval ts;    /*time stamp */
             bpf_u_int32 caplen; /* length of portionpresent */
             bpf_u_int32 len;     /* length thispacket (off wire) */
};

각 패킷은 캡쳐한 타임 스탬프와 실제 캡쳐한 바이트 수와 패킷 길이로 구성하고 있어요. 네트워크 트래픽을 캡쳐할 때 캡쳐 길이의 상한을 설정하지 않았다면 언제나 캡쳐한 바이트 수와 패킷 길이는 같습니다. 하지만 캡쳐 길이의 상한을 낮게 설정하여 네트워크 트래픽을 캡쳐하였다면 캡쳐한 바이트 수가 패킷 길이보다 작을 수 있습니다.


struct timeval 
{
        long    tv_sec;         /* seconds*/
        long    tv_usec;        /* andmicroseconds */
}; 

타임 스탬프는 마이크로 초 단위까지 제공합니다.


다음은 같은 파일을 wireshark로 열었을 때의 화면입니다. 위의 pcap 파일 분석 예광탄 그림과 비교해 보면 pcap 파일 헤더 정보와 패킷 헤더 정보를 제외한 패킷 데이터 정보만 헥사값으로 출력함을 알 수 있습니다.


다음은 첫 번째 패킷을 선택하였을 때의 화면입니다.

wireshark로 패킷 정보 확인


다음은 두 번째 패킷을 선택하였을 때의 화면입니다.

wireshark로 패킷 정보 확인


이번 게시글에서는 C언어로 pcap 파일 분석기 만들기 프로그래밍에 앞서 pcap 파일 구조를 간략하게 살펴보았습니다.


다음 게시글부터는 C언어로 pcap 파일 분석기를 만들기 위해 필요한 요소 기술부터 하나 하나 익히기 위한 프로그래밍 실습을 할 거예요.


그럼 다음 게시글에서 만나요.


모두 행복한 하루~

demo.pcap



반응형