레이블이 openoffice인 게시물을 표시합니다. 모든 게시물 표시
레이블이 openoffice인 게시물을 표시합니다. 모든 게시물 표시

2010년 7월 20일 화요일

IP 주소의 위치정보를 활용하여 멋진 그래프 만들기

패킷파일을 열어보면 IP 정보들이 가득하다. 필요에 따라 IP 주소를 Whois 하여 찾아보고, 어느 국가의 것인지, 어느 기관의 것인지 알아볼 수 있다. 오늘은 패킷 파일의 IP 주소의 위치정보를 좀더 쉽게 확인할 수 있는 방법을 소개해 보고자 한다. 일단 도구가 필요한데, IPLocation 이라는 것을 받아보자.


IPLocation 은 각 IP 주소를 쿼리하여 위치 정보를 리턴해주는데, 보여주는 정보의 형태가 CSV 이다. 루비로 만들어져 있는 스크립트 형태이며, 사용하기 위해서는 루비 PCAP 라이브러리가 필요하다.
루비 PCAP 라이브러리는 다음의 경로에서 받을 수 있다.


PCAP 라이브러리의 컴파일은 ruby extconf.rb 를 실행해 주면 된다.

# ruby extconf.rb
checking for socket() in -lsocket... no
checking for gethostbyname() in -lxnet... no
checking for hstrerror()... yes
checking for pcap.h... yes
checking for pcap_open_live() in -lpcap... yes
checking for pcap_compile_nopcap()... yes
creating Makefile

그러면 위와 같이 Makefile 이 만들어지고 make 명령어를 통해 컴파일을 시작한다.

# make
cc -I. -I. -I/usr/lib/ruby/1.8/i486-linux -I. -DHAVE_HSTRERROR -DHAVE_PCAP_H -DHAVE_PCAP_COMPILE_NOPCAP  -D_FILE_OFFSET_BITS=64  -fPIC -I/usr/local/include  -c icmp_packet.c
cc -I. -I. -I/usr/lib/ruby/1.8/i486-linux -I. -DHAVE_HSTRERROR -DHAVE_PCAP_H -DHAVE_PCAP_COMPILE_NOPCAP  -D_FILE_OFFSET_BITS=64  -fPIC -I/usr/local/include  -c ip_packet.c
cc -I. -I. -I/usr/lib/ruby/1.8/i486-linux -I. -DHAVE_HSTRERROR -DHAVE_PCAP_H -DHAVE_PCAP_COMPILE_NOPCAP  -D_FILE_OFFSET_BITS=64  -fPIC -I/usr/local/include  -c packet.c
cc -I. -I. -I/usr/lib/ruby/1.8/i486-linux -I. -DHAVE_HSTRERROR -DHAVE_PCAP_H -DHAVE_PCAP_COMPILE_NOPCAP  -D_FILE_OFFSET_BITS=64  -fPIC -I/usr/local/include  -c Pcap.c
cc -I. -I. -I/usr/lib/ruby/1.8/i486-linux -I. -DHAVE_HSTRERROR -DHAVE_PCAP_H -DHAVE_PCAP_COMPILE_NOPCAP  -D_FILE_OFFSET_BITS=64  -fPIC -I/usr/local/include  -c udp_packet.c
cc -I. -I. -I/usr/lib/ruby/1.8/i486-linux -I. -DHAVE_HSTRERROR -DHAVE_PCAP_H -DHAVE_PCAP_COMPILE_NOPCAP  -D_FILE_OFFSET_BITS=64  -fPIC -I/usr/local/include  -c tcp_packet.c
cc -shared -o pcap.so icmp_packet.o ip_packet.o packet.o Pcap.o udp_packet.o tcp_packet.o -L. -L/usr/lib -L/usr/local/lib    -lruby1.8 -lpcap  -lpthread -ldl -lcrypt -lm   -lc

컴파일이 되었다면 make install 하는 것으로 쉽게 설치가 끝난다.

# make install
/usr/bin/install -c -m 0755 pcap.so /usr/local/lib/site_ruby/1.8/i486-linux
/usr/bin/install -c -m 644 ./lib/pcaplet.rb /usr/local/lib/site_ruby/1.8
/usr/bin/install -c -m 644 ./lib/pcap_misc.rb /usr/local/lib/site_ruby/1.8

