2011년 4월 21일 목요일

와이어샤크에서 제공하는 랜덤 패킷 생성기 - randpkt

와이어샤크에 포함된 유틸리티 도구중 랜덤 패킷 생성기에 대해서 소개해 볼까 한다. 말 그대로 랜덤한 패킷을 생성하여 테스트해 볼 수 있도록 도와주는 것이다. 패킷 생성기에 대해서는 과거에도 여러개 언급한 적이 있는데, 다음 링크를 참고해 보면 과거 포스팅 글을 볼 수 있다.

http://www.packetinside.com/search/label/패킷생성

일단, 와이어샤크에서 제공하는 패킷생성기의 이름은 randpkt 이다. 과거에 와이어샤크 위키 페이지에서 네트워크 퍼징 테스팅 형태로 소개된 적이 있는데, 보니까 이번 1.5.X 에는 포함되었다. 사용방법은 아주 간단한데, 몇 개 옵션만 설정하면 된다. 일단 실행해 보면 다음과 같은 도움말 화면을 볼 수가 있다.

$ ./randpkt
Usage: randpkt [-b maxbytes] [-c count] [-t type] filename
Default max bytes (per packet) is 5000
Default count is 1000.

Types:
arp Address Resolution Protocol
bgp Border Gateway Protocol
bvlc BACnet Virtual Link Control
dns Domain Name Service
eth Ethernet
fddi Fiber Distributed Data Interface
giop General Inter-ORB Protocol
icmp Internet Control Message Protocol
ip Internet Protocol
llc Logical Link Control
m2m WiMAX M2M Encapsulation Protocol
megaco MEGACO
nbns NetBIOS-over-TCP Name Service
ncp2222 NetWare Core Protocol
sctp Stream Control Transmission Protocol
syslog Syslog message
tds TDS NetLib
tcp Transmission Control Protocol
tr Token-Ring
udp User Datagram Protocol
usb Universal Serial Bus
usb-linux Universal Serial Bus with Linux specific header

아래와 같은 옵션이 가능하다.

-b : 패킷당 최대 바이트 설정
-c : 생성할 패킷 개수
-t : 위에서 보여지는 타입 중에 한개를 지정

기본 패킷당 최대 사이즈는 5000 바이트 이며, 1000개를 생성한다. 아래는 -c 옵션을 통해 2000 개의 패킷을 생성하고 -t 로 UDP 패킷을 생성하겠다고 지정하였다.

$ ./randpkt -c 2000 -t udp testudp_pkt.pcap

testudp_pkt.pcap 의 파일 타입을 보니 패킷파일이 맞다!

$ file testudp_pkt.pcap
testudp_pkt.pcap: tcpdump capture file (little-endian) - version 2.4 (Ethernet, capture length 5000)

그리고 아래와 같이 tcpdump 로 읽어 보았더니, 랜덤한 UDP 데이터 이다.

$ tcpdump -n -r testudp_pkt.pcap | more
reading from file testudp_pkt.pcap, link-type EN10MB (Ethernet)
09:00:00.000000 IP 208.21.2.184.21753 > 10.1.1.99.32054: UDP, length 38786
09:00:01.000000 IP 208.21.2.184.26443 > 10.1.1.99.57468: UDP, length 2509
09:00:02.000000 IP 208.21.2.184.9457 > 10.1.1.99.46725: UDP, length 6990
09:00:03.000000 IP 208.21.2.184.34198 > 10.1.1.99.8866: UDP, length 37046
09:00:04.000000 IP 208.21.2.184.1266 > 10.1.1.99.8929: UDP, length 30654
09:00:05.000000 IP 208.21.2.184.344 > 10.1.1.99.52255: UDP, length 6177
09:00:06.000000 IP 208.21.2.184.31183 > 10.1.1.99.31788: UDP, length 45533
09:00:07.000000 IP 208.21.2.184.10209 > 10.1.1.99.12047: UDP, length 22577
09:00:08.000000 IP 208.21.2.184.20021 > 10.1.1.99.22743: UDP, length 40433
09:00:09.000000 IP 208.21.2.184.6049 > 10.1.1.99.51616: UDP, length 30311
09:00:10.000000 IP 208.21.2.184.36432 > 10.1.1.99.18243: UDP, length 52538
09:00:11.000000 IP 208.21.2.184.13544 > 10.1.1.99.60867: UDP, length 57417
09:00:12.000000 IP 208.21.2.184.17578 > 10.1.1.99.17505: UDP, length 14594
09:00:13.000000 IP 208.21.2.184.9524 > 10.1.1.99.55107: UDP, length 46128
09:00:14.000000 IP 208.21.2.184.37164 > 10.1.1.99.28460: UDP, length 49273
09:00:15.000000 IP 208.21.2.184.39487 > 10.1.1.99.24324: UDP, length 25347

