일전에 mergecap 을 통해 패킷파일을 합치는 방법에 대해서 포스팅을 하였다.
[참고] 여러개의 패킷파일 하나로 합치기 (using mergecap)
이외에 와이어샤크 GUI 화면을 통해서도 쉽게 패킷파일을 합칠수 가 있다. 메뉴에서 File -> Merge 를 선택하면 아래와 같은 화면이 나타난다. 기존 선택한 패킷파일 외 다른 Merge 할 패킷 파일을 선택하는 것이다.
선택할 옵션이 3가지 나타나는데 Prepend 는 패킷파일의 앞쪽에 Chronologically 는 시간 순서대 별로 Append 는 뒤쪽에 패킷파일을 이어 붙인다. Merge 전 패킷파일은 이미 저장되어 있는 상태여야 하고 위 옵션을 통해 쉽게 통합할 수 있다.
좀더 GUI 를 효과적으로 이용할 수 있는 방법은 마우스를 이용해 파일을 Drag&Drop 하는 것이다. 한개의 패킷파일을 선택하여 사용하는 경우 해당 파일이 대체되어 오픈되지만, 여러개의 패킷파일을 동시에 Drag&Drop 하는 경우 Merge 를 하려고 시도할 것이다.
명령어를 이용하는 것 보다는 GUI 의 장점을 이용할 수 있는 방법으로, 좀더 편하게 사용이 가능하다.
2012년 9월 12일 수요일
2012년 8월 24일 금요일
여러개의 패킷파일 하나로 합치기 (using mergecap)
블로그에서 패킷분할과 관련해서는 몇 가지 포스팅 된 글이 있는데, 여러 패킷을 한개로 합치는 것은 지금 찾아보니 소개한 적이 없었다. 이미 와이어샤크에 기능이 포함되어 있었는데 말이다.
여러개의 패킷을 한개로 합치는 방법은 와이어샤크에서 제공해주는 'mergecap' 을 이용하는 것이 편리하다. 기본 사용방법은 다음과 같다:
기본적으로 패킷파일들이 하나로 합쳐질 때는 패킷 프레임의 시간에 기준하여 합쳐지게 된다. 이러한 방법이 아니라 끝에다 이어붙이기를 할 수도 있는데, -a 옵션을 사용하면 된다. 첫번째 입력으로 주어진 파일 뒤쪽에 두번째 주어진 패킷파일이 이어진다.
패킷 덤프를 할 경우에도 snaplen 길이를 정의하여 패킷의 얼마만큼을 볼 것인지 정의할 수 있었다. 합치는 경우에도 -s 로 snaplen 을 정의하여 지정된 바이트 만큼으로 패킷을 잘라낸다.
합쳐질 패킷파일의 캡슐화 타입을 정의할 수 있다. -T 옵션 다음에 정의해 주면 되고, 인자값 없이 -T 만 사용하면 캡슐화로 사용가능한 목록을 살펴볼 수 있다. 기본적으로는 처음 입력으로 들어오는 패킷파일의 타입을 사용하게 된다.
캡슐화에 대해 궁금한 분들은 다음 포스팅을 참고해 보기 바란다.
"패킷을 보다 자주 접하는 캡슐화(Encapsulation)는 무엇이지?"
http://www.packetinside.com/2011/03/encapsulation.html
와이어샤크에서 제공해주는 mergecap 파일외 파이썬으로 제작된 FLAG(Forensic and Log Analysis GUI)에서 제공해주는 mergecap.py 파일을 이용해 볼 수도 있다.
http://code.google.com/p/pyflag/source/browse/utilities/mergecap.py
여러개의 패킷을 한개로 합치는 방법은 와이어샤크에서 제공해주는 'mergecap' 을 이용하는 것이 편리하다. 기본 사용방법은 다음과 같다:
Usage: mergecap [options] -w <outfile>|- <infile> ...
Output:
-a concatenate rather than merge files.
default is to merge based on frame timestamps.
-s <snaplen> truncate packets to <snaplen> bytes of data.
-w <outfile>|- set the output filename to <outfile> or '-' for stdout.
-F <capture type> set the output file type; default is libpcap.
an empty "-F" option will list the file types.
-T <encap type> set the output file encapsulation type;
default is the same as the first input file.
an empty "-T" option will list the encapsulation types.
Miscellaneous:
-h display this help and exit.
-v verbose output.
mergecap 을 이용해 -w 로 합쳐질 파일 이름을 지정해 주고, 그 뒤로 합칠 패킷파일들을 나열해 주면 된다. -v 옵션은 추가적인 동작 정보를 제공해 준다.
$ mergecap -v -w output.pcap input1.pcap input2.pcap
패킷 파일 이어붙이기
$ mergecap -v -w output.pcap input1.pcap input2.pcap -a
특정 길이로 한정해서 합치기
$ mergecap -v -w output.pcap input1.pcap input2.pcap -s 1000
캡슐화 타입 정의하기
$ mergecap -v -w output.pcap -T ether input1.pcap input2.pcap
캡슐화에 대해 궁금한 분들은 다음 포스팅을 참고해 보기 바란다.
"패킷을 보다 자주 접하는 캡슐화(Encapsulation)는 무엇이지?"
http://www.packetinside.com/2011/03/encapsulation.html
와이어샤크에서 제공해주는 mergecap 파일외 파이썬으로 제작된 FLAG(Forensic and Log Analysis GUI)에서 제공해주는 mergecap.py 파일을 이용해 볼 수도 있다.
http://code.google.com/p/pyflag/source/browse/utilities/mergecap.py
2011년 8월 9일 화요일
Ethereal 과 궁합이 맞는 오픈소스 패킷분석기 Packetzyer
오픈소스 패킷 분석 도구인 Packetyzer 를 소개한다. 사실 이 도구는 더 이상 업데이트가 되고 있지 않지만, 나름 깔끔한 인터페이스로 어느정도 사용하기에는 충분한것 같다. 내가 지금까지 많은 패킷 도구들을 소개해 오고 있지만, 아직도 소개할 패킷도구들이 너무나 많이 남아 있다. 자기한테 적당한 도구를 선택하는 것은 여러분들의 몫이므로, 이런것이 있다는 것만 알아두자.
일단 현재 5.0 버전이며, 이더리얼 0.99.00 과 winpcap 3.1 이 포함되어 있다. 이더리얼의 기능을 이용해 구현된 것이라 볼 수 있다. 현재 와이어샤크로 불리기 이전 버전인 이더리얼 이므로 기능적으로는 와이어샤크에 비하면 못 할 수 잇겠으나 처음 패킷 분석을 접하는 윈도우 사용자에게는 쉬운 인터페이스와 윈도우적인 느낌으로 더 쉽게 다가설 수 있지 않나 싶다.
(참고로, 현재 이더리얼은 와이어샤크로 계속 개발되고 있으며, Ethereal 자체는 개발이 중지된 상태이다)
프로그램은 다음 경로에서 다운로드 받아 설치하면 된다. 윈도우 기반이라 따로 설치하는데 어려움은 없다.
http://www.gotomanage.com/open_source_tools/packetyzer_thankyou
실행하고, 캡쳐를 시작하면 다음과 같은 형태의 화면을 볼 수 있다:
처음 사용하는 사용자라도 몇번 클릭해 보면 어렵지 않게 사용할 수 있으며, 과거 이더리얼이 가지고 있던 기능들을 포함하고 있다. 출력 필터, 캡쳐 필터, 다양한 프로토콜 분석 기능등이 이에 해당한다. 이 프로그램이 또 다른 특징은 패킷 수정/보내기 기능이 있다. Session 메뉴에 Send Packet... 기능이 있는데, 각 헤더를 수정하여, 전송하는 기능을 가지고 있다.
윈도우 기반의 패킷분석기에 관심 있다면, Packetyzer 소스를 살펴보는 것도 도움이 될 것이다.
[참고]
1. Packetyer
http://www.gotomanage.com/open_source_tools/packetyzer
2. Packetyer 소스파일 받을 수 있는 곳
http://sourceforge.net/projects/packetyzer/
일단 현재 5.0 버전이며, 이더리얼 0.99.00 과 winpcap 3.1 이 포함되어 있다. 이더리얼의 기능을 이용해 구현된 것이라 볼 수 있다. 현재 와이어샤크로 불리기 이전 버전인 이더리얼 이므로 기능적으로는 와이어샤크에 비하면 못 할 수 잇겠으나 처음 패킷 분석을 접하는 윈도우 사용자에게는 쉬운 인터페이스와 윈도우적인 느낌으로 더 쉽게 다가설 수 있지 않나 싶다.
(참고로, 현재 이더리얼은 와이어샤크로 계속 개발되고 있으며, Ethereal 자체는 개발이 중지된 상태이다)
프로그램은 다음 경로에서 다운로드 받아 설치하면 된다. 윈도우 기반이라 따로 설치하는데 어려움은 없다.
http://www.gotomanage.com/open_source_tools/packetyzer_thankyou
실행하고, 캡쳐를 시작하면 다음과 같은 형태의 화면을 볼 수 있다:
처음 사용하는 사용자라도 몇번 클릭해 보면 어렵지 않게 사용할 수 있으며, 과거 이더리얼이 가지고 있던 기능들을 포함하고 있다. 출력 필터, 캡쳐 필터, 다양한 프로토콜 분석 기능등이 이에 해당한다. 이 프로그램이 또 다른 특징은 패킷 수정/보내기 기능이 있다. Session 메뉴에 Send Packet... 기능이 있는데, 각 헤더를 수정하여, 전송하는 기능을 가지고 있다.
윈도우 기반의 패킷분석기에 관심 있다면, Packetyzer 소스를 살펴보는 것도 도움이 될 것이다.
[참고]
1. Packetyer
http://www.gotomanage.com/open_source_tools/packetyzer
2. Packetyer 소스파일 받을 수 있는 곳
http://sourceforge.net/projects/packetyzer/
2011년 1월 6일 목요일
패킷파일의 민감한 정보를 지우고 전달하고자 하는 경우에는 이 방법을!
패킷파일을 전달하여야 하는데, 사내 IP 정보들이 알려지기는 싫고 할때 어떤 방법을 써야 할까? 패킷인사이드를 꾸준히 방문한 분들이라면 앞서 몇번 언급했던 패킷조작 프로그램을 이용해 IP 등을 변경할 수 있다. 또는 지금 필자가 소개하고자 하는 tcpdpriv 를 이용하면 간단히 해결된다. tcpdpriv 는 프로그램 이름에서도 살짝 느껴지는 것과 같이 패킷파일에서 private 한 정보를 제거해 주는 기능을 갖고 있다.
프로그램 정보 및 다운로드는 다음의 경로를 방문하면 된다 :
http://fly.isti.cnr.it/software/tcpdpriv/
다운 받은 파일은 컴파일 과정을 거쳐야 한다. 제작 된지 오래된 소스이기도 해서 첫 버전은 FreeBSD 와 같이 몇몇 시스템에서만 테스트 되었고 configure 옵션도 csh 로 지정되어 있었다.
지금 버전은 그래도 리눅스에서도 컴파일이 가능하다.
# ./configure
cat: VERSION: No such file or directory
./configure 를 통해 Makefile 이 만들어 지면 make 를 수행하자
debian:~/# make
gcc -g -Wall -c -o tcpdpriv.o tcpdpriv.c
tcpdpriv.c: In function ‘verify_and_print_args’:
tcpdpriv.c:1504: error: invalid storage class for function ‘usage’
tcpdpriv.c:1570: warning: implicit declaration of function ‘usage’
tcpdpriv.c: At top level:
tcpdpriv.c:1749: warning: conflicting types for ‘usage’
tcpdpriv.c:1749: error: static declaration of ‘usage’ follows non-static declaration
tcpdpriv.c:1570: error: previous implicit declaration of ‘usage’ was here
make: *** [tcpdpriv.o] Error 1
그런데 컴파일 하는 과정에서 에러가 발생한다. 이 에러는 다음과 같이 수정하면 된다
# vi tcpdpriv.c
tcpdpriv 소스파일을 오픈하고 두군데를 수정하면 된다.
1) 1504 라인에서 static void usage(char *cmd); => 를 void usage 로 변경
2) 1749 라인에서 static 을 삭제
그리고 다시 컴파일을 하면 된다.
# make
gcc -g -Wall -c -o tcpdpriv.o tcpdpriv.c
tcpdpriv.c:33: warning: ‘rcsid’ defined but not used
gcc -g -Wall -c -o tcpdutil.o tcpdutil.c
tcpdutil.c:24: warning: ‘rcsid’ defined but not used
gcc -g -Wall -o tcpdpriv tcpdpriv.o tcpdutil.o -lpcap
컴파일이 완료되면 다음과 실행하여 옵션들을 살펴볼 수 있다.
간단하게 옵션 몇개를 살펴보자.
-A : IP 주소를 어떤식으로 표현할지를 결정한다. 레벨이 99인 경우 IP 주소는 변하지 않는다.
-c : 지정한 패킷 카운트 후에 종료한다.
-F : 사용할 필터를 지정
-i : 네트워크 인터페이스
-p : TCP, UDP 포트주소를 매핑한다.
-r : 읽어들일 패킷 파일을 지정
-w : 출력할 파일을 지정
위 옵션들을 보면 각 옵션마다 특정 값을 지정하는 것이 있어, 얼핏보면 복잡해 보인다.
간단하게 생각하면 0은 가장 안전한 옵션이라 생각하면 된다. 즉, 가급적 Private 한 정보는
제거하게 되고 , 99 는 많은 정보를 보여주는 것이라 볼 수 있다. 이런 개념으로 옵션에 사용되는 값을 이해하면 될것 같다.
직접 사용해 보는 것이 이해가 가능 빠르므로 한번 예를 살펴보자. 다음은 정상적인 일반 패킷 파일을 tcpdump 로 본 것이다.
11:11:33.480941 IP6 fe80::f95c:91a7:8bd8:6216.49403 > ff02::c.1900: UDP, length 146
11:11:34.532638 arp who-has 192.168.0.200 tell 192.168.0.240
11:11:34.534733 arp reply 192.168.0.200 is-at 00:01:36:2e:0b:a7 (oui Unknown)
11:11:34.534756 IP 192.168.0.240.48603 > kns.kornet.net.domain: 34133+ AAAA? www
.google.co.kr. (34)
11:11:34.545974 IP kns.kornet.net.domain > 192.168.0.240.48603: 34133 2/1/0 CNAM
E[|domain]
11:11:34.546180 IP 192.168.0.240.60837 > kns.kornet.net.domain: 30670+ A? www.go
ogle.co.kr. (34)
11:11:34.554454 IP kns.kornet.net.domain > 192.168.0.240.60837: 30670 8/4/4 CNAM
E[|domain]
11:11:34.555094 IP 192.168.0.240.45918 > pv-in-f99.1e100.net.www: S 2001641216:2
001641216(0) win 5840 <mss 1460,sackOK,timestamp 1127508 0,nop,wscale 4>
특별한 옵션을 사용하지 않고 -r 옵션을 통해 읽어들일 파일과 새로 저장할 파일을 지정하였다. 기본 옵션은 최대한 정보를 제거하는 것으로 설정되어 있다. (즉, 0 이다)
# ./tcpdpriv -w test2.pcap -r test.pcap
# map 32-bit addresses into sequential integers
# multicast addresses cloaked per -A and -C flags
# map 16-bit TCP port numbers into sequential integer
# map 16-bit UDP port numbers into sequential integer
# pktsin 138 pktsout 134 tooshort 0 uncoded 4
새롭게 저장된 test2.pcap 파일을 열어보면 IP 주소가 변경된걸 알 수 있다. 처음에 보였던 IPv6 와 ARP 정보도 보이지 않는다. 또한, 헤더 정보에 nop 이 많이 보여진다.
# tcpdump -r test2.pcap
11:11:34.534756 IP 1.0.0.1.1 > 1.0.0.2.2: UDP, length 34
11:11:34.545974 IP 1.0.0.2.2 > 1.0.0.1.1: UDP, length 132
11:11:34.546180 IP 1.0.0.1.3 > 1.0.0.2.2: UDP, length 34
11:11:34.554454 IP 1.0.0.2.2 > 1.0.0.1.3: UDP, length 314
11:11:34.555094 IP 1.0.0.1.tcpmux > 1.0.0.3.2: S 2001641216:2001641216(0) win 5840 <nop,no
p,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop>
11:11:34.685957 IP 1.0.0.3.2 > 1.0.0.1.tcpmux: S 959091973:959091973(0) ack 2001641217 win
5672 <nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop>
11:11:34.686035 IP 1.0.0.1.tcpmux > 1.0.0.3.2: . ack 1 win 365 <nop,nop,nop,nop,nop,nop,no
p,nop,nop,nop,nop,nop>
11:11:34.686326 IP 1.0.0.1.tcpmux > 1.0.0.3.2: P 1:614(613) ack 1 win 365 <nop,nop,nop,nop
,nop,nop,nop,nop,nop,nop,nop,nop>
11:11:34.816891 IP 1.0.0.3.2 > 1.0.0.1.tcpmux: . ack 614 win 108 <nop,nop,nop,nop,nop,nop,
nop,nop,nop,nop,nop,nop>
11:11:34.833127 IP 1.0.0.3.2 > 1.0.0.1.tcpmux: . 1:1419(1418) ack 614 win 108 <nop,nop,nop
,nop,nop,nop,nop,nop,nop,nop,nop,nop>
11:11:34.833160 IP 1.0.0.1.tcpmux > 1.0.0.3.2: . ack 1419 win 546 <nop,nop,nop,nop,nop,nop
,nop,nop,nop,nop,nop,nop>
그럼 다른 옵션을 한번 사용해 보자. IP 주소의 변화를 좀 주고, -P 를 통해 포트번호가 바뀌지 않도록 99 를 주었다.
# ./tcpdpriv -A 50 -P 99 -w test2.pcap -r test.pcap
# tcpdump -r test2.pcap | more
11:11:34.534756 IP 16.76.127.170.48603 > 92.36.179.36.domain: [|domain]
11:11:34.545974 IP 92.36.179.36.domain > 16.76.127.170.48603: [|domain]
11:11:34.546180 IP 16.76.127.170.60837 > 92.36.179.36.domain: [|domain]
11:11:34.554454 IP 92.36.179.36.domain > 16.76.127.170.60837: [|domain]
11:11:34.555094 IP 16.76.127.170.45918 > 136.110.214.97.www: S 2001641216:2001641216(0) wi
n 5840 <nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop>
11:11:34.685957 IP 136.110.214.97.www > 16.76.127.170.45918: S 959091973:959091973(0) ack
2001641217 win 5672 <nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,n
op,nop,nop>
11:11:34.686035 IP 16.76.127.170.45918 > 136.110.214.97.www: . ack 1 win 365 <nop,nop,nop,
nop,nop,nop,nop,nop,nop,nop,nop,nop>
11:11:34.686326 IP 16.76.127.170.45918 > 136.110.214.97.www: P 1:614(613) ack 1 win 365 <n
op,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop>
11:11:34.816891 IP 136.110.214.97.www > 16.76.127.170.45918: . ack 614 win 108 <nop,nop,no
p,nop,nop,nop,nop,nop,nop,nop,nop,nop>
그러면, 위와 같이 IP 는 좀더 랜덤하게 변했지만, 포트번호는 그대로 유지하고 있다. 포트번호는 유지하면서 IP 주소만 변경하여 패킷파일을 전달하는 경우 사용될 수 있다.
tcpdpriv 는 간단하게도 사용할 수 있는 만큼, 패킷파일 에서 민감한 내용을 제거할 때 유용하게 사용할 수 있을것이다.
프로그램 정보 및 다운로드는 다음의 경로를 방문하면 된다 :
http://fly.isti.cnr.it/software/tcpdpriv/
다운 받은 파일은 컴파일 과정을 거쳐야 한다. 제작 된지 오래된 소스이기도 해서 첫 버전은 FreeBSD 와 같이 몇몇 시스템에서만 테스트 되었고 configure 옵션도 csh 로 지정되어 있었다.
지금 버전은 그래도 리눅스에서도 컴파일이 가능하다.
# ./configure
cat: VERSION: No such file or directory
./configure 를 통해 Makefile 이 만들어 지면 make 를 수행하자
debian:~/# make
gcc -g -Wall -c -o tcpdpriv.o tcpdpriv.c
tcpdpriv.c: In function ‘verify_and_print_args’:
tcpdpriv.c:1504: error: invalid storage class for function ‘usage’
tcpdpriv.c:1570: warning: implicit declaration of function ‘usage’
tcpdpriv.c: At top level:
tcpdpriv.c:1749: warning: conflicting types for ‘usage’
tcpdpriv.c:1749: error: static declaration of ‘usage’ follows non-static declaration
tcpdpriv.c:1570: error: previous implicit declaration of ‘usage’ was here
make: *** [tcpdpriv.o] Error 1
그런데 컴파일 하는 과정에서 에러가 발생한다. 이 에러는 다음과 같이 수정하면 된다
# vi tcpdpriv.c
tcpdpriv 소스파일을 오픈하고 두군데를 수정하면 된다.
1) 1504 라인에서 static void usage(char *cmd); => 를 void usage 로 변경
2) 1749 라인에서 static 을 삭제
그리고 다시 컴파일을 하면 된다.
# make
gcc -g -Wall -c -o tcpdpriv.o tcpdpriv.c
tcpdpriv.c:33: warning: ‘rcsid’ defined but not used
gcc -g -Wall -c -o tcpdutil.o tcpdutil.c
tcpdutil.c:24: warning: ‘rcsid’ defined but not used
gcc -g -Wall -o tcpdpriv tcpdpriv.o tcpdutil.o -lpcap
컴파일이 완료되면 다음과 실행하여 옵션들을 살펴볼 수 있다.
# ./tcpdpriv
attempt to write binary dump file to tty
usage:
./tcpdpriv [-Opq] [-a [[hh:]mm:]ss] [-A {0|1|2|50|99}] [-c count]
[-C {0|1|2|3|4|...|32|99}] [-F file] [-i interface]
[-M {0|10|20|70|80|90|99}] [-{P|T|U} {0|1|99}] [-r file]
[-s snaplen] [-w outputfile] [expression]
(one reasonable choice: ./tcpdpriv -P99 -C4 -M20 ...)
attempt to write binary dump file to tty
usage:
./tcpdpriv [-Opq] [-a [[hh:]mm:]ss] [-A {0|1|2|50|99}] [-c count]
[-C {0|1|2|3|4|...|32|99}] [-F file] [-i interface]
[-M {0|10|20|70|80|90|99}] [-{P|T|U} {0|1|99}] [-r file]
[-s snaplen] [-w outputfile] [expression]
(one reasonable choice: ./tcpdpriv -P99 -C4 -M20 ...)
간단하게 옵션 몇개를 살펴보자.
-A : IP 주소를 어떤식으로 표현할지를 결정한다. 레벨이 99인 경우 IP 주소는 변하지 않는다.
-c : 지정한 패킷 카운트 후에 종료한다.
-F : 사용할 필터를 지정
-i : 네트워크 인터페이스
-p : TCP, UDP 포트주소를 매핑한다.
-r : 읽어들일 패킷 파일을 지정
-w : 출력할 파일을 지정
위 옵션들을 보면 각 옵션마다 특정 값을 지정하는 것이 있어, 얼핏보면 복잡해 보인다.
간단하게 생각하면 0은 가장 안전한 옵션이라 생각하면 된다. 즉, 가급적 Private 한 정보는
제거하게 되고 , 99 는 많은 정보를 보여주는 것이라 볼 수 있다. 이런 개념으로 옵션에 사용되는 값을 이해하면 될것 같다.
직접 사용해 보는 것이 이해가 가능 빠르므로 한번 예를 살펴보자. 다음은 정상적인 일반 패킷 파일을 tcpdump 로 본 것이다.
11:11:33.480941 IP6 fe80::f95c:91a7:8bd8:6216.49403 > ff02::c.1900: UDP, length 146
11:11:34.532638 arp who-has 192.168.0.200 tell 192.168.0.240
11:11:34.534733 arp reply 192.168.0.200 is-at 00:01:36:2e:0b:a7 (oui Unknown)
11:11:34.534756 IP 192.168.0.240.48603 > kns.kornet.net.domain: 34133+ AAAA? www
.google.co.kr. (34)
11:11:34.545974 IP kns.kornet.net.domain > 192.168.0.240.48603: 34133 2/1/0 CNAM
E[|domain]
11:11:34.546180 IP 192.168.0.240.60837 > kns.kornet.net.domain: 30670+ A? www.go
ogle.co.kr. (34)
11:11:34.554454 IP kns.kornet.net.domain > 192.168.0.240.60837: 30670 8/4/4 CNAM
E[|domain]
11:11:34.555094 IP 192.168.0.240.45918 > pv-in-f99.1e100.net.www: S 2001641216:2
001641216(0) win 5840 <mss 1460,sackOK,timestamp 1127508 0,nop,wscale 4>
특별한 옵션을 사용하지 않고 -r 옵션을 통해 읽어들일 파일과 새로 저장할 파일을 지정하였다. 기본 옵션은 최대한 정보를 제거하는 것으로 설정되어 있다. (즉, 0 이다)
# ./tcpdpriv -w test2.pcap -r test.pcap
# map 32-bit addresses into sequential integers
# multicast addresses cloaked per -A and -C flags
# map 16-bit TCP port numbers into sequential integer
# map 16-bit UDP port numbers into sequential integer
# pktsin 138 pktsout 134 tooshort 0 uncoded 4
새롭게 저장된 test2.pcap 파일을 열어보면 IP 주소가 변경된걸 알 수 있다. 처음에 보였던 IPv6 와 ARP 정보도 보이지 않는다. 또한, 헤더 정보에 nop 이 많이 보여진다.
# tcpdump -r test2.pcap
11:11:34.534756 IP 1.0.0.1.1 > 1.0.0.2.2: UDP, length 34
11:11:34.545974 IP 1.0.0.2.2 > 1.0.0.1.1: UDP, length 132
11:11:34.546180 IP 1.0.0.1.3 > 1.0.0.2.2: UDP, length 34
11:11:34.554454 IP 1.0.0.2.2 > 1.0.0.1.3: UDP, length 314
11:11:34.555094 IP 1.0.0.1.tcpmux > 1.0.0.3.2: S 2001641216:2001641216(0) win 5840 <nop,no
p,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop>
11:11:34.685957 IP 1.0.0.3.2 > 1.0.0.1.tcpmux: S 959091973:959091973(0) ack 2001641217 win
5672 <nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop>
11:11:34.686035 IP 1.0.0.1.tcpmux > 1.0.0.3.2: . ack 1 win 365 <nop,nop,nop,nop,nop,nop,no
p,nop,nop,nop,nop,nop>
11:11:34.686326 IP 1.0.0.1.tcpmux > 1.0.0.3.2: P 1:614(613) ack 1 win 365 <nop,nop,nop,nop
,nop,nop,nop,nop,nop,nop,nop,nop>
11:11:34.816891 IP 1.0.0.3.2 > 1.0.0.1.tcpmux: . ack 614 win 108 <nop,nop,nop,nop,nop,nop,
nop,nop,nop,nop,nop,nop>
11:11:34.833127 IP 1.0.0.3.2 > 1.0.0.1.tcpmux: . 1:1419(1418) ack 614 win 108 <nop,nop,nop
,nop,nop,nop,nop,nop,nop,nop,nop,nop>
11:11:34.833160 IP 1.0.0.1.tcpmux > 1.0.0.3.2: . ack 1419 win 546 <nop,nop,nop,nop,nop,nop
,nop,nop,nop,nop,nop,nop>
그럼 다른 옵션을 한번 사용해 보자. IP 주소의 변화를 좀 주고, -P 를 통해 포트번호가 바뀌지 않도록 99 를 주었다.
# ./tcpdpriv -A 50 -P 99 -w test2.pcap -r test.pcap
# tcpdump -r test2.pcap | more
11:11:34.534756 IP 16.76.127.170.48603 > 92.36.179.36.domain: [|domain]
11:11:34.545974 IP 92.36.179.36.domain > 16.76.127.170.48603: [|domain]
11:11:34.546180 IP 16.76.127.170.60837 > 92.36.179.36.domain: [|domain]
11:11:34.554454 IP 92.36.179.36.domain > 16.76.127.170.60837: [|domain]
11:11:34.555094 IP 16.76.127.170.45918 > 136.110.214.97.www: S 2001641216:2001641216(0) wi
n 5840 <nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop>
11:11:34.685957 IP 136.110.214.97.www > 16.76.127.170.45918: S 959091973:959091973(0) ack
2001641217 win 5672 <nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,n
op,nop,nop>
11:11:34.686035 IP 16.76.127.170.45918 > 136.110.214.97.www: . ack 1 win 365 <nop,nop,nop,
nop,nop,nop,nop,nop,nop,nop,nop,nop>
11:11:34.686326 IP 16.76.127.170.45918 > 136.110.214.97.www: P 1:614(613) ack 1 win 365 <n
op,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop>
11:11:34.816891 IP 136.110.214.97.www > 16.76.127.170.45918: . ack 614 win 108 <nop,nop,no
p,nop,nop,nop,nop,nop,nop,nop,nop,nop>
그러면, 위와 같이 IP 는 좀더 랜덤하게 변했지만, 포트번호는 그대로 유지하고 있다. 포트번호는 유지하면서 IP 주소만 변경하여 패킷파일을 전달하는 경우 사용될 수 있다.
tcpdpriv 는 간단하게도 사용할 수 있는 만큼, 패킷파일 에서 민감한 내용을 제거할 때 유용하게 사용할 수 있을것이다.
2010년 5월 5일 수요일
TCP, UDP 세션별로 패킷(PCAP) 파일 분할하기
PCAP 파일을 자르기 위한 방법을 몇번 언급하였다. 아래는 이와 관련된 포스팅 이므로,
참고하지 못한 분들은 읽어보기 바란다.
- 2010/01/19 pcap-util 을 이용한 또 다른 패킷 분할 방법
- 2010/01/18 분석할 패킷 데이터 크기가 큰 경우는 이렇게 하자!
- 2009/12/14 EditCap 을 통해 패킷 파일을 맘대로 주무르자!
이번에 소개하고자 하는 것은 세션 기반의 파일 자르기 이다. 기존에 소개하였던 것이 개수별, 바이트별로 패킷파일을 잘랐다면 이것은 TCP 또는 UDP 세션별로 자르게 된다. 특정한 세션만 봐야 되는 경우, 편리하게 이용할 수 있을 것이다. 또한, 어떤 세션이 많이 있었는지도 판별하기도 쉬워질 것이다.
소개하는 프로그램의 이름은 SplitCap 이며, 윈도우 기반의 프로그램이다.
[SplitCap]
[다운로드]
실행하면 아래 그림과 같은 도움말을 볼 수 있다.

