2010년 10월 27일 수요일

인터넷 브라우저를 통한 악성코드 감염차단 - BLADE를 소개한다.

인터넷 상에서 가장 빈번히 발생하는 보안사고중의 하나가 웹 서버를 해킹하여, 악의적인
코드를 삽입하는 것이다. 이로 인해, 해당 사이트 방문자는 원하지 않게 악의적 코드가
실행되어 보안위협에 노출되는 경우가 크다. 이번에 여러분들에게 소개하고자 하는 것은
BLADE 라는 것이다. 이 BLADE 는 임의적으로 악성코드가 실행되는 것을 차단해 줄 수 있는
가능성을 제시해 준다. 이미, 몇몇 브라우저에서는 악의적 사이트 접근시,
위험한 사이트임을 알려주고 방문하지 않을 것을 권고한다. 하지만 BLADE 는 브라우저와는
독립적으로 동작하기 때문에 더욱 유연한 작동이 가능하다. 기본적인 동작형태는 다운로드되는
파일을 secure zone 이라 불리는 실행불가 영역으로 옮기고 차단을 한다. 악의적형태로 차단
하는 경우는 쉘코드가 인젝션되거나 실행되는 영역 그리고 다운로드된 데이터가 실행되는
지점에서 판단하여 차단하게 되는 것이다.

아직 공개적으로는 프로그램이 배포되지 않고 있고 동영상이 공개되어 있다.
프로그램도 조만간 다운로드 받을 수 있을것이다.


























이것이 모든 것을 다 효과적으로 차단해 줄 수 있는 것은 아니기 때문에, 제약은 존재한다.
예를 들면, 사회공학적 기법으로 사용자의 허용하에 설치되는 것은 차단하기 어려우며,
자바스크립트 봇과 같은 메모리 상에서 수행되는 것 또한 이 BLADE 의 영역 밖이다.
이런 부분은 DEP 와 같은 것으로 차단이 될 수 있다.

프로그램이 공개되어 직접 사용해봐야 정확한 성능을 알 수 있겠지만,
자체 평가에 따르면 성능은 나빠보이지 않아 보인다.

좀더 자세한 논문과 정보는 아래 사이트를 방문해 보기 바란다:

2010년 10월 25일 월요일

Scapy 의 다양한 기능을 익혀보자 - 두번째

Scapy 는 앞서 언급했듯이 파이썬(Python) 기반의 프로그램이다. 그러므로 파이썬에 익숙치 않은 사용자라면
이게 무엇인가 하고 혼란스럽기도 하다. 일반적인 컴퓨터 언어의 기본지식이 있는 사용자라면,
어렵지 않게 이해할 수 있는 부분이니 예제를 몇 개 보는 것만으로도 충분히 이해가 될 것이다. 첫번째 이야기에서 언급한 대로 간단히 설치를 하고 아래 예제대로 몇 가지를 직접 실행해 보자. 그러면 금방 이해가 되고, 머리속에 기억이 오래 남을 것이다.

1. Scapy 의 설정 정보 살펴보기

Welcome to Scapy (v1.1.1 / -)
>>> conf
Version    = v1.1.1 / -
ASN1_default_codec = <ASN1Codec BER[1]>
AS_resolver = <__main__.AS_resolver_multi instance at 0xaa69a4c>
BTsocket   = <class __main__.BluetoothL2CAPSocket at 0xaa0f89c>
IPCountry_base = 'GeoIPCountry4Scapy.gz'
L2listen   = <class __main__.L2ListenSocket at 0xaa0f74c>
L2socket   = <class __main__.L2Socket at 0xaa0f6ec>
L3socket   = <class __main__.L3PacketSocket at 0xaa0f6bc>
auto_fragment = 1
checkIPID  = 0
checkIPaddr = 1
checkIPsrc = 1
check_TCPerror_seqack = 0
color_theme = <DefaultTheme>
countryLoc_base = 'countryLoc.csv'
debug_dissector = 0
debug_match = 0
ethertypes = </etc/ethertypes/ >
except_filter = ''
gnuplot_world = 'world.dat'
histfile   = '/root/.scapy_history'
iface      = 'eth1'
manufdb    = </usr/share/wireshark/wireshark/manuf/ >
mib        = <MIB/ >
nmap_base  = '/usr/share/nmap/nmap-os-fingerprints'
noenum     = <Resolve []>
p0f_base   = '/etc/p0f/p0f.fp'
padding    = 1
prog       = Version    = v1.1.1 / -
display    = 'display'
dot        = 'dot'
hexedit    = 'hexer'
pdfreader  = 'xpdf'
psreader   = 'gv'
tcpdump    = '/usr/sbin/tcpdump'
tcpreplay  = 'tcpreplay'
wireshark  = 'wireshark'
promisc    = 1
prompt     = '>>> '
protocols  = </etc/protocols/ pim ip ax_25 esp tcp ah mpls_in_ip ipv6_opts xtp ipv6_route igmp igp ddp etherip xns_idp ipv6_frag vrrp gre ipcomp encap ipv6 iso_tp4 sctp ipencap rsvp hip udp ggp hmp idpr_cmtp fc skip st icmp pup manet isis rdp l2tp ipv6_icmp udplite egp ipip ipv6_nonxt eigrp idrp rspf ospf vmtp>
queso_base = '/etc/queso.conf'
resolve    = <Resolve []>
route      = Network         Netmask         Gateway         Iface           Output IP
127.0.0.0       255.0.0.0       0.0.0.0         lo              127.0.0.1      
192.168.0.0     255.255.255.0   0.0.0.0         eth1            192.168.0.240  
0.0.0.0         0.0.0.0         192.168.0.200   eth1            192.168.0.240  

conf 를 해 보면 현 세션의 설정 정보를 볼 수 있다. 설정정보의 변경은 간단하게 할 수 있는데, 만약 iface 의 네트워크 인터페이스를 바꾸고자 할 경우에는 conf.변수 = '값'  과 같이 사용하면 된다. 아래는 eth1 을 eth0 으로 변경해 본 것이다.

>>> conf.iface = 'eth0'


2. Scapy 를 이용해서 패킷 덤프도 해 보자.

sniff() 를 이용하면 패킷 덤프를 할 수 있다. 아래 화면은 sniff 를 한 후 Ctrl+C 를 눌러 중지하였더니 TCP 274 건 UDP 16 건이 탐지 되었다. 또 sniff 에 필터를 걸거나, count 옵션을 통해 몇 개까지 덤프를 한 후 중지할 것인지 지정할 수 있다. 기록된 데이터는 따로 특정 이름 변수에 담지 않아, '_' 에 기록되어 있다. _ 를 프린트 해 보면 패킷 정보가 출력이 된다.

>>> sniff()

