레이블이 그래프인 게시물을 표시합니다. 모든 게시물 표시
레이블이 그래프인 게시물을 표시합니다. 모든 게시물 표시

2012년 4월 4일 수요일

Gnuplot 을 이용한 패킷 데이터 그래프 생성

 패킷 데이터가 많은 경우에는 텍스트 형태로만 확인하는 것이 어려워진다. 이럴 때 유용하게 사용될 수 있는 것이 비주얼한 방법을 사용하는 것이다. 가장 일반적인 것이 그래프 기능이며, 많이 사용되는 와이어샤크에도 간단한 그래프 기능이 있다.  이미  블로그에서도 와이어샤크에서 데이터를 CSV 로 추출하여 엑셀을 이용하여 만드는 방법을 소개하기도 하였다.

앞으로 다양하게 그래프를 만들어보기 위한 방법을 소개해 볼 것인데 그 중에 하나로, Gnuplot 을 살펴보려고 한다. Gnuplot 은 많은 플랫폼에서 이미 사용가능하도록 포팅되어 있으며 크게 2가지 모드로 사용이 가능하다. gnuplot 커맨드 프롬프트를 통해서 인터렉티브하게 그래프를 생성할 수 있는 방법과  파일에서 커맨드를 읽어들여 사용할 수 있는 배치모드가 있다.

우선,  패킷 데이터를 수집한다.

$ tcpdump -i eth0 -w output.pcap

수집된 패킷데이터에서 80 번포트를 대상으로 필터링하여 아래와 같은 출력형태로 tcp_80.txt 파일로 저장한다. (-tttt 옵션으로 날짜 출력을 조정하였다)

$ tcpdump -r output.pcap -nq -tttt 'tcp port 80' > tcp_80.txt

2012-04-02 09:46:04.382760 IP 192.168.10.53.80 > 192.168.10.40.39026: tcp 0
2012-04-02 09:46:07.361469 IP 192.168.10.40.59746 > 211.115.x.x.80: tcp 0
2012-04-02 09:46:07.370499 IP 211.115.x.x.80 > 192.168.10.40.59746: tcp 0
2012-04-02 09:46:07.489464 IP 192.168.10.40.42280 > x.x.206.100.80: tcp 0
2012-04-02 09:46:17.953463 IP 192.168.10.40.45101 > 199.7.x.x.80: tcp 0

이 데이터에서 cut 명령어를 통해 날짜 부분만을 잘라내고 정렬을 하여 uniq 명령어를 통해 카운트를 계산한다. 그리고 출력된 데이터에서 awk 를 통해 두번째 값과 첫번째 값을 출력하여 pps.txt 파일에 저장한다.

$ cut -c 12-21 tcp_80.txt | sort | uniq -c | awk '{print $2 " " $1}' > pps.txt

09:39:25.9 1
09:39:26.5 1
09:39:26.6 1
09:39:26.7 13
09:39:26.8 48
09:39:26.9 20
09:39:27.0 8
09:39:27.1 1
09:39:27.2 2
09:39:27.3 69
09:39:27.4 10
09:39:27.5 39
09:39:27.6 66
09:39:27.7 68
09:39:27.8 46
09:39:27.9 23
09:39:28.0 4
09:39:28.2 4
09:39:28.4 1
09:39:28.6 2

위와 같은 형태로 시간과 카운트 값이 저장된다. 바로 이 데이터가 gnuplot 으로 이용되는 것이다. 여기서는 간단한 예제로 초당 패킷카운트를 얻기 위해 사용된 것이고, 만들어내고자 하는 그래프 형태에 따라 다양하게 만들 수 있다.
gnuplot 을 실행하면 명령어를 입력하여 사용할 수 있으며, 아래 예제를 보는 것만으로도 대략적인 사용방법이 이해될 것이다.

$gnuplot
gnuplot> set title "TCP Port 80 packets/sec"
gnuplot> set xdata time
gnuplot> set xlabel "Time"
gnuplot> set ylabel "per Second"
gnuplot> set timefmt "%H:%M:%S"
gnuplot> set format x "%H:%M:%S"
gnuplot> set datafile separator " "
gnuplot> set style line 2 linecolor rgb "#00ff00" lw 1
gnuplot> plot 'pps.txt' using 1:2 title "packets" with line ls 1

