Open Source/Kali Linux

[Network Sniffers] Netsniff-NG Tool Kit (1) On Kali Linux

DarkSoul.Story 2013. 6. 26. 14:24
반응형



1. 개요


Netsniff-NG Toolkit은 패킷을 분석하기 위한 고성능 Linux 네트워크 스니퍼이다. 제로카피(zero-copy) 매커니즘을 이용하여, 패킷을 캡처하고 분석 하기 때문에 매우 빠른속도로 처리할 수 있는것이 가장 큰 특징이다. Netsniff-NG Toolkit은 프로토콜 분석, 리버스 엔지니어링 및 네트워크 디버깅에 사용할 수 있는 훌륭한 도구이다.


제로카피(zero-copy) 

리눅스의 커널은 시스템을 보호 하기위해 프로세스의 주소 공간이 커널 영역과 유저(User:사용자)영역으로 구분되어 있으며, 두 영역은 서로 자유롭게 읽고 쓰기를 할 수 없게 되어 있다. 두 영역이 서로 읽고 쓰기를 하기 위해서는 커널 API를 이용해서 두 영역 사이에 일단 복사를 한 다음에야 가능하다. 예를 들어 어플리케이션에서 송신하는 패킷 데이터는 리눅스 커널의 네트워크 모듈을 통해 네트워크로 전송되며, 반대로 수신할 때도 네트워크 모듈을 통해 어플리케이션에 도착한다. 커널 영역과 유저 영역의 어플리케이션 사이에 송/수신되는 패킷은 커널 API를 통하여 두 영역 사이에서 복사가 된다. 사용자 공간과 커널 공간의 전환과정에서 병목 현상이 발생하여 고속 처리를 할 수 없게 된다. 제로 카피는 두 영역 사이에 복사 과정을 생략하여, 일반 어플리케이션 내에서 데이터를 처리하는 것 처럼 포인터만으로 데이터를 조작할 수 있는 방법을 말한다.


Netsniff-NG Tookit은 아래와 같은 도구들로 구성되어 있다.


- netsniff-NG : 고속 네트워크 패킷 분석기, PCAP 캡처 및 재생 도구

- trafgen : 멀티 스레드 low-level 네트워크 패킷 생성기

- mausezahn : 시스코 CLI에 따르면 HW / SW 어플라이언스 높은 수준의 패킷 생성기

- BPFC : 버클리 패킷 필터 컴파일러 (Berkeley Packet Filter compiler)Linux BPF JIT disassembler 

- ifpps : 커널 네트워킹 통계 도구

- flowtop : 네트워크 연결 추적 도구

- curvetun : curve25519 기반 IP 터널

- astraceroute : 자율 시스템(AS:autonomous system) 경로 추적 도구


Kali Linux에서는 netsniff-ng, ifpps, bpfc, flowtop, curvetun, astraceroute (Kali Linux에서는 ashunt라는 이름으로 설치되어 있다.)가 설치되어 있다.


2. 테스트 환경

운영체제 : Kali Linux 1.0.3

테스트에 사용된 도구 버전 : netsniff-ng 0.5.7


3. 분석 내용


1) netsniff-ng

mmap(2) 메커니즘을 기반으로한 빠른 네트워크 패킷 분석기이다. netsniff-ng는 패킷을 PCAP 파일로 기록/재생할 수 있으며 오프라인 및 온라인에서 패킷을 분석할 수있다. 또한 RAW 802.11 프레임을 캡처, 분석 , 재생도 지원한다. PCAP 파일은 tcpdump, Wireshark와 호환된다. 


- mmap(2) (메모리맵)

mmap(2)는 메모리의 내용을 파일이나 디바이스에 대응(mapping)하기 위해서 사용하는 시스템 호출이다.



옵션

설명

-i|-d|--dev|--in <dev|pcap>

네트워크 인터페이스 또는 PCAP 파일 선택

-o|--out <dev|pcap|dir|txf>

출력 방식 지정

(네트워크 인터페이스/PCAP/디렉터리/txtfile)

-f|--filter <bpf-file>

bpfc 파일에서 BPF 필터 사용

-t|--type <type>

지정한 패킷 유형만 처리

(host/broadcast/multicast/others/outgoing)

-F|--interval <uint>

지정한 시간 간격으로 패킷 덤프 파일 저장

