2010년 1월 18일 월요일

분석할 패킷 데이터 크기가 큰 경우는 이렇게 하자!

요새는 고속의 네트워크로 연결되어 있고, 전송되는 데이터의 크기도 커지고 많아지다 보니 패킷 데이터 캡쳐시 패킷 파일 크기 또한 상당히 커지게 된다. 50M 이상의 크기를 읽어 들이기 시작하면 컴퓨터의 메모리 또한 많이 차지하고 분석하기에도 여간 불편해 지는 것이 아니다.

필터를 한번 적용하거나, 기타 작업을 수행할 때 속도가 느려지는 것은 당연하다.

이럴때는 분석할 패킷을 분할하여 하는 것이 효과적이다. 몇 십,몇 백메가가 되는 파일을 한번에 읽어들이면 속이 타는 것은 분석가들의 마음일 뿐이다. 어떤 방법들이 있는지 한번 알아보도록 하자.

우리가 흔히 유닉스 환경에서 사용하던 split 명령을 기억할 것이다. 이름에서 느껴지는 것과 같이 split 는 파일을 분할해 주는 것이다. 아래 화면은 -l 옵션을 사용해 1000 라인 단위로 inside.pcap 파일을 분할 하였고, 분할된 패킷은 xaa, xab, xac ... 와 같이 차례대로 분리 되었다.

# split -l 1000 inside.pcap
-rw-r--r-- 1 packet packet 39451913 2010-01-18 08:53 inside.pcap
-rw-r--r-- 1 packet packet   312239 2010-01-18 08:54 xaa
-rw-r--r-- 1 packet packet   140544 2010-01-18 08:54 xab
-rw-r--r-- 1 packet packet   218156 2010-01-18 08:54 xac
-rw-r--r-- 1 packet packet   302413 2010-01-18 08:54 xad
-rw-r--r-- 1 packet packet   127430 2010-01-18 08:54 xae

그런데, 이 split 는 우리가 사용하기에 문제가 있다. 정말 그대로 라인별로 잘라서 분할 시켜 주기 때문에, 첫번째 파일인 xaa 는 읽어 들일 수 있지만 두번째 파일인 xab 부터는 읽어들이려고 해도 에러가 발생한다. 이유인 즉, pcap 의 형식인 헤더가 xaa 만 있고 그 후에는 없기 때문이다. split 가 pcap 파일을 인식하고 분할된 파일에 pcap 헤더를 구성해서 만들어주지 않기 때문이다.

그럼 어떻게 해야 할까 ? 사용하기 편한 방법으로는 와이어샤크에 포함되어 있는 editcap 을 추천해 보고자 한다. 패킷 분석에 와이어샤크를 많이 사용하기도 하고, 기본으로 함께 설치되어 있는 파일이니 얼마나 편한가. 유닉스 뿐만 아니라 윈도우에서도 사용이 가능하다는 것도 장점이다.

다음 몇 가지 예제를 통해 사용방법에 대해 설명하겠다.

예제1) input.cap 파일에서 처음부터 100 개까지의 패킷을 output.cap 에 저장
#editcap -r input.cap output.cap 1-100

예제2) input.pcap 에서 output.pcap 파일에 10000 개의 패킷을 저장
# editcap -c 10000 input.pcap output.pcap
# ls
input.pcap                    output.pcap-00011  output.pcap-00024  output.pcap-00037
t.pcap            output.pcap-00012  output.pcap-00025  output.pcap-00038
output.pcap-00000          output.pcap-00013  output.pcap-00026  output.pcap-00039
output.pcap-00001          output.pcap-00014  output.pcap-00027  output.pcap-00040
output.pcap-00002          output.pcap-00015  output.pcap-00028  output.pcap-00041
output.pcap-00003          output.pcap-00016  output.pcap-00029  output.pcap-00042
output.pcap-00004          output.pcap-00017  output.pcap-00030  output.pcap-00043
output.pcap-00005          output.pcap-00018  output.pcap-00031  output.pcap-00044
output.pcap-00006          output.pcap-00019  output.pcap-00032  output.pcap-00045
output.pcap-00007          output.pcap-00020  output.pcap-00033  output.pcap-00046
output.pcap-00008          output.pcap-00021  output.pcap-00034  output.pcap-00047
output.pcap-00009          output.pcap-00022  output.pcap-00035  output.pcap-00048
output.pcap-00010          output.pcap-00023  output.pcap-00036