^C<Sniffed: UDP:16 TCP:274 ICMP:0 Other:10>
>>> sniff(filter="tcp and port 80", count=15)
<Sniffed: UDP:0 TCP:15 ICMP:0 Other:0>
>>> print _
[<Ether  dst=00:01:36:2e:0b:a7 src=08:00:27:69:4f:90 type=0x800 |<IP  version=4L ihl=5L tos=0x0 len=610 id=7385 flags=DF frag=0L ttl=64 proto=tcp chksum=0x464d src=192.168.0.240 dst=74.53.201.162 options='' |<TCP  sport=45659 dport=www seq=772295791 ack=1844792927 dataofs=8L reserved=0L flags=PA window=4006 chksum=0x3356 urgptr=0 options=[('NOP', None), ('NOP', None), ('Timestamp', (296792, 1784140432))] |< ....(생략)


3. 복잡한 건 싫어, 간단한 요약 정보 살펴보기

위에 기록된 정보를 a 라는 변수에 할당하였고, nsummary() 를 이용해 출력해 보았더니 보기 쉽게 한 라인 단위로 요약된 정보를 나타내준다. 각 라인 정보는 배열로 들어가 있어, 원하는 배열 정보를 출력해 볼수도 있다.
5번째 있는 정보를 출력한다면 a[5] 와 같이 입력하면 된다.

>>> a = _
>>> a.nsummary()
0000 Ether / IP / TCP 192.168.0.240:45659 > 74.53.201.162:www PA / Raw
0001 Ether / IP / TCP 74.53.201.162:www > 192.168.0.240:45659 A
0002 Ether / IP / TCP 74.53.201.162:www > 192.168.0.240:45659 PA / Raw
0003 Ether / IP / TCP 192.168.0.240:45659 > 74.53.201.162:www A
0004 Ether / IP / TCP 74.53.201.162:www > 192.168.0.240:45659 A / Raw
0005 Ether / IP / TCP 192.168.0.240:45659 > 74.53.201.162:www A
0006 Ether / IP / TCP 74.53.201.162:www > 192.168.0.240:45659 A / Raw
0007 Ether / IP / TCP 192.168.0.240:45659 > 74.53.201.162:www A
0008 Ether / IP / TCP 192.168.0.240:37088 > 72.14.213.95:www PA / Raw
0009 Ether / IP / TCP 192.168.0.240:47910 > 69.174.57.101:www S
0010 Ether / IP / TCP 192.168.0.240:47911 > 69.174.57.101:www S
0011 Ether / IP / TCP 72.14.213.95:www > 192.168.0.240:37088 PA / Raw
0012 Ether / IP / TCP 192.168.0.240:37088 > 72.14.213.95:www A
0013 Ether / IP / TCP 69.174.57.101:www > 192.168.0.240:47910 SA
0014 Ether / IP / TCP 192.168.0.240:47910 > 69.174.57.101:www A
>>> a[5]
<Ether  dst=00:01:36:2e:0b:a7 src=08:00:27:69:4f:90 type=0x800 |<IP  version=4L ihl=5L tos=0x0 len=52 id=7387 flags=DF frag=0L ttl=64 proto=tcp chksum=0x4879 src=192.168.0.240 dst=74.53.201.162 options='' |<TCP  sport=45659 dport=www seq=772296349 ack=1844794757 dataofs=8L reserved=0L flags=A window=4006 chksum=0x518b urgptr=0 options=[('NOP', None), ('NOP', None), ('Timestamp', (296905, 1784175402))] |>>>
>>>

4.  패킷 구성 세부정보를 살펴본다. 어떻게, show() 명령어로..

a 에 기록되어 있는 5번째 내용을 트리구조와 비슷하게 살펴볼 수 있다. show() 를 이용해 언제든지 필요할때 마다 패킷의 구성정보를 살펴보자.

>>> a[5].show()
###[ Ethernet ]###
  dst= 00:01:36:2e:0b:a7
  src= 08:00:27:69:4f:90
  type= 0x800
###[ IP ]###
     version= 4L
     ihl= 5L
     tos= 0x0
     len= 52
     id= 7387
     flags= DF
     frag= 0L
     ttl= 64
     proto= tcp
     chksum= 0x4879
     src= 192.168.0.240
     dst= 74.53.201.162
     options= ''
###[ TCP ]###
        sport= 45659
        dport= www
        seq= 772296349
        ack= 1844794757
        dataofs= 8L
        reserved= 0L
        flags= A
        window= 4006
        chksum= 0x518b
        urgptr= 0
        options= [('NOP', None), ('NOP', None), ('Timestamp', (296905, 1784175402))]

5. str() 로 문자열 정보 보기

>>> str(a[13])
"\x00\x016.\x0b\xa7\x08\x00'iO\x90\x08\x00E\x00\x01\xf8\xadL@\x00@\x06\xe4:\xc0\xa8\x00\xf0J}\x9bc\xd1x\x00PP&7\xdcj!.F\x80\x18\x01m\xa0=\x00\x00\x01\x01\x08\n\x00\x06\x9a\xb1\x9c5<\xd0GET / HTTP/1.1\r\nHost: google.com\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; en; rv:1.9.0.9) Gecko/20080528 Epiphany/2.22\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\nAccept-Language: en-us,en;q=0.5\r\nAccept-Encoding: gzip,deflate\r\nAccept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\nKeep-Alive: 300\r\nConnection: keep-alive\r\nCookie: rememberme=false; PREF=ID=ca4bab229fe11b17:TM=1264000421:LM=1264000421:S=ydhaQuYz7bGA7OEL\r\n\r\n"


6. hexdump() 로 16진수 HEX 값 보기

>>> hexdump(a[13])
0000   00 01 36 2E 0B A7 08 00  27 69 4F 90 08 00 45 00   ..6.....'iO...E.
0010   01 F8 AD 4C 40 00 40 06  E4 3A C0 A8 00 F0 4A 7D   ...L@.@..:....J}
0020   9B 63 D1 78 00 50 50 26  37 DC 6A 21 2E 46 80 18   .c.x.PP&7.j!.F..
0030   01 6D A0 3D 00 00 01 01  08 0A 00 06 9A B1 9C 35   .m.=...........5
0040   3C D0 47 45 54 20 2F 20  48 54 54 50 2F 31 2E 31   <.GET / HTTP/1.1
0050   0D 0A 48 6F 73 74 3A 20  67 6F 6F 67 6C 65 2E 63   ..Host: google.c
0060   6F 6D 0D 0A 55 73 65 72  2D 41 67 65 6E 74 3A 20   om..User-Agent:
0070   4D 6F 7A 69 6C 6C 61 2F  35 2E 30 20 28 58 31 31   Mozilla/5.0 (X11
0080   3B 20 55 3B 20 4C 69 6E  75 78 20 69 36 38 36 3B   ; U; Linux i686;
....(생략)

7. 사용가능한 명령어는 무엇이 있을까?

Scapy 에서 사용가능한 명령어가 무엇이 있는지 궁금할때는 lsc() 를 쳐 보자. 그리고 추가 도움말이 필요할때는 help() 가 있다.

>>> lsc()
sr               : Send and receive packets at layer 3
sr1              : Send packets at layer 3 and return only the first answer
srp              : Send and receive packets at layer 2
srp1             : Send and receive packets at layer 2 and return only the first answer
srloop           : Send a packet at layer 3 in loop and print the answer each time
srploop          : Send a packet at layer 2 in loop and print the answer each time
sniff            : Sniff packets
p0f              : Passive OS fingerprinting: which OS emitted this TCP SYN ?
arpcachepoison   : Poison target's cache with (your MAC,victim's IP) couple
send             : Send packets at layer 3
sendp            : Send packets at layer 2
traceroute       : Instant TCP traceroute
arping           : Send ARP who-has requests to determine which hosts are up
ls               : List  available layers, or infos on a given layer
lsc              : List user commands
queso            : Queso OS fingerprinting
nmap_fp          : nmap fingerprinting
report_ports     : portscan a target and output a LaTeX table
dyndns_add       : Send a DNS add message to a nameserver for "name" to have a new "rdata"
dyndns_del       : Send a DNS delete message to a nameserver for "name"
is_promisc       : Try to guess if target is in Promisc mode. The target is provided by its ip.
promiscping      : Send ARP who-has requests to determine which hosts are in promiscuous mode

