pcapr-local 0.1.10

Sign up to get free protection for your applications and to get access to all the features.
Files changed (203) hide show
  1. data/.document +5 -0
  2. data/LICENSE.txt +20 -0
  3. data/README.md +64 -0
  4. data/Rakefile +57 -0
  5. data/VERSION +1 -0
  6. data/bin/pcap2par +49 -0
  7. data/bin/startpcapr +40 -0
  8. data/bin/stoppcapr +33 -0
  9. data/bin/xtractr +5 -0
  10. data/lib/environment.rb +106 -0
  11. data/lib/exe/xtractr +0 -0
  12. data/lib/mu/pcap.rb +110 -0
  13. data/lib/mu/pcap/ethernet.rb +148 -0
  14. data/lib/mu/pcap/header.rb +75 -0
  15. data/lib/mu/pcap/io_pair.rb +67 -0
  16. data/lib/mu/pcap/io_wrapper.rb +76 -0
  17. data/lib/mu/pcap/ip.rb +61 -0
  18. data/lib/mu/pcap/ipv4.rb +257 -0
  19. data/lib/mu/pcap/ipv6.rb +148 -0
  20. data/lib/mu/pcap/packet.rb +104 -0
  21. data/lib/mu/pcap/pkthdr.rb +155 -0
  22. data/lib/mu/pcap/reader.rb +61 -0
  23. data/lib/mu/pcap/reader/http_family.rb +170 -0
  24. data/lib/mu/pcap/sctp.rb +367 -0
  25. data/lib/mu/pcap/sctp/chunk.rb +123 -0
  26. data/lib/mu/pcap/sctp/chunk/data.rb +134 -0
  27. data/lib/mu/pcap/sctp/chunk/init.rb +100 -0
  28. data/lib/mu/pcap/sctp/chunk/init_ack.rb +68 -0
  29. data/lib/mu/pcap/sctp/parameter.rb +110 -0
  30. data/lib/mu/pcap/sctp/parameter/ip_address.rb +48 -0
  31. data/lib/mu/pcap/stream_packetizer.rb +72 -0
  32. data/lib/mu/pcap/tcp.rb +505 -0
  33. data/lib/mu/pcap/udp.rb +69 -0
  34. data/lib/mu/scenario/pcap.rb +164 -0
  35. data/lib/mu/scenario/pcap/fields.rb +50 -0
  36. data/lib/mu/scenario/pcap/rtp.rb +71 -0
  37. data/lib/pcapr_local.rb +159 -0
  38. data/lib/pcapr_local/config.rb +336 -0
  39. data/lib/pcapr_local/db.rb +197 -0
  40. data/lib/pcapr_local/scanner.rb +250 -0
  41. data/lib/pcapr_local/server.rb +178 -0
  42. data/lib/pcapr_local/www/favicon.ico +0 -0
  43. data/lib/pcapr_local/www/favicon.png +0 -0
  44. data/lib/pcapr_local/www/home/index.html +138 -0
  45. data/lib/pcapr_local/www/static/image/16x16/Cancel.png +0 -0
  46. data/lib/pcapr_local/www/static/image/16x16/Cancel.png.1 +0 -0
  47. data/lib/pcapr_local/www/static/image/16x16/Download.png +0 -0
  48. data/lib/pcapr_local/www/static/image/16x16/Folder3.png +0 -0
  49. data/lib/pcapr_local/www/static/image/16x16/Full Size.png +0 -0
  50. data/lib/pcapr_local/www/static/image/16x16/Minus.png +0 -0
  51. data/lib/pcapr_local/www/static/image/16x16/Plus.png +0 -0
  52. data/lib/pcapr_local/www/static/image/16x16/Search.png +0 -0
  53. data/lib/pcapr_local/www/static/image/16x16/User.png +0 -0
  54. data/lib/pcapr_local/www/static/image/48x48/Phone.png +0 -0
  55. data/lib/pcapr_local/www/static/image/48x48/Video.png +0 -0
  56. data/lib/pcapr_local/www/static/image/bar-orange.gif +0 -0
  57. data/lib/pcapr_local/www/static/image/beta.png +0 -0
  58. data/lib/pcapr_local/www/static/image/bg.png +0 -0
  59. data/lib/pcapr_local/www/static/image/blockquote.png +0 -0
  60. data/lib/pcapr_local/www/static/image/body-bg.png +0 -0
  61. data/lib/pcapr_local/www/static/image/body-h3.png +0 -0
  62. data/lib/pcapr_local/www/static/image/body-hl1-bg.png +0 -0
  63. data/lib/pcapr_local/www/static/image/body-hl1-h3.png +0 -0
  64. data/lib/pcapr_local/www/static/image/body-hl1-readmore.png +0 -0
  65. data/lib/pcapr_local/www/static/image/body-hl2-bg.png +0 -0
  66. data/lib/pcapr_local/www/static/image/body-hl2-h3.png +0 -0
  67. data/lib/pcapr_local/www/static/image/body-hl2-readmore.png +0 -0
  68. data/lib/pcapr_local/www/static/image/body-hl3-bg.png +0 -0
  69. data/lib/pcapr_local/www/static/image/body-hl3-h3.png +0 -0
  70. data/lib/pcapr_local/www/static/image/body-hl3-readmore.png +0 -0
  71. data/lib/pcapr_local/www/static/image/body-hl4-bg.png +0 -0
  72. data/lib/pcapr_local/www/static/image/body-hl4-h3.png +0 -0
  73. data/lib/pcapr_local/www/static/image/body-hl4-readmore.png +0 -0
  74. data/lib/pcapr_local/www/static/image/body-hl5-h3.png +0 -0
  75. data/lib/pcapr_local/www/static/image/body-hl6-h3.png +0 -0
  76. data/lib/pcapr_local/www/static/image/body-hl7-h3.png +0 -0
  77. data/lib/pcapr_local/www/static/image/body-hl8-h3.png +0 -0
  78. data/lib/pcapr_local/www/static/image/body-readmore.png +0 -0
  79. data/lib/pcapr_local/www/static/image/bottom-bg.png +0 -0
  80. data/lib/pcapr_local/www/static/image/bottom-l.png +0 -0
  81. data/lib/pcapr_local/www/static/image/bottom-r.png +0 -0
  82. data/lib/pcapr_local/www/static/image/btn-search.png +0 -0
  83. data/lib/pcapr_local/www/static/image/bullet-1.png +0 -0
  84. data/lib/pcapr_local/www/static/image/bullet-2.png +0 -0
  85. data/lib/pcapr_local/www/static/image/bullet-3.png +0 -0
  86. data/lib/pcapr_local/www/static/image/bullet-4.png +0 -0
  87. data/lib/pcapr_local/www/static/image/bullet-5.png +0 -0
  88. data/lib/pcapr_local/www/static/image/bullet-6.png +0 -0
  89. data/lib/pcapr_local/www/static/image/bullet-7.png +0 -0
  90. data/lib/pcapr_local/www/static/image/bullet-hl1.png +0 -0
  91. data/lib/pcapr_local/www/static/image/bullet-hl2.png +0 -0
  92. data/lib/pcapr_local/www/static/image/bullet-hl3.png +0 -0
  93. data/lib/pcapr_local/www/static/image/bullet-hl4.png +0 -0
  94. data/lib/pcapr_local/www/static/image/bullet-pathway.png +0 -0
  95. data/lib/pcapr_local/www/static/image/bullet-section1.png +0 -0
  96. data/lib/pcapr_local/www/static/image/bullet-section2.png +0 -0
  97. data/lib/pcapr_local/www/static/image/collapsed.gif +0 -0
  98. data/lib/pcapr_local/www/static/image/crosslink.png +0 -0
  99. data/lib/pcapr_local/www/static/image/expanded.gif +0 -0
  100. data/lib/pcapr_local/www/static/image/favicon.ico +0 -0
  101. data/lib/pcapr_local/www/static/image/favicon.png +0 -0
  102. data/lib/pcapr_local/www/static/image/icon-author.png +0 -0
  103. data/lib/pcapr_local/www/static/image/icon-created.png +0 -0
  104. data/lib/pcapr_local/www/static/image/p-expand.gif +0 -0
  105. data/lib/pcapr_local/www/static/image/pcapr-logo.png +0 -0
  106. data/lib/pcapr_local/www/static/image/powered-by.png +0 -0
  107. data/lib/pcapr_local/www/static/image/section1-bg.png +0 -0
  108. data/lib/pcapr_local/www/static/image/section1-h3.png +0 -0
  109. data/lib/pcapr_local/www/static/image/section1-readmore.png +0 -0
  110. data/lib/pcapr_local/www/static/image/section2-bg.png +0 -0
  111. data/lib/pcapr_local/www/static/image/section2-h3.png +0 -0
  112. data/lib/pcapr_local/www/static/image/section2-readmore.png +0 -0
  113. data/lib/pcapr_local/www/static/image/status-alert.png +0 -0
  114. data/lib/pcapr_local/www/static/image/status-download.png +0 -0
  115. data/lib/pcapr_local/www/static/image/status-info.png +0 -0
  116. data/lib/pcapr_local/www/static/image/status-note.png +0 -0
  117. data/lib/pcapr_local/www/static/image/tab-round.png +0 -0
  118. data/lib/pcapr_local/www/static/image/throbber.gif +0 -0
  119. data/lib/pcapr_local/www/static/image/user.jpg +0 -0
  120. data/lib/pcapr_local/www/static/script/closet/async.js +421 -0
  121. data/lib/pcapr_local/www/static/script/closet/closet.api.js +241 -0
  122. data/lib/pcapr_local/www/static/script/closet/closet.folders.js +94 -0
  123. data/lib/pcapr_local/www/static/script/closet/closet.js +187 -0
  124. data/lib/pcapr_local/www/static/script/closet/closet.mr.js +219 -0
  125. data/lib/pcapr_local/www/static/script/closet/closet.options.js +359 -0
  126. data/lib/pcapr_local/www/static/script/closet/closet.quantity.js +73 -0
  127. data/lib/pcapr_local/www/static/script/closet/closet.render.js +205 -0
  128. data/lib/pcapr_local/www/static/script/closet/closet.report.js +86 -0
  129. data/lib/pcapr_local/www/static/script/closet/closet.reports.http.js +135 -0
  130. data/lib/pcapr_local/www/static/script/closet/closet.reports.overview.js +163 -0
  131. data/lib/pcapr_local/www/static/script/closet/closet.reports.sip.js +159 -0
  132. data/lib/pcapr_local/www/static/script/closet/closet.reports.tcp.js +72 -0
  133. data/lib/pcapr_local/www/static/script/closet/closet.reports.visualize.js +263 -0
  134. data/lib/pcapr_local/www/static/script/closet/closet.util.js +40 -0
  135. data/lib/pcapr_local/www/static/script/jquery/jquery-1.4.2.min.js +154 -0
  136. data/lib/pcapr_local/www/static/script/jquery/jquery-ui.js +10921 -0
  137. data/lib/pcapr_local/www/static/script/jquery/jquery.flot.js +2123 -0
  138. data/lib/pcapr_local/www/static/script/jquery/jquery.flot.selection.js +184 -0
  139. data/lib/pcapr_local/www/static/script/jquery/jquery.flot.stack.js +184 -0
  140. data/lib/pcapr_local/www/static/script/jquery/jquery.form.js +643 -0
  141. data/lib/pcapr_local/www/static/script/jquery/jquery.jsonp.min.js +3 -0
  142. data/lib/pcapr_local/www/static/script/jquery/jquery.menu.js +142 -0
  143. data/lib/pcapr_local/www/static/script/jquery/jquery.suggest.js +308 -0
  144. data/lib/pcapr_local/www/static/script/jquery/jquery.ui.core.js +203 -0
  145. data/lib/pcapr_local/www/static/script/jquery/jquery.ui.slider.js +629 -0
  146. data/lib/pcapr_local/www/static/script/jquery/jquery.ui.sortable.js +1055 -0
  147. data/lib/pcapr_local/www/static/script/jquery/jquery.ui.widget.js +236 -0
  148. data/lib/pcapr_local/www/static/script/json2.js +481 -0
  149. data/lib/pcapr_local/www/static/script/sammy/plugins/sammy.cache.js +115 -0
  150. data/lib/pcapr_local/www/static/script/sammy/plugins/sammy.template.js +117 -0
  151. data/lib/pcapr_local/www/static/script/sammy/sammy.js +1696 -0
  152. data/lib/pcapr_local/www/static/script/tipsy/jquery.tipsy.js +104 -0
  153. data/lib/pcapr_local/www/static/style/c3p0.css +116 -0
  154. data/lib/pcapr_local/www/static/style/jquery.suggest.css +27 -0
  155. data/lib/pcapr_local/www/static/style/page.css +1113 -0
  156. data/lib/pcapr_local/www/static/style/tipsy.css +7 -0
  157. data/lib/pcapr_local/www/templates/browse.services.template +10 -0
  158. data/lib/pcapr_local/www/templates/browse.template +77 -0
  159. data/lib/pcapr_local/www/templates/flows.template +38 -0
  160. data/lib/pcapr_local/www/templates/pcap.template +63 -0
  161. data/lib/pcapr_local/www/templates/sip.calls.template +35 -0
  162. data/lib/pcapr_local/www/templates/statistics.template +6 -0
  163. data/lib/pcapr_local/xtractr.rb +179 -0
  164. data/lib/pcapr_local/xtractr/instance.rb +172 -0
  165. data/pcapr-local.gemspec +297 -0
  166. data/test/mu/pcap/reader/tc_http_family.rb +251 -0
  167. data/test/mu/pcap/tc_ethernet.rb +71 -0
  168. data/test/mu/pcap/tc_header.rb +56 -0
  169. data/test/mu/pcap/tc_ipv4.rb +103 -0
  170. data/test/mu/pcap/tc_ipv6.rb +83 -0
  171. data/test/mu/pcap/tc_packet.rb +44 -0
  172. data/test/mu/pcap/tc_pair.rb +58 -0
  173. data/test/mu/pcap/tc_pkthdr.rb +33 -0
  174. data/test/mu/pcap/tc_reader.rb +76 -0
  175. data/test/mu/pcap/tc_tcp.rb +426 -0
  176. data/test/mu/pcap/tc_udp.rb +33 -0
  177. data/test/mu/pcap/tc_wrapper.rb +80 -0
  178. data/test/mu/scenario/pcap/tc_fields.rb +67 -0
  179. data/test/mu/scenario/pcap/tc_rtp.rb +135 -0
  180. data/test/mu/scenario/sip_signalled_call_1.pcap +0 -0
  181. data/test/mu/scenario/tc_pcap.rb +190 -0
  182. data/test/mu/scenario/test_data/arp.pcap +0 -0
  183. data/test/mu/scenario/test_data/dns.pcap +0 -0
  184. data/test/mu/scenario/test_data/http-v6.pcap +0 -0
  185. data/test/mu/scenario/test_data/http.pcap +0 -0
  186. data/test/mu/scenario/test_data/http_chunked.pcap +0 -0
  187. data/test/mu/scenario/test_data/http_deflate.pcap +0 -0
  188. data/test/mu/scenario/test_data/httpauth3.pcap +0 -0
  189. data/test/mu/scenario/test_data/icmp.pcap +0 -0
  190. data/test/mu/scenario/test_data/sip_signalled_call_1.pcap +0 -0
  191. data/test/mu/tc_pcap.rb +39 -0
  192. data/test/mu/testcase.rb +86 -0
  193. data/test/pcapr_local/arp.pcap +0 -0
  194. data/test/pcapr_local/data.js +3 -0
  195. data/test/pcapr_local/http_chunked.pcap +0 -0
  196. data/test/pcapr_local/tc_api.rb +181 -0
  197. data/test/pcapr_local/test.tgz +0 -0
  198. data/test/pcapr_local/test_scanner.rb +241 -0
  199. data/test/pcapr_local/test_xtractr.rb +219 -0
  200. data/test/pcapr_local/testcase.rb +107 -0
  201. data/test/test_export_to_scenario.sh +25 -0
  202. data/test/test_pcapr_local.rb +29 -0
  203. metadata +450 -0