그래프의 타이틀을 정해주고  x, y 축에 각각 사용할 레이블 정보를 지정해 준다. x 축은 시간이 사용되는데 시간 포맷을 지정해 주었다. 데이터파일은 공백으로 구분되어 있고, 라인스타일은 2번으로 정의하였다. 그리고 plot 명령어로 앞서 만든  pps.txt 데이터의 첫번째 두번째 데이터를 사용한다고 지정하였다. plot 명령어를 실행하면 바로 아래와 같은 그래프 정보를 얻을수 가 있다.



그래프를 통해 큰 변화가 보이는 부분을 쉽게 볼 수가 있다. 여기서는 간단히 PPS 기준으로 출력하였지만, 여러분들이 얻고자 하는 데이터 형태에 따라서 만들어 내는 기본 데이터가 달라진다. 내가 만들어내는 그래프를 통해서 무엇을 얻고자 하는가에 따라서 앞서 만들어내는 기본 데이터도 그것에 맞게 만들어내야 하는 것이다.

앞서 Gnuplot 은 두가지 모드가 있다고 하였는데, 나머지 하나는 배치모드로 사용되는 명령어는 동일하며 다만 파일로 만들어 연속적으로 배치작업 형태와 같이 실행되도록 하는 것이 있다.

에를 들어, graph_pps.plot 이라는 파일에 다음과 같은 내용을 정의한다.

set title "TCP Port 80 packets/sec"
set terminal png
set xdata time
set xlabel "Time"
set ylabel "per Second"
set timefmt "%H:%M:%S"
set format x "%H:%M:%S"
set datafile separator " "
set style line 1 linecolor rgb "#000000" lw 1

plot 'pps.txt' using 1:2 title "packets" with line ls 1

set output "packets_count.png"

그리고 gnuplot 에서 이 파일을 지정해 주기만 하면된다.

$ gnuplot graph_pps.plot

실행하게 되면 packets_count.png 파일이 만들어져 있을 것이다. 앞선 것과의 차이점은 output 으로 만들어질 것을 정의했다는 것이 다르다.

어떻게 보면 CSV 형태로 데이터를 뽑아내서 GUI 환경을 통해 만들어내는 것이 더 쉬울수도 있지만 그것은 여러분의 선택에 달려있다. 한가지 방법보다는 여러가지의 방법을 알고서 사용하는 것이 때에 따라서는 유용하기 때문이다.
이번에는 기본적인 그래프 형태만을 출력해 보았지만, 필자가 더 다양한 형태로 만들어 보게되면 다시 한번 공유해 보도록 하겠다. Gnuplot 이 익숙하지는 않다보니 더 공부가 필요할 것 같다.
:-)
그래프는 단지 이쁘게 만들어내기 위한 것이 아니라, 수 많은 데이터에서 어떻게 하면 빠르고 그리고  의미있는 데이터를 찾아낼 수 있는 가에 뜻을 두어야 한다. 패킷분석에서 비주얼을 이용하는 것도 바로 이런 이유가 있기 때문이다.

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!


2010년 5월 24일 월요일

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

패킷 분석 상용프로그램을 보면 이쁘게 나오는 화면에 부러울 따름이다. 물론, 일전에 소개한
자바기반의 프로그램과 같은 것에서는 비주얼한 화면을 보여주기도 하지만,
전반적으로 오픈소스 패킷 분석기에서는 이런 기능이 약한건 사실이다. 비주얼 적으로는 약하지만
그래프가 가르키는 그 의미를 표현하는데는 부족하지 않을 것이다.

와이어샤크의 IO Graphs 기능을 이용하면 어느 정도 표현이 가능하다.  자 일단 화면을 살펴보면
결과는 아래와 같다. Filter 라고 입력되어 있는 부분에 와이어샤크의 출력필터를 이용하여 출력해 낼 것을
선별적으로 거를 수 있다.  그래프 스타일은 Line, Impulse, FBar, Dot 와 같이 4가지 중 하나를 선택할 수 있다.
그리고, 그래프에서 표현하는데 중요한 X 축과 Y 축이 있다. X 축은 시간 주기를 정한 것으로 1초부터 0.1, 0.01 초 등 다양하다. View as time of day 를 클릭하면 시간으로 표시되고, Y 축은 패킷, 바이트, 비트로 나누어 표시된다.  아래예제에서는, 간단히 대표적 프로토콜만 필터에 입력하여 사용한 것으로 검정색 부분은 전체를 뜻한다. TCP 부분인 녹색을 보면 전체적으로 패킷이 TCP 형태임을 알 수 있고, 빨간색은 UDP 로 전체 패킷에서 아주 일부분 밖에 되지 않는다는 것을 쉽게 알 수 있다.