8. Traceroute 로  IP 경로 추적하기

흔히 경로 추적에 사용하는 traceroute 를 scapy 에서도 그대로 사용할 수 있다.

>>> traceroute("packetinside.com")
Begin emission:
************************Finished to send 30 packets.
******
Received 30 packets, got 30 answers, remaining 0 packets
   211.245.21.34:tcp80
1  192.168.0.200   11  
2  218.146.42.254  11  
3  121.140.24.161  11  
4  218.146.42.253  11  
5  112.190.34.93   11  
6  218.145.33.197  11  
7  112.174.48.158  11  
8  211.44.125.129  11  
9  118.221.4.17    11  
10 211.108.63.138  11  
11 58.229.17.78    11  
12 114.202.0.198   11  
13 211.245.21.34   SA  
14 211.245.21.34   SA  
15 211.245.21.34   SA  
16 211.245.21.34   SA    
...(생략)


9. 프로토콜의 각 레이어 구성하기

위에서는 몇 가지 유용한 명령어들을 알아 보았는데, 실질적으로 내가 패킷파일을 구성하기 위해서는 어떻게 해야 하는지 소개해 보고자 한다. 패킷파일을 들여다 보면 형태에 따라 다르지만 크게,
이더넷 헤더 , IP 헤더, TCP/UDP 헤더, 애플리케이션 헤더 등이 있다.
그럼 이 각 헤더를 구성하는 아래의 예제를 들여다 보자.

>>> IP()
<IP  |>
>>> Ether()/IP()/TCP()
<Ether  type=0x800 |<IP  frag=0 proto=tcp |<TCP  |>>>
>>> Ether()/IP()/TCP()/"GET /HTTP/1.1\r\nHost: packetinside.com\r\n\r\n"
<Ether  type=0x800 |<IP  frag=0 proto=tcp |<TCP  |<Raw  load='GET /HTTP/1.1\r\nHost: packetinside.com\r\n\r\n' |>>>>
>>> hexdump(_)
0000   FF FF FF FF FF FF 00 00  00 00 00 00 08 00 45 00   ..............E.
0010   00 51 00 01 00 00 40 06  7C A4 7F 00 00 01 7F 00   .Q....@.|.......
0020   00 01 00 14 00 50 00 00  00 00 00 00 00 00 50 02   .....P........P.
0030   20 00 4E BE 00 00 47 45  54 20 2F 48 54 54 50 2F    .N...GET /HTTP/
0040   31 2E 31 0D 0A 48 6F 73  74 3A 20 70 61 63 6B 65   1.1..Host: packe
0050   74 69 6E 73 69 64 65 2E  63 6F 6D 0D 0A 0D 0A      tinside.com....
>>>
>>> str(IP())
'E\x00\x00\x14\x00\x01\x00\x00@\x00|\xe7\x7f\x00\x00\x01\x7f\x00\x00\x01'
>>> str(TCP())
WARNING: No IP underlayer to compute checksum. Leaving null.
'\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x00\x00\x00\x00'
>>> a=Ether()/IP(dst="www.google.com")/TCP()/"GET /index.html HTTP/1.0 \n\n"
>>> a
<Ether  type=0x800 |<IP  frag=0 proto=tcp dst=Net('www.google.com') |<TCP  |<Raw  load='GET /index.html HTTP/1.0 \n\n' |>>>>

Ether() 은 이더넷 헤더를 IP() 는 IP 헤더를 의미한다. Ethere()/IP() 와 같이 사용하면 이 두 헤더를 만들어 주는 것이다. 구성된 헤더는 hexdump 로도 확인해 볼 수 있고, str 로도 각 헤더별 구성을 볼 수 있다. 예제를 보는 것 만으로도 대충 동작 형태의 감이 잡힐 거이다. 여러분들이 필요한 헤더를 원하는 대로 가져다 붙이면 되는 것이다.

10. 패킷 구성 조금 더 깊게 들여다 보기

조금더 패킷구성에 대해서 살펴보자. 헤더 마다 세부적으로 값들을 다 조정할 수 가 있는데, 아래는 b 에 IP 헤더를 집어 넣는데 목적지 주소는 192.168.100.100 으로 하고 있다. 목적지 주소만을 보기 위해 b.dst 를 사용했고, b.ttl 을 통해 ttl 을 볼 수도 있다. ttl 값을 128 로 변경하였다가 그 값을 다시 삭제한 것도 보인다.

TCP 도 마찬가지로 c 에 할당하고 flags 값을 설정해 보기도 하고 , 목적지와 출발지 포트도 설정했다. 그리고
z 라는 변수에 IP()/TCP() 로 만들어 넣었더니.

어라~ 이상하다. 내가 설정한 정보하고는 다르다. 여기서 주의할 것이. 이것은 단지 IP/TCP 기본 헤더정보를 넣은 거이다. 우리가 만든 정보를 넣은것이 아니므로 , x 변수에 넣은 것과 같이
x=b/c 와 같이 넣어주고 x.show() 로 확인해 보면 정상적으로 다 들어가 있는 것을 볼 수 있다.

>>> b=IP(dst="192.168.100.100")
>>> b
<IP  dst=192.168.100.100 |>
>>> b.dst
'192.168.100.100'
>>> b.ttl
64
>>> b.ttl="128"
>>> b
<IP  ttl='128' dst=192.168.100.100 |>
>>> del(b.ttl)
>>> b
<IP  dst=192.168.100.100 |>
>>>

