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

2011년 3월 18일 금요일

HTTP 패킷 정보에서 호스트별 통계정보를 쉽게 뽑아보기

전달받은 패킷 파일을 열어보았더니, 대부분이 HTTP 트래픽이다. 그런데, 이 데이터는 특정 사이트 몇 군데를 대상으로 한 DDoS 트래픽으로 추정된다.  자 , 이렇게 가정해 보고 각 사이트별로 트래픽이 얼마나 발생되었는지 데이터를 추출해 본다면 어떻게 해야 할까?

지금 여러분들의 머리속에 딱 떠오르는 방법은 무엇인가? HTTP 프로토콜의 호스트 필드 헤더가 있으니 이걸로 필터를 걸어 일일이 다 추출해야 하나? 아니면 프로그램을 간단히 작성해야 하는가. 방법은 여러가지가 있을 것 같은데 막상 하려니 정리가 잘 되지 않는다면 와이어샤크에서 제공하는 통계 정보를 이용해 쉽게 얻을 수 있다.

앞서 여러 포스팅에서도 와이어샤크의 Statistics 의 몇 가지 기능에 대해서 소개한 적이 있다. 이럴때 가장 쉽고 빠르게 통계 데이터를 알아낼 수 있는 방법은 Statistics -> HTTP -> Requests... 메뉴를 이용하면 된다.  선택하게 되면 필터를 걸수 있는 화면이 나오는데, 전체를 대상으로 할 것이므로 그냥 'Create Stat' 를 바로 누르면 아래와 같은 정보를 볼 수 있다.


HTTP 호스트별로 구분하여 전체 Count 가 얼마이며, 전체 패킷중 몇 % 를 차지하고 있는지도 보여준다. 급하게 필요하여 사용하려고 하면 떠오르지도 않고, 빨리 호스트별로 트래픽 정보를 산출하고자 할때는 이만한게 없다. 

기본기능만 잘 알아두어도 패킷분석의 반은 끝난다. 더불어, 패킷인사이드 내용만 머리속에 잘 기억해 두어도 나중에 언젠가는 유용하게 사용될 것이다.   :-)

From Rigel

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 을 통해 나온 그 데이터의 결과만 보지 말고 다양하게 활용할 수 있는 방법을 생각해 보면 무궁무진하다. 비싼 도구 없이도 오픈소스만으로도 멋진 보고서를 만들어 보도록 하자.

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