(기본값 : 60)

-J|--jumbo-support

64KB Super Jumbo Frames지원

(기본값 : RX/TX slot: 2048Byte)

-R|--rfraw

Raw 802.11 프레임을 캡처 하거나 주입

-n|--num <uint>

지정한 수 만큼 패킷을 캡처 후 정지

`--     0

루프를 중단할 때 까지 (기본값)

`-     n

n개의 패킷을 전송하고 중지

Options for printing:

-s|--silent

캡처 한 패킷의 내용을 출력하지 않는다.

-q|--less

패킷 정보를 비교적 덜 자세히 출력

-X|--hex

패킷 데이터를 HEX 포맷으로 출력

-l|--ascii

패킷 데이터를 ASCII 코드로 출력

Options, advanced:

r|--rand

패킷 전달 순서를 무작위로 전달

-M|--no-promisc

네트워크 인터페이스를  promiscuous mode로 만들지 않는다.

-m|--mmap

Mmap pcap file

g|--sg

PCAP 파일 I/O 분산,수집

(Scatter/gather pcap file I/O)

-c|--clrw

느린 읽기 쓰기 사용

(Use slower read(2)/write(2) I/O)

-S|--ring-size <size>

수동으로 Ring Size 사이즈 설정

mmap space in KB/MB/GB, e.g. '10MB'

-k|--kernel-pull <uint>

커널과 사용자 간격을 줄인다.

(기본값 : 10us, TX_RING uspace의 페이로드로 채워진다)

(Kernel pull from user interval in us

Default is 10us where the TX_RING is populated with payload from uspace)

-b|--bind-cpu <cpu>

특정 CPU에 바인딩

(or CPU-range)

-B|--unbind-cpu <cpu>

특정 CPU 사용 금지

(or CPU-range)

-H|--prio-high

우선 순위가 높은 프로세스를 만듬

-Q|--notouch-irq

Do not touch IRQ CPU affinity of NIC

-v|--version

버전 정보 출력

-h|--help

Help


이제 netsnif-ng을 이용하여, 패킷을 캡처하거나 분석등의 방법을 간단히 알아보자.


 (1) 지정한 수 만큼 패킷 캡처

패킷을 캡처하는 도구들은 대부분 지정한 수 만큼 패킷을 캡처하는 기능을 가지고 있다. netsniff-ng 역시  [-n 또는 --num] 옵션을 적용하여 동일한 기능을 사용할 수 있다. 


root@kali:~# netsniff-ng -n 또는 --num <(숫자)>



root@kali:~# netsniff-ng -n 1

netsniff-ng 0.5.7

RX: 64.00 MiB, 32768 Frames, each 2048 Byte allocated

PROMISC

BPF:

 L0: ret #0xffffffff

MD: RX  lf64 none: prio 4

 