>>> c=TCP()
>>> c
<TCP  |>
>>> c.flags="PA"
>>> c.flags
24
>>> c
<TCP  flags=PA |>
>>> c.dport=80
>>> c.sport=2080
>>> c
<TCP  sport=2080 dport=www flags=PA |>
>>> z=IP()/TCP()
>>> z
<IP  frag=0 proto=tcp |<TCP  |>>
>>> z.show()
###[ IP ]###
  version= 4
  ihl= 0
  tos= 0x0
  len= 0
  id= 1
  flags=
  frag= 0
  ttl= 64
  proto= tcp
  chksum= 0x0
  src= 127.0.0.1
  dst= 127.0.0.1
  options= ''
###[ TCP ]###
     sport= ftp_data
     dport= www
     seq= 0
     ack= 0
     dataofs= 0
     reserved= 0
     flags= S
     window= 8192
     chksum= 0x0
     urgptr= 0
     options= {}

>>> x=b/c
>>> x
<IP  frag=0 proto=tcp dst=192.168.100.100 |<TCP  sport=2080 dport=www flags=PA |>>
>>> x.show()
###[ IP ]###
  version= 4
  ihl= 0
  tos= 0x0
  len= 0
  id= 1
  flags=
  frag= 0
  ttl= 64
  proto= tcp
  chksum= 0x0
  src= 192.168.0.240
  dst= 192.168.100.100
  options= ''
###[ TCP ]###
     sport= 2080
     dport= www
     seq= 0
     ack= 0
     dataofs= 0
     reserved= 0
     flags= PA
     window= 8192
     chksum= 0x0
     urgptr= 0
     options= {}
>>>

11. 패킷 전송하기

첫번째 이야기에서도 간단하게 패킷 전송을 다뤄보았다. 앞에서 만든 x 변수를 send 를 통해 쉽게 전송했다. 이 뜻은, 여러분이 필요한 형태로 패킷을 아주 쉽게 만들 수 있다는 것이다. 그리고 send 를 통해 전송을 하고.
이외 파일로 저장된 패킷파일을 바로 불러들여 전송을 시킬 수도 있다.

>>> send(x)
.
Sent 1 packets.
>>> sendp(rdpcap("/home/debian/test.pcap"))
WARNING: DNS RR prematured end (ofs=45, len=42)
WARNING: DNS RR prematured end (ofs=50, len=42)
WARNING: more DNS RR prematured end (ofs=45, len=42)
..........................................................................................................................................
Sent 138 packets.
>>>

Scapy 의 주요한 몇 가지 기능과 사용방법에 대해서 알아보았는데, 굳이 설명이 없더라도
소개한 예제만 보고도 기능이 충분히 이해가 될 것이다. 파이썬 기반이라도 설명을 했기 때문에
다양한 프로그램적인 요소를 접목하기도 아주 쉽다. 일단은 이 정도만 알아두어도
Scapy 를 이용해 활용하기에는 큰 무리가 없을 것이며, 더 많은 기능은 Scapy 사이트에서 문서를 참고해 보기 바란다. 더욱 많은 기능에 놀랄지도 모르겠다. :-)

마지막으로 세번째 이야기에서는 Scapy 를 프로그램 관점에서 소개해 보도록 하겠다.

From Rigel.

[Scapy 연관글]

2010년 10월 20일 수요일

보안업체 Kaspersky사 다운로드 사이트 해킹 당해...


AV(Anti-Virus)의 대표적 회사중에 하나인 Kaspersky 의 웹 사이트가 주말에 해킹을
당했다는 사실이 알려졌다. 일요일 다운로드 사이트 중에 한 곳이 해킹당해
가짜 AV 프로그램 (Fake AV)을 다운로드 받도록 리다이렉트 되었다는 것이다.

Kaspersky 에서는 이 사실에 대해서 거부하다, 19일 IT Pro 에 시인했다.
해킹이 된 시스템은 확인 후, 10분안에 서비스를 중지시켰고 안전한 시스템으로
현재 재 가동중이라고 한다. (약 3시간 30분 정도 노출)

연결된 주소는 http://77.78.2[deleted]3 이다.

알려진 정보로는 관리용으로 설치된 외부 웹 프로그램에 의해 문제가 발생한
것으로 알려지고 있으나, 아직 자세하게는 확인이 안되고 있다. 아직
공식적으로 Kaspersky 에서 발표는 하지 않고 있으므로...

보안업체에서도 사실 충분히 보안사고가 발생할 가능성이 있다. 보안업체로서
그 만큼 더욱 주의가 필요하지만, 사람이 하는 일이다 보니 이런 보안 사고가
발생할 가능성은 항상 존재한다. 보안은 언제나 그렇지만 항상 관심갖고
지속적으로 관리가 필요하다.

[참고]
1. eWeek 기사
2. IT Pro 관련 기사
3. 트랜드 마이크로 블로그 소식

강력한 패킷 조작 프로그램 Scapy 를 소개한다 - 첫번째

Scapy

지금까지 패킷분석과 관련한 많은 도구들을 언급하였는데, 이 도구를 미처 소개하지 못했다.
강력한 기능과 프로그램적인 면에서도 뛰어난 도구인데말이다. 필자가 오늘 소개하고자 하는 도구는
Scapy 라는 것이다. Scapy 는 인터렉티브하게 패킷을 조작할 수 있는 강력한 기능을 제공하며,
수 많은 프로토콜의 디코딩 기능과 수정된 패킷을 전송할 수 있는 기능등을 포함하고 있다.

이 도구의 큰 장점은 다양한 기능을 수행할 수 있는 것인데, 우리가 흔히 스캐닝을 하거나, 패킷덤프를
하거나, 원격 시스템의 Alive 유무를 점검 또는 공격 패킷등을 만들고자 할때 사용하는 도구들이
다 달라진다. 예를 들면, hping, nmap, arpsoof, tcpdump, tshark, p0f 등의 여러 도구의 기능들 말이다
하지만 Scapy 는 이 도구 하나로 가능하다. 너무 강력한 도구인양 소개한 것일까?

사용용도에 따라 달라지겠지만 무척이나 편리한 기능을 갖고 있는 것은 사실이다. 다만 사용하는데 있어서는
일반적인 도구에 비해서는 사용방법이 처음에는 힘들 수도 있다. Scapy 는 파이썬을 기반으로
작성되어 있는데, 사용형태가 파이썬에서 코드를 사용하는 것과 같이 사용할 수 있으므로
파이썬에 익숙해져 있는 사용자라면 더 없이 편할 것이다. 또한, Scapy 모듈을 이용하여,
파이썬에서 패킷을 핸들링 하는 프로그램을 작성한다면 간단하게 그 기능을 이용할 수 있어
개발자 관점에서도 유용하다.

뛰어나다는 설명보다도 일단 직접 경험해 보는 것이 빠르다.  바로 설치해 보고 각 기능을
사용해 보면 앞서 얘기한 것들이 이해가 될 것이다.

1. 설치

Scapy 2.x 이상의 버전에서는 파이썬 2.5 이상이 필요하다. 그리고 libpcap, libdnet 이 필요하다.
보통 많은 경우에는 이런것들이 이미 설치되어 있으므로 사용하는데 큰 문제는 없을 것이다.