건수도 확인해 보니, 옵션에서 지정한 것과 같이 2000 개이다.

$ tcpdump -n -r testudp_pkt.pcap | wc -l
reading from file testudp_pkt.pcap, link-type EN10MB (Ethernet)
2000

사이즈를 보니, 약 5.1 메가 정도가 된다.

$ ls -l testudp_pkt.pcap
-rw-r--r-- 1 rigel rigel 5101896 2011-04-21 21:58 testudp_pkt.pcap

한번 데이터를 살펴보면 Length 가 37046 으로 나온다.

09:00:03.000000 IP 208.21.2.184.34198 > 10.1.1.99.8866: UDP, length 37046
 0x0000:  ffff ffff ffff 0101 0101 0101 0800 4500  ..............E.
 0x0010:  003c c59e 4000 ff11 d7e0 d015 02b8 0a01  .<..@...........
 0x0020:  0163 8596 22a2 90be 05e7 0fad 7889 b8f5  .c..".......x...

아니, 어찌 패킷 사이즈가 이리 큰가? 아까 생성할 때 기본적으로 생성되는 패킷 사이즈 최대는 5000 바이트 인것을 기억할 것이다. 이걸 와이어샤크에서 열어서 살펴보면 UDP 헤더가 bogus header 로 나온다. 그리고 페이로드는 32 바이트이고, 그리하여 UDP 헤더 8 바이트와 페이로드 32바이트를 합치면 40 바이트이다. 하지만, 실제 데이터는 훨씬 크다. 제대로 표현을 못 해 준것 뿐이다.

그런데 몇번 생성하다 보면 출발지와 목적지 IP 가 동일하게 나온다. 왜 그럴까? 이것은 IP 주소등을 랜덤하게 생성하는 기능을 포함하고 있지 않다. randpkt.c 소스 파일을 살펴보면 아래와 같은 부분을 볼 수 있다.

/* Ethernet+IP, indicating UDP */
guint8 pkt_udp[] = {
    0xff, 0xff, 0xff, 0xff,
    0xff, 0xff, 0x01, 0x01,
    0x01, 0x01, 0x01, 0x01,
    0x08, 0x00,

    0x45, 0x00, 0x00, 0x3c,
    0xc5, 0x9e, 0x40, 0x00,
    0xff, 0x11, 0xd7, 0xe0,
    0xd0, 0x15, 0x02, 0xb8,
    0x0a, 0x01, 0x01, 0x63
};

즉, 위와 같이 UDP 패킷에 대해서 헤더 부분이 하드코딩 되어 있는 것이다. 목적지 IP 인 10.1.1.99 는 0x0a, 0x01, 0x01, 0x63 이 되고, 208.21.2.184 는 0xd0, 0x15, 0x02, 0xb8 이 되는 것이다.

[참고]
1. randpkt - Random Packet Generator
http://www.wireshark.org/docs/man-pages/randpkt.html

댓글 1개:

  1. 좋은정보 ^-^b 하지만 실제 공격을 감추기 위한 쓰레기 데이터 생성으로 악용될 소지도 있겠군요 ㅠ ㅠ

    답글삭제