그래프 사용은 아주 쉽게 표현될 수 있는데, 표현하고자 하는 목적에 따라 사용이 달라질 것이다. 중요한 것은

- 그래프를 사용하고자 하는 목적에 따라 달라진다는 점과
- 그래프에 포함시켜 출력하고자 하는 데이터는 무엇인지
- 그 데이터의 범위는 어디까지 인지 정해야 한다. 데이터의 범위라 하면 특정 프로토콜 이든지
또는, 필터를 통해 특정 데이터로 한정한다. 예를들어, UDP 포트가 8338 이라면 udp.port == 8338 과
같이 사용한다. 와이어샤크의 출력필터는 이전에 언급한 포스팅 내용을 참고해 보기 바란다.
- 마지막으로 그래프의 스타일을 정해야 한다. 한 화면에 표현되는 내용이 많으면 그래프가
명확하게 보이지 않기 때문에, 어느 것을 라인으로 표시하고 어느 것을 바 형태로 표현할지 정해야 한다.


그래프는 직접 사용해 보면 어렵지 않다는 것을 알 수 있을 것이다. 와이어샤크의 Statistics -> IO Graphs 를 클릭해보고 사용해보자.  그리고 위 화면에 Copy 는 CSV 형태로 데이터를 저장해 준다. 아래 화면을 보면
다섯개의 그래프 수치가 표현되어 있다. 이걸 어디에 사용할 수 있을까 ? 이것은 다음 그래프 활용과정에서 소개하겠다.  마지막으로 Save 는 화면을 BMP, JPEG 와 같은 이미지 형태로 저장해 주는 기능을 제공한다.
다음 포스팅에서 그래프를 좀더 효과적으로 활용할 수 있는 방법을 소개하겠다.

2010년 4월 27일 화요일

패킷 분석 비주얼(Visual) 하게 살펴보자 - NetGrok

수 많은 패킷 파일 데이터와 뚫어져라 쳐다보는 눈과의 싸움. 그렇기 때문에 패킷 분석 시 어떻게 하면
빨리 분석을 수행할 수 있을지 다양한 방법들이 있다. 특히, 비주얼하게 패킷 데이터를 볼 수 있으면
분석은 한층 쉬워질 것이다. 다양하게 표현하는 방법이 있지만, 그 중에서도 오늘 소개해 보고자 하는 것은
NetGrok 이다.

자반 기반으로 플랫폼에 독립적으로 사용이 가능하며, 실시간적으로 비주얼 하게 표시도 해주며
PCAP 포맷의 패킷파일도 표현할 수 있다. 또한, 트리맵 구조로도 표시가 가능하다. 이렇게 설명하는 것 보다
직접 한번 보고 실행해 보는 것이 낳을 것이다.

일단, 관련 정보 및 파일은 아래의 URL 에서 받을 수 있다.


다운 받은 netgrok20080928.zip 의 압축을 해제하면 여러 파일들이 보이는데 그 중에서 배치파일이
눈에 띄일 것이다. netgrok20080928.bat 를 에디터로 열어 보면 아래와 같이 적혀 있다.

java -jar netgrok20080902.jar
pause

그런데, 실행해 보면 실행이 안된다. 그 이유는 파일의 이름이 잘못되어 있다. 다운 받은 파일은 20080928.jar
인데, 배치파일에는 20080902.jar 로 되어 있다. 아마 배포하면서 제대로 수정이 안된것 같으므로 20080928.jar
로 변경하여 수행해 보자.

실행해 보면 또 에러가 발생하였다. groups.ini 의 내용에서 문제가 생긴것 같은데,
groups.ini 를 보면

[local]
Private1=Wireless=192.168.0.0/16
Private2=172.16.0.0/12
Private3=10.0.0.0/8