각 옵션을 정리해 보면 아래와 같다:
-r : 읽어들일 pcap 파일을 지정
-o : 결과파일이 나올 디렉토리를 지정
-d : 이전의 데이타 파일 삭제
-p : 파일별 세션의 개수를 지정
-b : 파일별 저장 크기 ( 크기는 바이트 기준)
-s : 트래픽을 그룹으로 나누어 저장 (각 호스트별, 각 호스트 통신 간, 세션별 )
사용은 아주 간단하다.

C:\SplitCap_1-2>SplitCap.exe -r udp_8338.pcap
Splitting pcap file into seperate pcap files...
100%
Please wait while closing all file handles...
실행하면 옆 화면과 같이 세션별로 파일이 나눠진다. 그 형태를 보면
프로토콜, 출발지 IP, 출발지 포트, 목적지 IP, 목적지 포트 로 나온다.
프로토콜, 출발지 IP, 출발지 포트, 목적지 IP, 목적지 포트 로 나온다.
다른 파일 나누기 보다 세션별로 나눌때는 아주 유용할 것이다. 더불어 -s 를 이용한 그룹별 분리도 유용하다.
host 간 트래픽을 저장한다면 -s host 를 사용하면 된다.
이제 어떤 PCAP 을 받더라도 여러분들이 원하는 형태로 쉽게 나눌 수 있을 것이다. :-)
2010년 4월 30일 금요일
패킷(Packet) 편집/생성을 윈도우에서 쉽게 해보자!
리눅스 환경에서의 도구를 많이 소개했는데, 이번에는 윈도우 기반의 도구 하나를 소개한다. 패킷 편집을 쉽게 할 수 있는 도구이다. 가끔 작업을 하다보면 패킷을 내가 원하는 대로 수정하여 전송하거나 그럴 필요성이 있다. 제품의 테스트라든지, 탐지 패턴 규칙 테스트 형태들이 이에 속할 것이다.
아래 도구는 패킷의 각 필드를 세부적으로 쉽게 수정할 수 있는 기능을 제공해 주고, 바로 전송할 수 있도록 해 준다. 물론, 교육적, 개인적으로 사용하는 것은 무료이다. Colasoft Packet Builder 로 다음 사이트에서 다운로드 받을 수 있다.
사용하기도 워낙 쉬어서 실행하고 Add 나 insert 를 선택하여 패킷 형태를 선택해 주고 각 세부 정보를 수정하면 된다. 또는 기존에 만들어진 PCAP 파일등을 Import 할 수 있다. 헤더 정보를 수정하면 Checksum 값이 달라지는데 기본적으로 Checksum 을 자동으로 계산하여 반영해 준다.