@@ -0,0 +1,71 @@
1
+ # http://www.mudynamics.com
2
+ # http://labs.mudynamics.com
3
+ # http://www.pcapr.net
4
+
5
+ require 'mu/testcase'
6
+ require 'mu/pcap'
7
+
8
+ module Mu
9
+ class Pcap
10
+ class Ethernet
11
+
12
+ class Test < Mu::TestCase
13
+ def test_basics
14
+ ethernet = Ethernet.new
15
+ ethernet.dst = '00:01:01:00:00:02'
16
+ ethernet.src = '00:01:01:00:00:01'
17
+ ethernet.type = 0x1234
18
+ ethernet.payload = ''
19
+
20
+ bytes = "\0\1\1\0\0\2" + "\0\1\1\0\0\1" + "\x12\x34"
21
+ ethernet_in = Ethernet.from_bytes bytes
22
+ assert_equal ethernet, ethernet_in
23
+ end
24
+
25
+ def test_vlan
26
+ ethernet = Ethernet.new
27
+ ethernet.dst = '00:01:01:00:00:02'
28
+ ethernet.src = '00:01:01:00:00:01'
29
+ ethernet.type = 0x1234
30
+ ethernet.payload = 'hi'
31
+ ethernet.payload_raw = 'hi'
32
+
33
+ # Strip out VLAN tag
34
+ vlan = "\x81\00" + "\x00\x01"
35
+ bytes = "\0\1\1\0\0\2" + "\0\1\1\0\0\1" + vlan + "\x12\x34hi"
36
+ ethernet_in = Ethernet.from_bytes bytes
37
+ assert_equal ethernet, ethernet_in
38
+
39
+ # Strip out multiple VLAN tags
40
+ bytes = "\0\1\1\0\0\2" + "\0\1\1\0\0\1" + vlan*10 + "\x12\x34hi"
41
+ ethernet_in = Ethernet.from_bytes bytes
42
+ assert_equal ethernet, ethernet_in
43
+ end
44
+
45
+ def test_pppoe
46
+ ethernet = Ethernet.new
47
+ ethernet.dst = '00:01:01:00:00:02'
48
+ ethernet.src = '00:01:01:00:00:01'
49
+ ethernet.type = ETHERTYPE_IP
50
+ ethernet.payload = IPv4.new '127.0.0.1', '127.0.0.2'
51
+ ethernet.payload_raw = ethernet.payload.to_bytes
52
+
53
+ ipv4 = IPv4.new '127.0.0.1', '127.0.0.2'
54
+ bytes = "\0\1\1\0\0\2" + "\0\1\1\0\0\1" + "\x88\x64" +
55
+ # PPPoE
56
+ "\x11" + # version 1, type 1
57
+ "\x00" + # code
58
+ "\x00\x01" + # session ID
59
+ "\x00\x14" + # length
60
+ # PPP
61
+ "\x00\x21" + # IP
62
+ # IPv4
63
+ ipv4.to_bytes
64
+ ethernet_in = Ethernet.from_bytes bytes
65
+ assert_equal ethernet, ethernet_in
66
+ end
67
+ end
68
+
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,56 @@
1
+ # http://www.mudynamics.com
2
+ # http://labs.mudynamics.com
3
+ # http://www.pcapr.net
4
+
5
+ require 'mu/testcase'
6
+ require 'mu/pcap'
7
+
8
+ module Mu
9
+ class Pcap
10
+ class Header
11
+
12
+ class Test < Mu::TestCase
13
+ def test_basics
14
+ header = Header.new
15
+ header.magic = BIG_ENDIAN
16
+ header.version_major = 2
17
+ header.version_minor = 4
18
+ header.thiszone = 0
19
+ header.sigfigs = 0
20
+ header.snaplen = 1500
21
+ header.linktype = 1
22
+
23
+ # Big endian
24
+ bytes = "\xa1\xb2\xc3\xd4" + "\x00\x02" + "\x00\x04" +
25
+ "\x00\x00\x00\x00" + "\x00\x00\x00\x00" +
26
+ "\x00\x00\x05\xdc" + "\x00\x00\x00\x01"
27
+ header_in = Header.read StringIO.new(bytes)
28
+ assert_equal header, header_in
29
+
30
+ # Little endian
31
+ header.magic = LITTLE_ENDIAN
32
+ bytes = "\xd4\xc3\xb2\xa1" + "\x02\x00" + "\x04\x00" +
33
+ "\x00\x00\x00\x00" + "\x00\x00\x00\x00" +
34
+ "\xdc\x05\x00\x00" + "\x01\x00\x00\x00"
35
+ header_in = Header.read StringIO.new(bytes)
36
+ assert_equal header, header_in
37
+ end
38
+
39
+
40
+ def test_decode_null
41
+ ethernet = Ethernet.new
42
+ ethernet.src = '00:01:01:00:00:01'
43
+ ethernet.dst = '00:01:01:00:00:02'
44
+ ethernet.type = Ethernet::ETHERTYPE_IP
45
+ ethernet.payload = ethernet.payload_raw = 'hello'
46
+ bytes = nil
47
+ with_no_stderr do # supress warning about malformed IPv4
48
+ bytes = Pkthdr.decode_null BIG_ENDIAN, "\0\0\0\2hello"
49
+ end
50
+ assert_equal ethernet, bytes
51
+ end
52
+ end
53
+
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,103 @@
1
+ # http://www.mudynamics.com
2
+ # http://labs.mudynamics.com
3
+ # http://www.pcapr.net
4
+
5
+ require 'mu/testcase'
6
+ require 'mu/pcap'
7
+
8
+ module Mu
9
+ class Pcap
10
+ class IPv4
11
+
12
+ class Test < Mu::TestCase
13
+ def test_basics
14
+ bytes =
15
+ "\x47"+ # version, header length
16
+ "\x00" + # TOS
17
+ "\x00\x1c" + # length
18
+ "\x4c\xb7" + # ID
19
+ "\x00\x00" + # offset
20
+ "\x40" + # TTL
21
+ "\x01" + # protocol
22
+ "\x99\x2a" + # checksum
23
+ "\x0a\x01\x02\x03" + # src-ip
24
+ "\x0a\x02\x03\x04" + # dst-ip
25
+ "\x94\x04\x00\x00\x00\x00" + "\x00\x00" # options
26
+
27
+ ipv4 = IPv4.new
28
+ ipv4.ip_id = 19639
29
+ ipv4.ttl = 64
30
+ ipv4.proto = 1
31
+ ipv4.src = '10.1.2.3'
32
+ ipv4.dst = '10.2.3.4'
33
+ ipv4.payload = ''
34
+
35
+ ipv4_in = nil
36
+ with_no_stderr do # supress warning about options
37
+ ipv4_in = IPv4.from_bytes bytes
38
+ end
39
+ assert_equal ipv4, ipv4_in
40
+ end
41
+
42
+ def test_reassemble
43
+ # empty stream
44
+ assert_equal [], IPv4.reassemble([])
45
+
46
+ # one packet
47
+ ip = ip 0, "A" * 10
48
+ assert_equal [ip], IPv4.reassemble([ip])
49
+
50
+ # three packets
51
+ ip1 = ip IP_MF | 0, "A" * 16
52
+ ip2 = ip IP_MF | 2, "B" * 16
53
+ ip3 = ip 4, "C" * 16
54
+ ipo = ip IP_MF | 3, "B" * 8 + "C" * 8 # overlap
55
+ ipe = ip IP_MF | 1, "" # empty
56
+ ip = ip 0, "A" * 16 + "B" * 16 + "C" * 16
57
+ [[ip1, ip2, ip3],
58
+ [ip1, ip3, ip2],
59
+ [ip2, ip1, ip3],
60
+ [ip2, ip3, ip1],
61
+ [ip3, ip1, ip2],
62
+ [ip3, ip2, ip1]].each do |ips|
63
+ with_no_stderr do
64
+ assert_equal [ip], IPv4.reassemble(ips)
65
+ end
66
+ # test with overlapping fragment
67
+ 0.upto(ips.length-1) do |i|
68
+ ips.insert i, ipo
69
+ with_no_stderr do
70
+ assert_equal [ip], IPv4.reassemble(ips)
71
+ end
72
+ ips.delete_at i
73
+ end
74
+ # test with empty fragment
75
+ 0.upto(ips.length-1) do |i|
76
+ ips.insert i, ipe
77
+ with_no_stderr do
78
+ assert_equal [ip], IPv4.reassemble(ips)
79
+ end
80
+ ips.delete_at i
81
+ end
82
+ end
83
+ end
84
+
85
+ def ip offset, payload
86
+ ipv4 = IPv4.new
87
+ ethernet = Ethernet.new
88
+ ethernet.src = '00:01:00:00:00:01'
89
+ ethernet.dst = '00:01:00:00:00:02'
90
+ ipv4.src = '10.0.0.1'
91
+ ipv4.dst = '10.0.0.2'
92
+ ipv4.proto = IPv4::IPPROTO_TCP
93
+ ipv4.offset = offset
94
+ ipv4.payload = payload
95
+ ethernet.type = Ethernet::ETHERTYPE_IP
96
+ ethernet.payload = ipv4
97
+ return ethernet
98
+ end
99
+ end
100
+
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,83 @@
1
+ # http://www.mudynamics.com
2
+ # http://labs.mudynamics.com
3
+ # http://www.pcapr.net
4
+
5
+ require 'mu/testcase'
6
+ require 'mu/pcap'
7
+
8
+ module Mu
9
+ class Pcap
10
+ class IPv6
11
+
12
+ class Test < Mu::TestCase
13
+ def test_basics
14
+ bytes =
15
+ "60000000" + # version, class, label
16
+ "0005" + # length
17
+ "59" + # next header
18
+ "40" + # hop limit
19
+ "00000000000000000000000000000001" + # source
20
+ "ff020000000000000000000000000005" # destination
21
+ bytes = bytes.from_hex + 'hello'
22
+
23
+ ipv6 = IPv6.new
24
+ ipv6.next_header = 0x59
25
+ ipv6.hop_limit = 64
26
+ ipv6.src = '::1'
27
+ ipv6.dst = 'ff02::5'
28
+ ipv6.payload = 'hello'
29
+ ipv6.payload_raw = 'hello'
30
+
31
+ ipv6_in = nil
32
+ with_no_stderr do # supress warning about options
33
+ ipv6_in = IPv6.from_bytes bytes
34
+ end
35
+ assert_equal ipv6, ipv6_in
36
+ end
37
+
38
+ def test_headers
39
+ packet =
40
+ "60000000" + # version, class, label
41
+ "%04x" + # length
42
+ "%02x" + # next header
43
+ "40" + # hop limit
44
+ "00000000000000000000000000000001" + # source
45
+ "ff020000000000000000000000000005" # destination
46
+
47
+ # No next header
48
+ bytes = (packet % [0, IP::IPPROTO_NONE]).from_hex
49
+ ipv6 = IPv6.from_bytes bytes
50
+ assert_equal IP::IPPROTO_NONE, ipv6.next_header
51
+ assert_equal '', ipv6.payload
52
+
53
+ # Hop-by-hop options
54
+ bytes = (packet % [8, IP::IPPROTO_HOPOPTS]).from_hex +
55
+ [IP::IPPROTO_NONE, 0, "\0\0\0\0\0\0"].pack('CCa6')
56
+ ipv6 = IPv6.from_bytes bytes
57
+ assert_equal IP::IPPROTO_NONE, ipv6.next_header
58
+
59
+ # Routing header options
60
+ bytes = (packet % [8, IP::IPPROTO_ROUTING]).from_hex +
61
+ [IP::IPPROTO_NONE, 0, "\0\0\0\0\0\0"].pack('CCa6')
62
+ ipv6 = IPv6.from_bytes bytes
63
+ assert_equal IP::IPPROTO_NONE, ipv6.next_header
64
+
65
+ # Destination options
66
+ bytes = (packet % [8, IP::IPPROTO_DSTOPTS]).from_hex +
67
+ [IP::IPPROTO_NONE, 0, "\0\0\0\0\0\0"].pack('CCa6')
68
+ ipv6 = IPv6.from_bytes bytes
69
+ assert_equal IP::IPPROTO_NONE, ipv6.next_header
70
+
71
+ # Fragment (not supported)
72
+ bytes = (packet % [8, IP::IPPROTO_FRAGMENT]).from_hex +
73
+ [IP::IPPROTO_NONE, 0, 0, 0].pack('CCnN')
74
+ with_no_stderr do
75
+ ipv6 = IPv6.from_bytes bytes
76
+ end
77
+ assert_equal IP::IPPROTO_FRAGMENT, ipv6.next_header
78
+ end
79
+ end
80
+
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,44 @@
1
+ # http://www.mudynamics.com
2
+ # http://labs.mudynamics.com
3
+ # http://www.pcapr.net
4
+
5
+ require 'mu/testcase'
6
+ require 'mu/pcap'
7
+
8
+ module Mu
9
+ class Pcap
10
+ class Packet
11
+
12
+ class Test < Mu::TestCase
13
+ def test_isolate_l7
14
+ # Empty
15
+ assert_equal [], Packet.isolate_l7([])
16
+
17
+ # Ethernet
18
+ ethernet = Ethernet.new
19
+ assert_equal [ethernet], Packet.isolate_l7([ethernet])
20
+
21
+ # UDP packet
22
+ udp = Ethernet.new
23
+ udp.payload = IPv4.new
24
+ udp.payload.payload = UDP.new
25
+ udp.payload.payload.src_port = 1000
26
+ assert_equal [udp], Packet.isolate_l7([udp])
27
+
28
+ # UDP packet and Ethernet
29
+ assert_equal [udp], Packet.isolate_l7([udp, ethernet])
30
+ assert_equal [udp], Packet.isolate_l7([ethernet, udp])
31
+
32
+ # UDP packet and DNS
33
+ dns = Ethernet.new
34
+ dns.payload = IPv4.new
35
+ dns.payload.payload = UDP.new
36
+ dns.payload.payload.src_port = 53
37
+ assert_equal [udp], Packet.isolate_l7([udp, dns])
38
+ assert_equal [udp], Packet.isolate_l7([dns, udp])
39
+ end
40
+ end
41
+
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,58 @@
1
+ # http://www.mudynamics.com
2
+ # http://labs.mudynamics.com
3
+ # http://www.pcapr.net
4
+
5
+ require 'mu/testcase'
6
+ require 'mu/pcap/io_pair'
7
+
8
+ module Mu
9
+ class Pcap
10
+ class IOPair
11
+ class Test < Mu::TestCase
12
+
13
+ def test_stream
14
+ io1, io2 = IOPair.stream_pair
15
+
16
+ # send
17
+ assert_equal 3, io1.write("foo")
18
+ assert_equal "foo", io2.read(3)
19
+
20
+ # another
21
+ assert_equal 3, io1.write("bar")
22
+ assert_equal "bar", io2.read(0xffff)
23
+
24
+ # reverse
25
+ assert_equal 3, io2.write("baz")
26
+ assert_equal "baz", io1.read(0xffff)
27
+
28
+ # 2 sends, 1 receive
29
+ assert_equal 3, io1.write("one")
30
+ assert_equal 3, io1.write("two")
31
+ assert_equal "onetwo", io2.read(6)
32
+ end
33
+
34
+ def test_packet
35
+ io1, io2 = IOPair.packet_pair
36
+
37
+ # send
38
+ assert_equal 3, io1.write("foo")
39
+ assert_equal "foo", io2.read
40
+
41
+ # another
42
+ assert_equal 3, io1.write("bar")
43
+ assert_equal "bar", io2.read
44
+
45
+ # reverse
46
+ assert_equal 3, io2.write("baz")
47
+ assert_equal "baz", io1.read
48
+
49
+ # 2 sends, 2 receives
50
+ assert_equal 3, io1.write("one")
51
+ assert_equal 3, io1.write("two")
52
+ assert_equal "one", io2.read
53
+ assert_equal "two", io2.read
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,33 @@
1
+ # http://www.mudynamics.com
2
+ # http://labs.mudynamics.com
3
+ # http://www.pcapr.net
4
+
5
+ require 'mu/testcase'
6
+ require 'mu/pcap'
7
+
8
+ module Mu
9
+ class Pcap
10
+ class Pkthdr
11
+
12
+ class Test < Mu::TestCase
13
+ def test_basics
14
+ pkthdr = Pkthdr.new
15
+ pkthdr.endian = LITTLE_ENDIAN
16
+ pkthdr.ts_sec = 1191265036
17
+ pkthdr.ts_usec = 73432
18
+ pkthdr.caplen = 73
19
+ pkthdr.len = 73
20
+ pkthdr.pkt = 'X' * 73
21
+
22
+ bytes = "\x0c\x43\x01\x47" + "\xd8\x1e\x01\x00" +
23
+ "\x49\x00\x00\x00" + "\x49\x00\x00\x00" + ("X" * 73)
24
+ pkthdr_in = Pkthdr.read StringIO.new(bytes), LITTLE_ENDIAN
25
+ assert_equal pkthdr, pkthdr_in
26
+ end
27
+ end
28
+
29
+ end
30
+ end
31
+ end
32
+
33
+