2011년 1월 4일 화요일

패킷정보를 요약하여 통신내용을 한눈에 살펴보자!

패킷파일 안의 내용이 간단하면 분석가가 직접 눈으로 살피는 것 만으로도 어느정도 파악이 쉽게 된다. 그런데, 패킷파일이 수십메가 이상이 되어버리면 분석은 쉽지 않아진다. 더군다나, 아주 다양한 내용으로 까지 구성되어 있다면 더욱 힘들다.

그렇기 때문에 패킷분석기의 도움을 받는 것이다. 하지만, 때로는 간단히 대략 살펴보고 싶기도 하다. 이럴때 유용하게 사용할 수 있는 것이 있다. 패킷파일안에서의 통신과정을 대략 요약하여 정리해 보여주는 'nstreams' 라는 것이 있다. tcpdump 형태를 분석해 줄 수 있는 도구로 보면 된다. 일단, 다운로드는 다음의 경로에서 할 수 있다.

http://www.hsc.fr/ressources/outils/nstreams/

다운받은 후 컴파일은 아래와 같은 순서로 진행하면 된다.

# tar -zxvf nstream-1.0.0.tar.gz
# cd nstreams
# ./configure
# make
# make install

이외 APT 패키지 사용자는
# apt-get install nstreams 로 간단히 설치할 수 있다.

관련파일이 2가지가 있는데, 없어도 사용하는데는 문제없다. 다만, 본인의 네트워크를 정의하거나 또는 사용 서비스를 정의해 놓으면 출력 내용을 볼 때 편리한 점은 있다.

1) 서비스 정의
nstreams-services 라는 파일이 있다. 여기에 프로토콜의 이름 같은 것을 정의할 수 있는데 형태는 아래와 같다 :

 protocol_name:server_port(s)/{udp,tcp}:client_ports(s)
 또는
 protocol_name:type(s)/icmp:code(s)

제일 앞에 프로토콜의 이름이 온다. 그리고 서버의 포트 그리고 클라이언트 포트 정보가 오는데 대략 봐도 어떤 형태의 구성인지 쉽게 이해가 될 것이다.

# vi /etc/nstreams-services
telnet:23/tcp:any
bsd-passive-ftp:49152-65535/tcp:1024-65535
icmp-echo-request:8/icmp:0
bootps:67/udp:68

2) 네트워크 정보
네트워크의 영역을 정의해 놓을 수 있다.
internal-network:192.168.1.0/24
test-network:212.198.0.0/16
internet:0.0.0.0/0

정의해 놓으면 화면 출력시 좀더 이해하기 쉬워지는데, 이것은 아래 출력 예제를 보는
것으로 쉽게 이해가 될 것이다.

# nstreams -f test.pcap
dns traffic between 192.168.0.240 and 168.126.63.1
http traffic between 192.168.0.240 and 72.14.213.99
http traffic between 192.168.0.240 and 74.125.127.102
http traffic between 192.168.0.240 and 72.14.213.103
http traffic between 192.168.0.240 and 72.14.213.100

아래서는 해당 네트워크 대역이 정의해 놓은 것으로 치환되어 나타난다.

# nstreams -n /etc/nstreams/nstreams-networks -f test.pcap
dns traffic between private-network and internet
http traffic between private-network and internet

또 파일 외에 -l 로 인터페이스를 지정하면 실시간으로 볼 수도 있다. 
# nstreams -l eth1 
http traffic between private-network and internet
http traffic between 192.168.15.11 and 219.94.214.228
http traffic between 192.168.15.11 and 74.125.53.132
http traffic between 192.168.15.11 and 210.171.226.45
icmp-unreach traffic between 192.168.15.11 and 168.126.63.1
http traffic between 192.168.15.11 and 74.125.127.113
http traffic between 192.168.15.11 and 128.31.0.36
http traffic between 192.168.15.11 and 35.9.37.225
telnet traffic between 192.168.15.11 and 74.125.127.105
icmp-unreach traffic between 192.168.15.11 and 168.126.63.2
http traffic between 192.168.15.11 and 86.59.118.153
http traffic between 192.168.15.10 and 72.14.213.191


출력되는 형태가 간단하여 분석할 패킷파일의 용량이 큰 경우에는 대략적인 형태를
파악하는데 도움이 될 것이다. 또 오픈소스 이므로, 본인이 원하는 형태로도 수정하여
사용가능하다. 예를 들어, 출력되는 부분을 약간 바꿔보고자 한다.

그럼, output.c 소스파일을 열어 살펴보자. 목적지 포트가 1024 인 경우에 조금
다르게 출력해 본다면, printf 로 출력되는 부분을 살짝 변경해 더 쉽게 볼 수 있게 한다든지
원하는 형태로 할 수 있다.

void
standard_output(output, status)
 struct output * output;
 int status;
{
 if(status)return;
 if(!strcmp(output->serv_name, "unknown"))
 {
  if(!opt_u)
  {
    if(output->dport > 1024) {
  printf("[* Suspicious > 1024] Unknown %s traffic between %s:%d and %s:%d  \n",
    output->asc_proto,
        output->src, output->sport,
    output->dst, output->dport);
    } else {
  printf("Unknown %s traffic between %s:%d and %s:%d\n",
    output->asc_proto,
        output->src, output->sport,
    output->dst, output->dport);
    }
  }
 }

오픈소스이기 때문에 내 상황에 맞게 적절히 수정하여 사용한다면 내 입맛에 맞는
최고의 분석도구가 될 것이다.  이게 바로 오픈소스의 맛 아닐까?

댓글 없음:

댓글 쓰기