자,이제 IPLocation 을 실행해 보자. 실행하면, 바로 패킷 캡쳐모드로 발견되는 IP 주소에 대한 정보를 보여준다.
Inbound 와 Outbound 로 나뉘어 보여지게 되며, 중지는 CTRL-C 를 누르면 된다.

# ./iploc.rb
Aggregating...CTRL-C to finish (if in live capture mode).
^CInbound Addresses:
168.126.63.1,KOREA, REPUBLIC OF (KR),(Unknown city),,,27
201.76.40.2,(Unknown Country?) (XX),(Unknown City?),,,1
75.126.229.92,UNITED STATES (US),(Unknown city),,,1
174.133.246.194,UNITED STATES (US),Houston TX,29.7687,-95.3867,2
189.126.108.2,(Unknown Country?) (XX),(Unknown City?),,,1
203.119.29.1,CHINA (CN),(Unknown city),,,1
89.253.195.102,RUSSIAN FEDERATION (RU),Moscow,55.75,37.6,1
59.6.145.185,KOREA, REPUBLIC OF (KR),(Unknown city),,,86
200.219.159.10,BRAZIL (BR),(Unknown city),,,1
174.129.200.54,UNITED STATES (US),Seattle WA,47.6218,-122.35,27
213.248.61.180,RUSSIAN FEDERATION (RU),Moscow,55.75,37.6,4
192.33.14.30,UNITED STATES (US),(Unknown city),,,4

Outbound Addresses:
59.6.145.185,KOREA, REPUBLIC OF (KR),(Unknown city),,,11
200.219.159.10,BRAZIL (BR),(Unknown city),,,1
301 packets received by filter
95 packets dropped by kernel

그럼 어떤 옵션들이 있는지 살펴보자.

# ./iploc.rb -h

Usage: iploc.rb [ -dnv ] [ -i interface | -r file ]
                [ -c count ] [ -s snaplen ] [ filter ]
Options:
  -n  do not convert address to name
  -d  debug mode
  -v  verbose mode

도움말은 아주 간단하다. 대략 어떤 형태의 옵션인지 추측이 가능할 것이다. -r 은 파일을 읽어 들이고, -c 는 카운트 만큼 동작하고 중지하며 필터는 tcpdump 와 같은 필터를 걸때 사용하는 것이다. 저장되어 있는 패킷파일이 있다면 -r 옵션을 통해 기록되어 있는 IP 주소의 위치 정보를 알 수 있다.

# ./iploc.rb -v -r fake.pcap
Aggregating...CTRL-C to finish (if in live capture mode).
Inbound Addresses:
93.186.124.94,(Unknown Country?) (XX),(Unknown City?),,,31
91.207.192.25,UNITED KINGDOM (GB),(Unknown city),,,10
125.56.214.113,(Unknown Country?) (XX),(Unknown City?),,,4
72.14.203.100,UNITED STATES (US),Mountain View CA,37.402,-122.078,3
188.124.7.155,TURKEY (TR),Bursa,40.1833,29.0667,5
66.249.89.104,UNITED STATES (US),Mountain View CA,37.402,-122.078,61
188.124.7.156,TURKEY (TR),Bursa,40.1833,29.0667,5
209.190.85.9,INDONESIA (ID),Gombong,-6.1167,107.117,12
[생략]

너무 많은 경우에는 -c 옵션을 통해 제한하면 카운트 만큼만 보여준다.

# ./iploc.rb -v -r fake.pcap -c 100

이렇게 얻은 정보는 유용하게 사용될 수 있는데, 결과로 나온 형태가 CSV 라는 점에 주목해야 한다.
CSV 로 얻었으니, 내가 원하는 형태로 가공하여 사용할 수 있다. 보고서에 이용하는 것이라면 그래프등으로
변환하면 더욱 유용할 것이다.  필자는 이렇게 얻어진 CSV 데이터를 오픈오피스(OpenOffice)를 통해 가공해 보았다. CSV 파일을 로드하고, 구분자 옵션으로 콤마를 선택한다. 그러면 아래 그림과 같이 이쁘게 분리가 된다.


이후, 데이터가 로드되었으니 자기 입맛에 맞게 만들어 사용하면 된다. 아래 예제는 데이터를 나라별로 정렬하여 통계를 내 본것이다.