만약 input.pcap 이 10,000 개 이상인 경우는 10,000 개 단위로 output.pcap 뒤에 숫자가 붙어 만들어 진다.

예제3) -i 옵션을 통해 초 단위로 패킷을 나눈다.
#editcap -i 60 input.pcap output.pcap

예제4) 특정 시간범위를 지정하여 패킷 추출
# editcap -v -A "2010-01-15 14:00:00" -B "2010-01-15 15:00:00"  input.cap output.cap
-v 는 verbose 로 좀더 자세한 정보를 출력해 준다. -A 와 -B 로 시작과 끝을 지정한다.

예제5) 여러개의 범위를 지정하여 패킷 추출 하기
# editcap input.cap output.cap 1-100 500-600
1-100 번 까지 그리고 500-600 번 까지의 패킷을 output.cap 에 저장한다.

예제6) -r 옵션의 차이를 정확히 이해하자

1, 10, 200-300, 500-700 을 제외하고 output.cap 에 저장한다.
# editcap input.cap output.cap 1 10 200-300 500-700

1, 10, 200-300, 500-700 만 선택하여 output.cap 에 저장한다.
# editcap -r input.cap output.cap 1 10 200-300 500-700

이외 또 사용 가능한 것으로는 tcpslice 가 있다. 우선 이것도 시작과 끝 시간을 정할 수 있으며, 아래와 같이 +200 으로 시작 시간을 초로 지정할 수 있다. -R 옵션은 타임스탬프(timestamp)로 패킷 파일의 시작과 마지막 시간을 보여주며, -r 은 우리가 보기 쉬운 시간으로 -t 는 y,m,d,h 와 같은 형태로 보여주게 된다.

inside:/tmp# tcpslice -R  +200 +300 1.cap
1.cap   1263374793.063785       1263375147.306405
inside:/tmp# tcpslice -r  +200 +300 1.cap
1.cap   Wed Jan 13 18:26:33 2010        Wed Jan 13 18:32:27 2010
inside:/tmp# tcpslice -t  +200 +300 1.cap
1.cap   2010y01m13d18h26m33s063785u     2010y01m13d18h32m27s306405u
위 시간을 보면 2010년1월13일 18시26분33초 부터 시작하고 있다. 아래는 2010년1월13일 18시30분 부터 18시32분까지 패킷을 1.cap 에서 추출하여 output.cap 에 저장하는 명령어이다.  

inside:/tmp# tcpslice -w output.cap 2010y01m13d18h30m 2010y01m13d18h32m 1.cap

저장된 output.cap 파일을 tcpdump 로 살펴보면 첫 시작이 1월13일 18시30분 부터인 것을 알 수 있다.

inside:/tmp# tcpdump -tttt -r output.cap | more
reading from file output.cap, link-type EN10MB (Ethernet)
2010-01-13 18:30:02.223030 IP 111.x.x.9.1302 > 58.140.x.64.search: S 3807417969:3807417969(0) win
65535 
2010-01-13 18:30:02.223068 IP 58.140.x.64.search > 111.x.x.9.1302: S 3325899008:3325899008(0) ack
3807417970 win 2920 
Editcap 과 tcpslice 를 알았으니, 이제 큰 패킷 파일이라도 두려워하지 말자!

참고로, 저장할 때부터 큰 파일로 만들지 말고, 패킷 캡쳐 시에 저장옵션을 통해 분리하면 이렇게 분리하는 작업을 거치지 않아 편리하다. 참고) 패킷 파일의 크기, 개수등 저장 옵션을 지정해 보자


댓글 없음:

댓글 쓰기