다음의 경로에서 파일을 다운로드 받을 수 있다:


$ unzip scapy-latest.zip
$ cd scapy-2.*
$ sudo python setup.py install

하는 것으로 쉽게 설치가 된다. 파이썬에 익숙한 사용자라면 어렵지 않을 것이다. 또는,
각 시스템에서 제공하는 패키지가 있다면 그것을 이용해도 좋다.

# apt-get install scapy

* 참고로 윈도우 기반에서 사용하고자 한다면, 다음의 문서를 참고하여 실행해 보길 바란다.
http://www.secdev.org/projects/scapy/doc/installation.html#platform-specific-instructions

2. 간단한 사용 예

실행하게 되면 다음과 같은 화면을 볼 수 있다.

# scapy
WARNING: No route found for IPv6 destination :: (no default route?)
Welcome to Scapy (2.1.0)
>>>

(설치되어 있는 모듈 및 환경에 따라, 경고 메시지가 뜰 수 있는데 무시하고 사용 가능하다.단, 해당 모듈 기능을 사용하지 않는 한)

몇 가지 간단한 기능을 살펴보자!

>>> ls()
ARP        : ARP
BOOTP      : BOOTP
CookedLinux : cooked linux
DHCP       : DHCP options
DNS        : DNS
DNSQR      : DNS Question Record
DNSRR      : DNS Resource Record
....
현재 지원하는 레이어 형태를 볼 수 있다. 쉽게 보면 프로토콜 이다.

다음은 존재하는 PCAP 파일을 오픈하는 것이다. 오픈할 파일을 " 없이 사용하는 경우는 다른 형태로 이해한다.
오픈 후에는 파싱되어 메모리 상에 다 들어가 있으므로 바로 바로 필요한 내용을 꺼내 사용할 수 있다.

>>> a=rdpcap(test.pcap)
Traceback (most recent call last):
  File "<console>", line 1, in <module>
NameError: name 'test' is not defined
>>> a=rdpcap("test.pcap")
>>> a
<test.pcap: TCP:2040 UDP:0 ICMP:0 Other:0>
>>>

파일 전송도 할 수 있는데, 원하는 형태로 마음대로 수정하여 전송이 가능하다. 각 프로토콜 레이어 별로 정보를 기록하고 헤더를 붙일 수 있다. 아래의 경우는 IP 헤더에서 목적지를 1.2.3.4 로 설정하고, ICMP 헤더를 붙인 것이다.

>>> send(IP(dst="1.2.3.4")/ICMP())
.
Sent 1 packets.

전송하기 전 tcpdump 로 확인한 내용을 보면, 목적지 1.2.3.4 로 ICMP 패킷이 전송된걸 확인할 수 있다.

# tcpdump -v icmp
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
09:07:36.479199 IP (tos 0x0, ttl 64, id 1, offset 0, flags [none], proto ICMP (1), length 28) packet > 1.2.3.4: ICMP echo request, id 0, seq 0, length 8

이 정도에서 간단한 맛보기를 언급하고 다음 이어지는 두번째 편에서 좀더 세부적으로 Scapy 기능을 알아보도록 하겠다. 계속 이것저것 소개할 것이 많은데, 정리하고 쓰자니 시간이 꽤 걸리는 거 같다. 이래서 정리는 인내가 필요해지는 것 같다 :-)

2010년 10월 15일 금요일

TCP/IP 헤더 내 맘대로...tcp[13] == 2 의 의미는 무엇일까?

tcpdump 를 이용해 패킷을 덤프하다 보면 다양한 표현식을 이용해 필터를 표현하는 경우가 많다. 많은 경우는
대략 사용되는 문자만 보더라도 의미가 파악되는 경우가 많다. 예를 들어, src 라 하면 하면 source 인 출발지가 연상되고 host 는 말 그대로 호스트를 뜻한다. 그럼 이걸 다 연결해서 보면 src host 192.168.0.0 필터의 의미를 금방 추측해 볼 수 있다. tcpdump 에서 이용되는 필터 표현방식은 큰 어려움이 없다. 그런데 아래와 같은 경우는 무엇일까?

tcp[13] == 2

얼핏 봐서는 의미가 잘 파악이 안된다. 어렵게 느껴질 수도 있는데 TCP 헤더를 생각해 보면 의외로 쉽게 풀린다.
일단 다음의 TCP 헤더 포맷을 살펴보자.
[출처 : nmap.org]

TCP 헤더 포맷은 Options 을 제외하고는 20 바이트로 구성되어 있다. 오프셋은 0 부터 시작하고, Octet 형태로 보면 첫 라인은 0 - 3 까지이고, 두번째 라인은 4-7 이다. 그렇다 바로 위에서 13 이라는 것은 바로 이 위치인 것이다. TCP 라고 하였으니 TCP 헤더를 뜻한 것이고 뒤에 들어가는 것은 헤더의 위치 값이다.

자, 그럼 두번째 라인은 4-7 까지이고, 3번째는 8-11 까지가 된다. 네번째 라인은 12-15 가 되는데 13 위치를 보면 TCP Flags 라고 되어 있다. 그렇다 바로 플래그 값을 뜻하는 것으로 대표적인 몇 가지 값을 보면 아래와 같다:

F : FIN
S : SYN
R : RESET
P : PUSH
A : ACK

TCP 3-way Handshake 라는 것을 들어보았다면 위의 용어가 익숙할 것이다. 13 위치가 플래그 라는 것은 알았는데 TCP[13] 의 '== 2' 은 무었일까? == 는 같다는 의미로 쉽게 알 수 있고, 2는 설정된 비트 값이다. 좀더 자세히 알아보도록 하겠다. 1바이트는 8 비트로 구성되어 있다. 그래서 위 헤더의 한 라인씩은 4바이트로 이루어져 있고 13 번째 위치 부분도 1바이트 구성이다. 그럼 8비트 구성일텐데, 위 플래그들을 보면 8개이다. 즉, 각 플래그는 한 비트씩 차지하고 있는 것이다. 좀더 자세하게 표현하면 아래와 같다 :

                  |C|E|U|A|P|R|S|F|
                |---------------|
                |0 0 0 0 0 0 1 0|
                |---------------|
                |7 6 5 4 3 2 1 0|

제일 아래 부분은 0-7 까지 비트를 표현한 것이고 그 윗 부분은 Set 된 비트를 의미한다. S 부분이 Set 되어 있는 상태이다. 그럼 이걸 다시 십진수로 변환해 보면 나머지는 다 0 이고 한 군데만 1 이므로 1*2 인 2가 되는 것이다. 차례로 각 계산을 세부적으로 표현하면 다음과 같아진다.

   7     6     5     4     3     2     1     0
0*2 + 0*2 + 0*2 + 0*2 + 0*2 + 0*2 + 1*2 + 0*2  =  2