텍스트 파일 보다는 훨씬 깔끔하고, 분포를 쉽게 볼 수 있다.  IPLocation 을 통해 나온 그 데이터의 결과만 보지 말고 다양하게 활용할 수 있는 방법을 생각해 보면 무궁무진하다. 비싼 도구 없이도 오픈소스만으로도 멋진 보고서를 만들어 보도록 하자.

참고로, 위 내용과 관련한 이전 포스팅을 참고하면 도움이 될 것이다.

2010년 5월 28일 금요일

와이어샤크(WireShark)의 그래프 기능 활용하기 - 고급편

그래프 기능 활용 기본편에 이어 이번에는 조금더 고급적으로 쓸 수 있는 방법을 소개하겠다. 와이어샤크의
IO Graph 기능을 단순히 와이어샤크로만 한정하지 않고 다른 방법을 통해 그래프도 좀도 이쁘게 만들 수 있는
방법과 그래프 생성시 SUM, MAX 와 같은 함수를 이용한 그래프 생성 방법이다.

자 일단, 아래의 그림을 살펴보자. 이것은 그래프를 생성할때 Y Axis 에서 Unit 을 Advanced 로 선택하면
Calc 라는 추가 입력을 볼 수 있다. 즉, 합을 구하거나 최대, 최소, 평균 값등을 계산할 때,
이 방법을 사용하면 유용하게 이용할 수 있다. 특정 프로토콜에서 계산이 가능한 값이 있을 경우, 함수를 통해
그래프를 생성하면 좀더 의미있는 형태로 만들 수가 있는 것이다. 아래 예제에서는 http.content_length (빨간색)을 바로 표현했고, 프레임 길이를 녹색으로 그리고 IP 프로토콜의 TTL 을 합산으로 사용해 보았다.
frame.len 을 보면 01:50:57 부터 일정하게 높은 수치가 유지되고 있고 있다. 이뜻은 이 시간에 전송한 패킷 프레임의 길이가 일정하게 큰 수준으로 계속 이어졌다는 것이다.

또한 그래프 화면에서 해당 지점을 클릭하면 어떤 패킷을 가르키는지 와이어샤크의 출력화면이 해당 패킷으로 움직이게 된다. 그래프를 보고서 의심스러운 지점을 찾아 쉽게 볼 수 있는 것이다.


위 화면은 여러분들에게 소개를 하기 위해 임의로 계산을 한 것이지만, 여러분들이 분석하고자 하는 데이터에
따라 사용한다면 아주 유용한 그래프가 될 것이다.

자, 다음으로는 앞서 기본편에서 언급한 IO Graph 에서 Copy 명령을 통해 CSV 형태로 저장할 수 있다고 설명하였다. Copy 를 누른 후 보면 각 데이터는 콤마(,) 로 구분되어 나열되어 있다. 이렇게 저장한 CSV 를 어떻게 활용할 수 있을까 ? 그렇다. 바로 CSV 를 지원하는 도구를 이용하면 그래프를 더욱 멋지게 생성할 수 있는 것이다. 우리가 업무에서 많이 활용하고 있는 엑셀(Excel) 을 예로 들어보자. 아래의 그래프 화면은 엑셀을 이용하여 만들어 본것이다. 엑셀에서 해당 파일을 로드할때 CSV 형태로 로드하면서 구분자는 콤마로 지정한다. 그러면 엑셀에서 원하는 영역을 선택하여 그래프로 만들어주면 아래와 같이 멋진 그래프로 탄생한다.

엑셀을 자유롭게 다루는 분이라면 훨씬 멋진 그래프 화면을 만들어 낼 수가 있을 것이다. 또 다른 예제로 오픈오피스를 이용한 그래프 생성에 대해서도 소개하고자 한다. 이 내용은 아래 주소에서 본 슬라이드를 보고서 소개하는 것이다.


필자는 주로 오픈소스를 사용하기를 원하는데, 적절한 소개인것 같다. 이번에도 마찬가지로, 똑같이 CSV 데이터를 이용하는 것이다. CSV 데이터를 이용하는 부분은 와이어샤크의 메인 화면에 출력되는 컬럼을 이용하는 것이다.