위와 같다. 나의 경우는 첫 번째 라인을 아래와 같이 변경하고서는 정상적으로 수행이 되었다.

Private1=Wireless=192.168.0.0/16 -> Private=192.168.0.0/16 과 같이 변경

groups.ini 는 데이터를 표현할 때 하나의 그룹으로 표현될 주소를 기록해 두는 곳이다. 일단 실행하고
File 에서 실시간 패킷 캡쳐를 수행하면, 아래 그림과 같이 비주얼한 화면을 볼 수 있다. 현재의 상황에
따라 비주얼하게 각 데이터들이 움직이면서 변화하기 때문에, 특정 공격과 같은 특이한 행동 패턴은
금방 알아챌 수 있을 것이다.


좀더 테스트를 해보기 위하여 Syn Flooding 이 일어난 패킷 데이터를 가지고 테스트 해 보았다. 목적지
192.168.0.2 는 일부로 목적지 IP 를 변경한 것이고, 패킷파일의 목적지, 출발지 변경은 앞서 소개한
포스팅에서 다루고 있으니 tcprewrite 로 찾아보기 바란다.


자, 위와 같은 데이터를 읽어보았더니 아래와 같은 형태로 표시되었다. 가운데 192.168.0.2 를 중심으로
수 많은 녹색색깔의 원이 둘러 싸고 있다. 녹색색깔이 여러개 인 것은 소스 IP 주소가 랜덤하게
스푸핑 된 형태이기 때문이다. 즉, 목적지 한 곳으로 출발지가 아주 랜덤하게 다양한 것으로 추정할 수 있다.

아래 이미지는 TreeMap 으로 본 것이다. 전체 노란색에서 우측에 빨간색 부분이 약간 보인다.

오래 테스트 해보지는 않았지만, 비주얼하게 화면을 보여주는 면에서는 나쁘지 않았다. 다만, 대용량
패킷 파일을 처리하기에는 힘들어 보이지 않을까 한다. 로딩하여 데이터를 파싱하는 과정도 시간이
오래 걸리고 실시간적으로 표현하는 과정에서도 멈춤 현상이 보였다.

@Rigel

2010년 3월 19일 금요일

IP정보 추적, 연결관계를 그래프로 비주얼 하게 보자고

패킷 분석을 하다보면, IP 에 대해서 추적을 해 볼 필요가 있다. 그럼 보통 하는 작업이, WHOIS 를 통해
해당 IP 에 대해 기본정보를 알아본다. WHOIS 를 통해 이 IP 블럭이 누구의 소유인지 알 수 있고,
어느 국가에 할당된 것인지 알 수 있으므로 대략적으로 추정이 가능해 진다.

WHOIS 외에 해당 IP 의 연관관계를 추적하여 볼 수 있는 것을 소개해 보고자 한다.

http://www.robtex.com/ip/ 에 가서 IP 를 입력해 보면
- DNS 기반으로 연결된 곳
- 그래프로 비주얼 하게 연결관계 표시
- 후이즈(whois) 정보
등을 보여준다. (정확히 말하면 Reverse DNS 정보를 기준으로 찾아본다)

아래 예는, packetinside.com 의 IP 주소인데, 또 다른 관련한 도메인 주소들이 나온다.
즉, 텍스트큐브에서 운영중인 곳이다. 211.245.16.0/20 블럭은 AS9318 로 라우팅이
흘러가는데, 하나로 텔레콤이 소유중인 블럭이다. 추정해 보면 텍스크큐브에서 운영하는
장비들이 놓여있는 곳은 ? ^.^

IP 의 후이즈 정보 뿐만 아니라, DNS 와 연관된 추가 정보까지 보여주니
분석시에는 더욱 유용하다. 이렇게 IP 주소 하나만으로도 얻을 수 있는 정보는 많다.
나오는 정보에 따라 그 관계를 계속 찾고 찾아 들어가면 여러분이 찾고자 하는 정보를 얻을 수 있을지 모른다.

분석의 작업은 때로는 끝이없는 미로를 찾아들어가는 것과도 같다 :-)

아래의 이미지는 그래프 탭을 선택하여 본 화면으로 비주얼 하게 좀더 쉽게 볼 수 있도록 만들어 준다.