이제 느낌이 팍 오는가? SYN 값이 0x02 가 되는 것이다. 그럼 TCP[13] == 2 의 의미를 다시 정리해 보면,
TCP 헤더의 13번째 Octet 위치는 TCP Flags 를 나타내는 것이고 2 는 SYN 를 표현한 것이다.

바로 TCP 패킷중 SYN 패킷만 해당하는 것을 탐지하고자 할때 사용할 수 있는 필터가 되는 것이다.


만약 PUSH 플래그를 잡고자 한다면 8 이 된다. 알고보면 어렵지 않은 부분인데, 이런 것을 모르고 해당
문법을 보게 되면 복잡함 부터 느껴지는 것은 당연하다. 이제 각 헤더의 어떤 부분도 여러분 스스로가 탐지해 낼 수 있게 된것이다.


다음번에는 패킷분석에 기본이 되는 TCP/IP 헤더 부분을 좀더 면밀히 살펴보고자 한다. 패킷분석의 기본이 되는 부분이지만, 의외로 처음 접하는 분들에겐 힘들어 보이는 부분이다. 헤더의 구성을 알게되면 패킷이라는 것에 대해 좀더 명확히 알 수 있으며, 이해가 훨씬 빨라진다. 한 패킷을 예로들어, OSI Layer 단계부터 시작해 TCP, IP 헤더까지 껴 맞춰보며 여러분들에게 명확한 이해를 제시하고자 한다.


패킷이 무엇이고, 통신이 어떻게 이뤄지며 패킷의 구성은 어떻게 이뤄지는지 이해가 잘 안된다면 꼭 보아야 할 내용이 될 것이다. 그럼 시작되는 그 날을 기약하며...



2010년 10월 12일 화요일

와이어샤크 1.4.1, 1.2.12 버전 릴리즈

와이어샤크의 최신버전이 릴리즈 되었다. 이번에 릴리즈 된 버전은
1.4.1 과 1.2.12 버전이다.

ASN.1 BER 해석기의 취약점이 해결되었고, 유저 인터페이스 관련한 몇 가지
버그들이 해결되었다. 1.4.1 버전에서는 다음 프로토콜 지원 기능이 업데이트 되었다.

ASN.1 BER, ASN.1 PER, EIGRP, GSM A RR, GSM Management, GSM MAP, GTP, GTPv2, ICMPv6, Interlink, IPv4, IPv6, IPX, LDAP, LLC, MySQL, NAS EPS, NTLMSSP, PN-IO, PPP, RPC, SDP, SLL, SSL, TCP

이외 업데이트 된 세부적인 내용은 다음 경로를 참고하면 된다.

http://www.wireshark.org/docs/relnotes/wireshark-1.4.1.html

또한, 와이어샤크 1.0 버전에 대해서는 더 이상 지원이 이뤄지지 않는다. 공식적인
지원이 끝난만큼, 1.0 사용자들은 1.4 버전으로 업그레이드 할 것을 권고한다.

2010년 10월 11일 월요일

자동차도 패킷분석을 한다고? 자동차 분석엔 CarShark를..

다양한 패킷분석에 대해서 알아보았는데, 만약 자동차 또한 패킷분석을 할 수 있다면
어떨까? 아니 자동차도 패킷분석을 한다고? 왠 뚱딴지 같은 소리일 수 있겠지만
해외에서는 이와 관련한 증명 형태의 해킹이 기사화 된적이 있다. 최근 언론에서는
사이버전쟁이 현실화 될 수 있다는 악성코드 기사가 이슈화 되고 있다. 바로 스턱스넷(Stuxnet)
이라는 악성코드가 산업자동화 제어쪽에 영향을 줄 수 있다는 것이고, 실제로 이란 핵시설과
중국의 주요 산업기반 시설을 대상으로 하고 있다고도 한다. 이와 관련해 사이버전쟁과
관련한 컬럼을 소개한 적도 있는데, 기회가 되면 여러분들에게도 소개하도록 하겠다.

자동차 이야기를 하다 엉뚱한 데로 빠졌는데, 다시 처음으로 돌아와서. 이 얘기를 잠깐
꺼낸것은 소개하고자 하는 기사를 처음 접한건 5월 경이었는데, 여러분들에게 소개를
해야지 하고 기억만 하고 있다 스턱스넷이 최근 이슈가 되면서 이 이야기도 생각이 나
소개해 보고자 하는 것이다.

아이폰이 나오면서 아이폰을 통해 자동차를 원격 조종한다는 기사도 있었다. 자동차에도
다양한 여러 기능들이 들어가면서 하나의 컴퓨터같이 디지털화되어 가고 있는 것이다.
이번에 소개된 것은 달리는 자동차의 브레이크를 끄거나, 속도계의 속도를 변화시키고
음악을 키거나 끄는등의 해킹을 할 수 있다는 증명형태의 코드다. 이와 관련한 좀더
세부적인 자료는 아래의 사이트에서 확인해 볼 수 있다.

http://www.autosec.org/publications.html
[Experimental Security Analysis of a Modern Automobile ]


[출처: 구글이미지]

미국의 대학에서 진행한 리서치였는데, 여기서 리서치를 위해 제작한 소프트웨어
이름이 카샤크(CarShark) 이다. 우리가 익숙하게 사용하고 있는 와이어샤크의
자동차 버전이라 할까나. 이 CarShark 는 CAN 트래픽을 수집할 수 있는데,
CAN 은 Controller Area Network 이다. 차내의 전자제어 시스템으로 볼 수 있는데,
유럽에서 많이 사용되는 것으로 이 프로토콜은 이미 국제적 표준으로 제정되어 있다고 한다.
패킷분석을 하는 입장에서 이 프로토콜은 흥미롭다.


[출처: POPSCI.com/Flickr/KlausNahr  해킹 카 컴포넌트]

산업전반의 많은 부분에서 디저털화가 이뤄지다 보니 이런 일은 충분히 발생할 수 있다.
자동차의 경우 일상생활에서 밀접하게 이용되는 도구의 하나이다 보니 이런일이
현실로 일어나면 얼마나 큰일이 날 수 있는지 생각만 해도 아찔하다.

앞으로 이에 대해 더 깊게 살펴볼 기회가 생기면 다시 한번 언급하기로 하고,
오늘은 이 정도 수준에서 여러분들과 공유한다 :-)

P.S 혹시 CAN 네트워크와 관련하여 업무를 하고 계시는 분이 있으시면 연락주세요.

[참고]
1. Proof-of-Concept CarShark Software Hacks Car Computers, Shutting Down Brakes, Engines, and More

2010년 10월 6일 수요일

리틀엔디안(Little-endian)과 빅엔디안(Big-endian)이해하기

오늘은 패킷 분석과 조금은 다른 이야기를 꺼내볼까 한다. 머 그렇다고 패킷 분석과는
동떨어진 내용은 아니다. 분석을 하다보면 필요한 내용이기 때문이다. 앞으로 계속
여러가지 내용을 소개하는데 있어, '바이트 오더(Byte Order)' 를 설명할 필요가 있을거 같아
잠깐 짚고 넘어가볼까 한다.