> 2 98 1372386028.658179

 [ Eth MAC (00:0c:29:80:91:03 => 00:50:56:fe:85:d8), Proto (0x0800, IPv4) ]

 [ Vendor (VMware, Inc. => VMware, Inc.) ]

 [ IPv4 Addr (192.168.119.168 => 74.125.128.105), Proto (1), TTL (64), TOS (0), Ver (4), IHL (5), Tlen (84)

   ID (0), Res (0), NoFrag (1), MoreFrag (0), FragOff (0), CSum (0x3772) is ok ]

 [ ICMP Type (8), Code (0), CSum (0x507e) ]

 [ chr ...Q............................ !"#$%&'()*+,-./01234567 ]

 [ hex  ec f2 cc 51 eb 0a 0a 00 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20

   21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 31 32 33 34 35 36 37 ]

 

           1  frames incoming

           1  frames passed filter

           0  frames failed filter (out of space)

      0.0000% frame droprate

           0  sec, 225960 usec in total


① Epoch Time

UTC(Universal Time Coordinated : 협정 세계시) 기반으로 1970-01-01 00:00:00 이후 초 당 1씩 증가한 정수 값으로 패킷이 캡처되는 당시의 시간을 의미한다. Epoch Time 값은 http://www.epochconverter.com/에서 변환하면, 2013년 6월 28일 오전 11:20:28이 된다.

② Ethernet 정보

출발지, 목적지 네트워크 인터페이스의 MAC 주소 및 벤더사 정보를 표시


 ③ IP 헤더 정보 

IP 버전 및 출발지, 목적지 IP 등을 표시


④ Protocol 정보 

해당 패킷의 프로토콜 정보 표시


⑤ Data 정보

해당 패킷에 포함되어 있는 데이터의 정보를 표시


위에서 캡처한 패킷을 와이어샤크를 통해 살펴 보면, 아래와 같다.



(처음에는 알아보기 힘들겠지만, 군살 없이 필요한 정보만 출력해주기 때문에 직관적으로 판단할 수 있을다고 판단한다.)


와이어샤크에서는 아래와 같이 캡처 옵션 Stop Capture Packet(s)에서 설정 할 수 있다. 

 

(2) 일정한 시간 간격으로 패킷 캡처

현재 상태의 패킷 분석을 위해서 오랜 시간 패킷을 캡처해야 하는 경우가 존재한다. 오랜 시간  패킷을 캡처하다보면 캡처 파일의 크기가 커짐과 동시에 처리 시간도 오래걸린다. 이럴때 사용하는것이 오랜 시간 패킷을 캡처 하면서 일정한 시간 간격으로 분할 저장하는 방법이다. netsniff-ng에서는 [-F 또는 --interval] 옵션을 사용하여 일정한 시간 간격으로 분할 저장한다.


root@kali:~# netsniff-ng -i eth0 -o /root/boanproject/ -s -F 또는 --interval <간격 지정>

  

한가지 주의할 점은 패킷 저장하는 [-o 또는 --out] 옵션을 적용하고 저장되는 파일이름을 적어주는것이 아니라 저장되는 디렉터리를 지정해주어야 한다. 파일 이름을 지정해주면, 지정한 시간 간격으로 분할 저장이 되지않는다. 



root@kali:~# netsniff-ng -i eth0 -o /root/boanproject/ -s -F 120

netsniff-ng 0.5.7

RX: 64.00 MiB, 32768 Frames, each 2048 Byte allocated

PROMISC

BPF:

 L0: ret #0xffffffff

MD: RX scatter-gather lf64 realtime: prio 4

 

.(+8470/-0).(+11554/-0).(+912/-0)


위 그림을 보면 .(+8470/-0).(+11554/-0).(+912/-0) 이란 부분을 볼 수 있다. 이것은 각각 저장된 패킷의 수를 의미한다. +는 정상적으로 받아들인 패킷의 수를 나타내며, -는 손실된 패킷의 수를 나타낸다.



참고로 와이어샤크에서 보았을때 패킷의 수와 netsniff-ng에서 표시한 패킷의 수가 조금 다를 수 있다. 저자가 여러번 확인하였을 때는 평균 10개 이하로 차이가 발생하였다.


저장된 패킷 캡처 파일은 지정한 디렉터리에 Epoch Time으로 저장된다.



(3) Packet Replay 

Packet Replay는 패킷을 캡처한 *.PCAP 파일을 이용하여, 저장된 패킷의 내용을 지정한 네트워크 인터페이스로 보내는 것이다. 이 기능을 이용하면, 악의적인 행위를 하는 패킷이라 가정 하였을때 해당 패킷을 IDS/IPS에 연결된 네트워크 인터페이스로 보내 탐지할 수 있는지 확인할 수 있다. 


netsniff-ng -i /root/boanproject.pcap -m 또는 --mmap  -o eth0 -k 1000 -s

 

저자는 빠른속도로 보내기 위해 [-k 또는 --kernel-pull] 옵션을 적용하여 커널과 사용자 사이 간격을 줄였으며, [-s  또는 --silent]옵션을 적용하여 전송되는 패킷의 내용을 출력하지 않게 하였다.



지정한 네트워크 인터페이스로 모두 보내면, 위와 같이 보낸 패킷 수와 전체 패킷 크기, 걸린 시간을 보여준다. 위에서 사용한 패킷 파일을 와이어샤크를 이용하여 살펴보면 아래와 같다.






3. 참고 자료

- 네트워크 상의 종단 호스트에서의 실시간 데이터 처리 기법 : 김경산, 김성조 - 한국정보과학회 2005 (한국컴퓨터종합학술대회 논문집A)

- http://netsniff-ng.org

- https://help.ubuntu.com/community/Netsniff-NG

- https://fedoraproject.org/wiki/Help:Netsniff-NG




반응형