원하는 대로 수정하고 나서 전송할 패킷을 선택하고 Send 를 선택하면 다음 화면을 볼 수 있다.
몇번을 전송할지 정할 수 있으며 ( 0 은 무한 루프이다) 기본 설정을 하고, Start 를 누르면 전송이 된다.


자 그럼 위에서 설정한 것과 같이 전송이 된다. TCP 전송을 하면서 1.1.1.1 을 찾는 ARP 도 같이 발생하였다.


패킷을 생성하는 이 프로그램은 워낙에 인터페이스가 쉬우면서도 직관적이어서 패킷에 대한 기본 지식이 있으면 어렵지 않게 사용할 수 있다. 패킷 편집이 필요하다면 한번 사용해 보세요!.
2010년 1월 19일 화요일
pcap-util 을 이용한 또 다른 패킷 분할 방법
패킷파일이 큰 경우 Editcap 과 tcpslice 를 이용하여 패킷을 분할하는 방법에 대해서 알아보았는데, 추가로 다른 유용한 툴 한가지를 더 소개하고자 한다. 펄(Perl)로 만들어진 것으로, 사용법도 간단하고 오히려 쉽게 사용할 수 있는 부분이 있는거 같아 유용할 것이다.
파일은 다음의 경로에서 받을 수 있다.
일단, pcap-util 을 실행해 보면 옵션은 크게 split, time, filter 로 나뉘어져 있다.
tmp# ./pcap-util
This utility will take a pcap file from a packet capture program like tcpdump
and split it into smaller parts to aid analysis. There are three options.
1. You can split the file into several smaller ones of x bytes in length
2. You can extract packets that fall within a specified time period
3. You can extract packets that match a libpcap filter string.
Split into smaller files
------------------------
./pcap-util split <infile> <outfile prefix> <size in MB>
Extract packets from time period
--------------------------------
./pcap-util time <infile> <outfile> <Start time> <End time>
Extract packets using libpcap filter language
---------------------------------------------
./pcap-util filter <infile> <outfile> "libpcap filter string"
** Time format should be YYYY-MM-DD:hh:mm:ss **
/tmp# ./pcap-util split rigel.pcap output.pcap 1 Writing file output.pcap.0.tcpdump Writing file output.pcap.1.tcpdump Writing file output.pcap.2.tcpdump Writing file output.pcap.3.tcpdump Writing file output.pcap.4.tcpdump Writing file output.pcap.5.tcpdump Writing file output.pcap.6.tcpdump Writing file output.pcap.7.tcpdump Writing file output.pcap.8.tcpdump ====> Done <==== /tmp# ls -l total 93368 -rw-r--r-- 1 root root 1023460 2010-01-19 08:54 output.pcap.0.tcpdump -rw-r--r-- 1 root root 1023472 2010-01-19 08:54 output.pcap.1.tcpdump -rw-r--r-- 1 root root 1023490 2010-01-19 08:54 output.pcap.2.tcpdump -rw-r--r-- 1 root root 1023466 2010-01-19 08:54 output.pcap.3.tcpdump -rw-r--r-- 1 root root 1023498 2010-01-19 08:54 output.pcap.4.tcpdump -rw-r--r-- 1 root root 1023676 2010-01-19 08:54 output.pcap.5.tcpdump -rw-r--r-- 1 root root 1023570 2010-01-19 08:54 output.pcap.6.tcpdump -rw-r--r-- 1 root root 1023559 2010-01-19 08:54 output.pcap.7.tcpdump -rw-r--r-- 1 root root 83061 2010-01-19 08:54 output.pcap.8.tcpdump -rwxr-xr-x 1 root root 8736 2009-08-30 18:16 pcap-util -rw-r--r-- 1 root root 8271060 2010-01-18 09:25 rigel.pcap타임은 "YYYY-MM-DD:hh:mm:ss" 와 같은 포맷으로 시간을 지정하여 사용하면 된다. filter 는 걸러진 파일에 대해서만 추출하여 저장한다. 아래 예제는 cl.exe.pcap 에서 TCP 이며 목적지 포트가 80 번 인것을 대상으로 output.pcap 에 저장하고 있다.
/tmp# ./pcap-util filter cl.exe.pcap output.pcap "tcp and dst port 80" Writing packets matching "tcp and dst port 80" to output.pcap ====> Done <==== /tmp# ls -l total 88948 -rw-r--r-- 1 root root 2334504 2010-01-19 09:01 cl.exe.pcap -rw-r--r-- 1 root root 1442126 2010-01-19 09:02 output.pcapcl.exe.pcap 이 2.3 메가 정도 였는데, 80 번포트로 걸러낸 것은 1.4 메가 정도 나온다. 이 외에 유용한 것이 있으면 알려주세요.
피드 구독하기:
글 (Atom)