바이트오더 하면 떠오르는게 리틀 엔디안(Little Endian) 과 빅 엔디안(Big Endian) 이다.
프로그램이나 리버싱 과정에서 헷갈리기도 하는 부분이다.

우선 리틀 엔디안은 주로 인텔(Intel)프로세스 계열에서 사용하는 바이트 오더 이다.
메모리 시작 주소가 하위 바이트부터 기록된다는 것이고 그 반대로 빅 엔디안은
메모리 시작 주소에 상위 바이트부터 기록된다. 주로 UNIX 시스템인 RISC 프로세서
계열에서 사용하는 바이트 오더이다. 이렇게 메모리에 저장하는 방식이 차이가 있다보니
가끔 혼돈 스럽기도 하다. 다음 도표는 메모리기 기록되는 것을 쉽게 이해할 수 있도록 기술되어 있다.


[도표] 레지스터와 메모리 위치 매핑 관계 , 출처 : 위키피디아(www.wikipedia.org)

우리가 패킷분석때 많이 보게되는 네트워크 프로토콜은 기본적으로 빅 엔디안 표현이다.
빅 엔디안을 표현하면 아래와 같다.

increasing addresses  →
...0Ah0Bh0Ch0Dh...


Big-Endian.svg
[출처] 위키피디아

0x0A 는 메모리 하위 주소에 위치하게 되고 차례로 0x0B , 0x0C, 0x0D 가 온다.
읽는 순서는 왼쪽 -> 오른쪽 순서로 읽으면 되므로 사람이 보기에는 가장 편한 방식이다.

다음 리틀 엔디안은

increasing addresses  →
...0Dh0Ch0Bh0Ah...


Little-Endian.svg
[출처] 위키피디아

빅 엔디안 과 반대로 0x0D 가 메모리 하위 주소에 오게된다. 상위바이트로 올라가면서
차례로 나머지 값이 들어간다. 리틀 엔디안 또는 빅 엔디안에 따라 받아 들이는 쪽에서
처리를 잘못하게 되면 엉뚱한 형태가 되므로 주의가 필요하다. 예를 들어, 취약점 등을
리버싱 하는 과정에서 해당 값 들이 기록되어 있는 형태를 제대로 이해할 필요가 있다.

일단 여기서는 쉽게 요약 정리하면,
빅 엔디안값은 왼쪽-> 오른쪽 순서로 읽고, 리틀 엔디안값은 반대로 오른쪽->왼쪽 순서로
읽으면 된다는 점이다. 그리고 네트워크 상에서 표준으로 이용되는 프로토콜은
네트워크 바이트 오더인 빅 엔디안으로 생각하자.

복잡한게 싫다면 이것만 알고 있으면 된다.

참고로 다음은 리틀/빅 엔디안을 이용하는 시스템이다.

[리틀 엔디안]
[빅 엔디안]
  • AIX on POWER
  • AmigaOS on PowerPC and 680x0
  • HP-UX on Itanium and PA-RISC
  • Linux on MIPS, SPARC, PA-RISC, POWER, PowerPC, 680x0, ESA/390, and z/Architecture
  • Mac OS on PowerPC and 680x0
  • Mac OS X on PowerPC
  • MVS and DOS/VSE on ESA/390, and z/VSE and z/OS on z/Architecture
  • Solaris on SPARC

우리가 주로 이용하는 시스템은 인텔 기반의 리눅스와 윈도우이므로 리틀 엔디안 방식이다. 단, 네트워크를 통해 전송되는 것은 빅 엔디안이다.

[참고]
1. 위키피디아
http://en.wikipedia.org/wiki/Endianness
2. Understanding Big and Little Endian Byte Order
http://betterexplained.com/articles/understanding-big-and-little-endian-byte-order/

2010년 10월 5일 화요일

오래 간만에 접속해본 tcpdump 사이트 바뀌었네..

오래간만에 tcpdump 사이트를 방문하였더니 홈페이지가 새롭게 리뉴얼 되었다. 근 몇년간 한번도
바뀐적 없이 운영된 것으로 기억하는데, 새로운 화면이 머랄까 신선하게 다가온다. ;-)
패킷 분석을 하는 분들에겐 tcpdump 와 libpcap 을 빼 놓을 수 없을 것이다.

앞으로도 꾸준히 발전하는 모습을 기대하며....
I love libpcap :-)

2010년 10월 4일 월요일

윈도우환경에서 실시간 그래프를 통해 트래픽을 감시해 보자.

윈도우환경에서 간단히 트래픽 상태를 살펴볼 수 있는 도구 하나를 소개한다.
이름은 iTraffic Monitor 이며, 네트워크 모니터링과 간단한 리포팅을 해준다. 아래 이미지는 사용 예로,
그래프에 현재 사용량을 나타내준다. 네트워크 모니터링을 많이 해 보신 분이라면 MRTG 를 본적이 있을 것이다. 그것과도 조금은 흡사한 형태로 표시된다.


현재 내 컴퓨터에서 사용되는 트래픽을 실시간적으로 모니터링 하거나, 일/주/월 별 사용량등을 파악하는데는 유용할 것이다. 화면은 간단하게 구성되어 있어, 어렵지 않게 사용할 수 있다. 화면에서 오른쪽 마우스를 클릭하면 몇가지 메뉴를 선택할 수가 있다.

이 프로그램을 사용하기 위해서는 Winpcap 이 설치되어야 하며, 다운로드는 다음의 경로에서 할 수 있다.

2010년 10월 1일 금요일

윈도우 기반의 네트워크 패킷 생성 도구 - NPG

오랜만에 윈도우 환경에서 사용할 수 있는 네트워크 패킷 생성 도구 하나를 소개하고자 한다.
이름은 Network Packet Generator 이며 약자로 NPG 이다. GNU GPL 라이센스로
자유롭게 사용가능하다. NPG 는 WinPcap 을 이용하여 패킷을 생성하며, 주요한 것을 요약해 보면 다음과 같다

- 오픈소스
- 윈도우 환경에서 동작
- Libpcap 기반의 패킷 생성기
- PCAP 호환 패킷 파일 또는 NPG 포맷의 파일을 이용하여 패킷 생성
- 패킷 바이트 스트림 전송

기능은 아주 다양하지는 않지만, 기존에 보아오던 것과 좀 다른 특징은 NPG 라 정의되어 있는
포맷 형태이다. 이 포맷 형태에 맞춰서 생성될 패킷의 HEX 값을 나열해 주면 된다.
이런 기능이 유용한 경우가 있기 때문에 특정 작업에서는 요긴할 것이다.

NPG 는 다음의 경로에서 받을 수 있다.


일단 아무 옵션없이 실행하면, 인터렉티브 모드로 동작하여 사용자가 선택하여 작업을 결정할 수 있는데,
처음 접하는 분들에겐 유용할 수도 있다.