와이어샤크 메인의 기본 컬럼 구성은
번호, 시간, 출발지, 목적지, 프로토콜, 정보 로 구성된다. 이 화면에 출력된 내용을 CSV 로 저장할 수 있는 것이다. 그런데 기본 컬럼을 바꿀 수 있다는 사실을 알고 있을 것이다. Edit->Preference 를 선택하고 Columns 를 보면 된다. 바로 여기에서 아래 부분의 필드타입을 Packet length (bytes) 를 선택하고 Add 를 눌러보자. (컬럼 이름은 Length 라고 정의하였다)그러면 컬럼에 패킷의 길이가 추가된다. 여기 예에서는 패킷 길이를 선택하였지만, 원하는 형태로 선택할 수 있다.

자, 그리고 CSV 데이터를 얻기 위해 File -> Export -> File 을 선택해 보자. 아래 화면과 같이 파일 형식을 CSV 로 선택하고 저장할 파일이름을 적고 저장을 누른다.

이제, 우리가 사용할 데이터를 얻었으니 오픈오피스를 통해 그래프를 생성해 주는 일만 남았다. 오픈오피스 Calc 를 일단 실행하고 파일오픈을 선택하자. * 오픈오피스는 openoffice.org 에서 받을 수 있다.

파일 오픈시 읽어들일 데이터를 CSV 로 선택후 오픈하면 CSV 로 파싱할 화면이 나타난다. 그리고 구분자로 Comma 로 선택하면 필드가 제대로 나뉘어 진다.
그러면 엑셀 형태와 같이 데이터가 기록이 된다. 그래프를 생성해 내고자 하는 형태는 시간별로 얼마나
많은 패킷 데이터가 전송되었는지를 표현하기 위해서이다. 그래서, 앞서 와이어샤크에서 컬럼을 추가해
각 패킷 길이 컬럼을 추가한 것이다.

필요한 컬럼은 시간과 패킷 길이(바이트) 이다. 그런데 라인수가 엄청나다. 아무래도 시간대 별로 한개씩
다 기록되어 있으니 말이다. 그래서 활용하는 방법이 Subtotals 기능을 이용하는 것이다. 시간 컬럼을 기준으로
Length 의 합을 구하는 것이다. 아래 화면과 같이 Group by 에서 Time 을 선택하고 Subtotals 대상인 Length 를 선택후 사용할 기능으로 Sum 을 선택한다.

그러면 화면의 왼쪽 부분에 선 같은 것이 생길것이다. 거기서 2번을 눌러보면 아래 그림과 같이 만들어 진다. 이 화면에서는 불필요한 컬럼은 다 삭제하였고, 시간 부분에 합산을 하고 나면 12시36분27초 Sum 과 같이 생긴다. 이때는 Edit 기능에 있는 Find & Replace 기능을 활용해 변경할 문자열을 Sum 을 선택하고 대상 문자열을 공백으로 두고 Replace 를 눌러버리면 말끔하게 삭제할 수 있다.

이제 마지막까지 왔다. 드디어 그래프를 생성하기 위해 열을 선택하고 Insert 메뉴에서 Chart 를 선택하거나, 메인 화면의 차트 아이콘을 클릭하면 된다. 그리고서 생성을 하면 멋진 그래프가 만들어진다.


비록 하나의 그래프를 생성하기 위해 많은 사전 작업을 거쳤지만, 모든걸 무료로 사용할 수 있다는 점이 매력적이지 않은가? 와이어샤크의 그래프 생성이 비주얼 적으로 이쁘지는 않지만, 데이터를 CSV 로 저장하여 활용한다면 어느 프로그램보다도 멋지게 그래프를 생성할 수 있다.  여기서는 여러분들에게 소개하기 위해서 그래프가 볼품이 없을지도 모르지만, 그건 여러분들이 그래프 생성하는데 얼마나 시간을 쏟느냐에 따라 달려있는 것이다.

와이어샤크의 수 많은 데이터를 이용해서 멋진 그래프를 이제 생성할 수 있다는 사실 !
이제 여러분도 와이어샤크 만으로도 멋진 패킷 분석 보고서를 만들어 낼 수 있을 것이다.

멋진 그래프를 생성한다면 댓글을 달아주세요. 다른 분들과 공유할 수 있도록 예제로 소개해 드리겠습니다.
Good Luck to you!