C:\Npg1.3.0\bin>npg
Network Packet Generator 1.3.0
Copyright (C) 2006 Jason Todd
WikiSTC - http://www.wikistc.org/

No arguments detected, using interactive mode. Use npg -h for arugments.

Output information level:

[1] None
[2] Verbose
[3] Very Verbose
[4] Very Very Verbose

Selection [3]:


이외 몇 가지 옵션을 알아보면 다음과 같다.

-h 도움말
-d 패킷을 인젝트할 네트워크 디바이스를 선택
-f NPG 패킷파일의 이름 지정
-F Libpcap 호환 패킷파일 이름 지정
-l 사용가능한 네트워크 디바이스 나열
-p <packet byte stream>
인젝트할 패킷 바이트를 HEX 값으로 나열해주면 됨
-r <repeat count>  
패킷을 몇번 반복할지 카운트를 지정
-t <interval>
패킷을 인젝트 하기 전 시간 간격을 지정 (시간 기준은 밀리세컨드)
-v, -vv, -vvv
동작 상태를 표시 v 가 많을 수록 세부정보를 표시함

옵션을 대충 봐도 무슨 기능인지 추측이 가능할 정도로 복잡하지는 않다. 예를 들어,
다음과 같이 -F 를 통해 pcap 파일을 지정해 본다면

C:\Npg1.3.0\bin>npg -vvv -F packets.cap
Network Packet Generator 1.3.0
Copyright (C) 2006 Jason Todd
WikiSTC - http://www.wikistc.org/


Successfully opened file packets.cap as read only

Successfully processed 7 packets in packets.cap
599 bytes allocated in packet queue to be sent
Elapsed time : 0.000

시간 간격을 둘것인지 물어본다.

Use time intervals defined in packets.cap:

[1] Yes
[2] No

Selection [2]:
An output device must be selected for injecting the packets

기본설정은 No 이며 엔터를 치면 다음 사용가능한 디바이스를 나열해 준다.
여기서 패킷을 전송할 인터페이스 번호를 골라주면 된다.

Available devices:

[1] Network adapter 'Sun' on local host
[2] Network adapter 'NVIDIA nForce MCP Networking Adapter Driver' on local host

Select default device (1-2):2

인터페이스를 선택하면 아래와 같이 패킷을 인젝트 하여 전송한다.

Elapsed time : 0.001
7 packets successfully injected
599 bytes sent
Releasing 599 bytes used for LibpcapQueue

인터페이스를 지정하지 않으면 알아서 인터페이스를 나열해 주고, 시간간격을 지정해 주지 않아도
물어봐 준다. 그만큼 쉽게 사용 가능하다.

앞서 말한것과 같이 NPG 는 자체의 포맷 형태를 이용해 패킷을 만들어 전송할 수 있다. 이 형태를
알아보면 다음과 같다:

NPG 패킷파일은 {    } 로 둘러 쌓인 블럭으로 이뤄진다. 물론 값은 00-FF 사이의 HEX 값으로 표현되며
공백이나, 탭, 주석은 무시된다. 전송할 패킷 구성은 아래와 같은 형태 블럭으로 이뤄진다.

예제>
1. { 01 02 03 04 05 06 06 05 04 03 02 01 08 00 }
2. { 01 02 03 04 05 06
  06 05 04 03 02 01
  08 00 }
3. {0102030405060605040302010800}
4. {
0
1
0
2
0
3
}

그리고, 각 패킷 블럭이 시작되기 전 [  ] 로 묶어 표현해 주는 부분은 반복할 카운트와 시간간격을 지정하게 된다. 예를 들면 아래와 같다

[0,1000]
[3,0]

자, 그럼 NPG 파일안에 들어있는 예제파일을 한번 들여다 보자. 패킷 블럭 시작전에 [3,1000] 으로
3번 반복하고 1000 밀리세컨드 간격이 있다는 것을 뜻한다.
그리고 < > 로 묶인 부분은 이것이 어떤 형태인지 말해주는 태그이다.  그 다음 시작되는 {  } 는
실제 발송될 패킷이 기술되는 것으로 보기좋게 라인별로 기술되어 있다.
앞서 말했듯이 주석과, 공백등은 무시되므로 아래 예제와 같이 사람이 보기 좋게 나열하여
사용하는 것이 좋다.

# TCP/IP ICMP Echo Request
[3,1000]
<ICMP Echo Request>
{
# Ethernet HEADER -----

  01 02 03 04 05 06  # Destination MAC
  06 05 04 03 02 01  # Source MAC
  08 00              # Protocol

# IP HEADER -----------

  45                 # Version / Header Length
  00                 # Type of service
  00 3c              # Total length
  00 a5              # Identification
  00 00              # Flags / Fragment offset
  80                 # Time to live
  01                 # Protocol
  b8 c8              # Checksum
  c0 a8 00 02        # Source address
  c0 a8 00 01        # Destination address

# ICMP HEADER ---------

  08                 # Type
  00                 # Code
  4a 5c              # Checksum
  02 00              # Identification
  01 00              # Sequence number
  61 62 63 64 65 66  # Data (Windows ping)
  67 68 69 6a 6b 6c
  6d 6e 6f 70 71 72
  73 74 75 76 77 61
  62 63 64 65 66 67
  68 69
}

만들어진 포맷 파일을 이용하여 -f 옵션으로 전송할 수 있다.

C:\Npg1.3.0\bin>npg -vv -f packets.txt -d rpcap://\Device\NPF_{E849DA
84-A444-4334-BD12-157CFC55BD8B}
Network Packet Generator 1.3.0
Copyright (C) 2006 Jason Todd
WikiSTC - http://www.wikistc.org/


Successfully processed 3 packets in packets.txt
Elapsed time : 0.000
Injecting packet queue obeying time intervals

Waiting approximately 1000 milliseconds
Injecting Packet #1
Device: rpcap://\Device\NPF_{E849DA84-A444-4334-BD12-15XXX55BD8B}
Packet ID: ICMP Echo Request
Repeat count: 0

그리고 아래와 같이 -p 옵션을 통해 전송할 데이터를 바로 지정할 수도 있다.

C:\Npg1.3.0\bin>npg -vv -p 0001020304 -d rpcap://\Device\NPF_{E849DA8
4-A444-4334-BD12-15XXX55BD8B}

하지만 위에서 사용한 예에서는 임의로 지정한 것이기 때문에 패킷이 알 수없는 형태로 전송된다.
어떤 프로토콜 형태에 맞춰서 작성된 것이 아니기 때문이다. -p 옵션등은 명령어 옵션을 통해
바로 패킷을 전달하고자 할때 사용하면 된다.

[참고]
1. NPG
http://www.wikistc.org/wiki/Network_packet_generator
2. NPG 파일 다운로드 (요청에 의해 해당 소스 파일을 첨부해 놓습니다)