mt_racket 1.0.12a

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. checksums.yaml +7 -0
  2. data/README +76 -0
  3. data/examples/arp-send +24 -0
  4. data/examples/arp-send2 +30 -0
  5. data/examples/cdp +39 -0
  6. data/examples/cdp-spew +52 -0
  7. data/examples/dhcp +42 -0
  8. data/examples/dhcp-spew +48 -0
  9. data/examples/dns +38 -0
  10. data/examples/egp +30 -0
  11. data/examples/hsrp +43 -0
  12. data/examples/hsrp_takeover +69 -0
  13. data/examples/icmp-recv +34 -0
  14. data/examples/icmp-spew +50 -0
  15. data/examples/icmpv6 +84 -0
  16. data/examples/icmpv6-spew +50 -0
  17. data/examples/igmpv1 +27 -0
  18. data/examples/igmpv2 +27 -0
  19. data/examples/igrp-send +25 -0
  20. data/examples/ipv6 +35 -0
  21. data/examples/nat-pimp +32 -0
  22. data/examples/ntp +38 -0
  23. data/examples/ntp2 +42 -0
  24. data/examples/sctp +32 -0
  25. data/examples/stp-send +21 -0
  26. data/examples/synflood +147 -0
  27. data/examples/tcp +43 -0
  28. data/examples/tcp2udp +65 -0
  29. data/examples/udp +46 -0
  30. data/examples/vrrp +34 -0
  31. data/examples/vtp +28 -0
  32. data/lib/racket/l2/eightotwodotthree.rb +48 -0
  33. data/lib/racket/l2/ethernet.rb +62 -0
  34. data/lib/racket/l2/llc.rb +50 -0
  35. data/lib/racket/l2/misc.rb +67 -0
  36. data/lib/racket/l2/snap.rb +40 -0
  37. data/lib/racket/l2/vlan.rb +61 -0
  38. data/lib/racket/l2/vtp.rb +124 -0
  39. data/lib/racket/l2.rb +30 -0
  40. data/lib/racket/l3/arp.rb +63 -0
  41. data/lib/racket/l3/cdp.rb +85 -0
  42. data/lib/racket/l3/egp.rb +53 -0
  43. data/lib/racket/l3/ipv4.rb +132 -0
  44. data/lib/racket/l3/ipv6.rb +66 -0
  45. data/lib/racket/l3/misc.rb +159 -0
  46. data/lib/racket/l3/stp.rb +81 -0
  47. data/lib/racket/l3.rb +30 -0
  48. data/lib/racket/l4/gre.rb +65 -0
  49. data/lib/racket/l4/icmp.rb +295 -0
  50. data/lib/racket/l4/icmpv6.rb +446 -0
  51. data/lib/racket/l4/igmpv1.rb +79 -0
  52. data/lib/racket/l4/igmpv2.rb +76 -0
  53. data/lib/racket/l4/igrp.rb +138 -0
  54. data/lib/racket/l4/misc.rb +35 -0
  55. data/lib/racket/l4/sctp.rb +163 -0
  56. data/lib/racket/l4/tcp.rb +152 -0
  57. data/lib/racket/l4/udp.rb +81 -0
  58. data/lib/racket/l4/vrrp.rb +95 -0
  59. data/lib/racket/l4.rb +30 -0
  60. data/lib/racket/l5/bootp.rb +106 -0
  61. data/lib/racket/l5/dns.rb +110 -0
  62. data/lib/racket/l5/hsrp.rb +73 -0
  63. data/lib/racket/l5/misc.rb +35 -0
  64. data/lib/racket/l5/nat-pmp.rb +41 -0
  65. data/lib/racket/l5/ntp.rb +59 -0
  66. data/lib/racket/l5.rb +30 -0
  67. data/lib/racket/misc/lv.rb +108 -0
  68. data/lib/racket/misc/misc.rb +62 -0
  69. data/lib/racket/misc/orderedhash.rb +63 -0
  70. data/lib/racket/misc/raw.rb +35 -0
  71. data/lib/racket/misc/tlv.rb +103 -0
  72. data/lib/racket/misc/vt.rb +114 -0
  73. data/lib/racket/misc.rb +30 -0
  74. data/lib/racket/racket.rb +166 -0
  75. data/lib/racket/racketpart.rb +66 -0
  76. data/lib/racket.rb +4 -0
  77. data/test/l2/ts_ethernet.rb +22 -0
  78. data/test/l2/ts_misc.rb +23 -0
  79. data/test/l2/ts_vlan.rb +15 -0
  80. data/test/l3/ts_ipv4.rb +44 -0
  81. data/test/l3/ts_ipv6.rb +26 -0
  82. data/test/l3/ts_misc.rb +31 -0
  83. data/test/l4/ts_icmp.rb +38 -0
  84. data/test/l4/ts_tcp.rb +55 -0
  85. data/test/l4/ts_udp.rb +40 -0
  86. data/test/misc/ts_lv.rb +59 -0
  87. data/test/misc/ts_orderedhash.rb +33 -0
  88. data/test/misc/ts_tlv.rb +47 -0
  89. data/test/misc/ts_vt.rb +56 -0
  90. data/test/ts_all.rb +14 -0
  91. metadata +153 -0
@@ -0,0 +1,50 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # $Id$
4
+ #
5
+ # Given a source and destination IP address
6
+ # and a data size, spew all 65536 possible ICMPv6
7
+
8
+ require 'rubygems'
9
+ require 'racket'
10
+
11
+ include Racket
12
+ if (ARGV.size != 4)
13
+ puts "Usage #{$0} <interface> <src_ip> <dst_ip> <icmp data size>"
14
+ exit!
15
+ end
16
+
17
+
18
+ def tick
19
+ @it += 1
20
+ @it = 0 if @it >= @ticks.size
21
+ print "\r#{@ticks[@it]}"
22
+ STDOUT.flush
23
+ end
24
+
25
+ def rand_icmp6(n)
26
+ n.l4 = L4::ICMPv6.new(Misc.randstring(40))
27
+ n.l4.payload = Misc.randstring(ARGV[3].to_i)
28
+ n.l4.fix!(n.l3.src_ip, n.l3.dst_ip)
29
+ n.sendpacket
30
+ tick
31
+ end
32
+
33
+ @it = 0
34
+ @ticks = %w( / - \\ | )
35
+
36
+ n = Racket::Racket.new
37
+ n.iface = ARGV[0]
38
+ n.l2 = L2::Ethernet.new(Misc.randstring(14))
39
+ n.l2.ethertype = 0x86DD
40
+ n.l3 = L3::IPv6.new
41
+ n.l3.src_ip= L3::Misc.ipv62long(ARGV[1])
42
+ n.l3.dst_ip= L3::Misc.ipv62long(ARGV[2])
43
+ n.l3.nhead = 58
44
+
45
+ puts "Spewing..."
46
+ while (true)
47
+ rand_icmp6(n)
48
+ end
49
+
50
+ # vim: set ts=2 et sw=2:
data/examples/igmpv1 ADDED
@@ -0,0 +1,27 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # $Id$
4
+ #
5
+
6
+ require 'rubygems'
7
+ require 'racket'
8
+
9
+ include Racket
10
+ if (ARGV.size != 4)
11
+ puts "Usage #{$0} <src_ip> <dst_ip> <igmp code> <gaddr>"
12
+ exit!
13
+ end
14
+
15
+ n = Racket::Racket.new
16
+ n.l3 = L3::IPv4.new
17
+
18
+ n.l3.src_ip = ARGV[0]
19
+ n.l3.dst_ip = ARGV[1]
20
+ n.l3.protocol = 2
21
+
22
+ n.l4 = L4::IGMPv1.new
23
+ n.l4.type = ARGV[2].to_i
24
+ n.l4.gaddr = ARGV[3]
25
+
26
+ f = n.sendpacket
27
+ puts "Sent #{f} bytes"
data/examples/igmpv2 ADDED
@@ -0,0 +1,27 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # $Id$
4
+ #
5
+
6
+ require 'rubygems'
7
+ require 'racket'
8
+
9
+ include Racket
10
+ if (ARGV.size != 4)
11
+ puts "Usage #{$0} <src_ip> <dst_ip> <igmp code> <gaddr>"
12
+ exit!
13
+ end
14
+
15
+ n = Racket::Racket.new
16
+ n.l3 = L3::IPv4.new
17
+
18
+ n.l3.src_ip = ARGV[0]
19
+ n.l3.dst_ip = ARGV[1]
20
+ n.l3.protocol = 2
21
+
22
+ n.l4 = L4::IGMPv1.new
23
+ n.l4.type = ARGV[2].to_i
24
+ n.l4.gaddr = ARGV[3]
25
+
26
+ f = n.sendpacket
27
+ puts "Sent #{f} bytes"
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # $Id$
4
+ #
5
+ # Send IGRP packets. Needs work... obviously.
6
+ require 'rubygems'
7
+ require 'racket'
8
+
9
+ include Racket
10
+ n = Racket::Racket.new
11
+ n.iface = "eth0"
12
+
13
+ n.l2 = L2::Ethernet.new(Misc.randstring(14))
14
+ n.l2.ethertype = 0x800
15
+
16
+ n.l3 = L3::IPv4.new
17
+ n.l3.protocol = 9
18
+
19
+ n.l4 = L4::IGRP.new()
20
+ n.l4.version = 1
21
+ n.l4.opcode = 1
22
+ n.l4.add_system(0xFFFFFF, 1, 2, 3, 4, 5, 6)
23
+ n.l4.add_exterior(0x12345, 6, 7, 8, 9, 0xa, 0xb)
24
+ n.l4.add_interior(0x67890, 6, 7, 8, 9, 0xa, 0xb)
25
+ n.sendpacket
data/examples/ipv6 ADDED
@@ -0,0 +1,35 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # $Id$
4
+ #
5
+
6
+ require 'rubygems'
7
+ require 'racket'
8
+
9
+ include Racket
10
+ unless (ARGV.size == 2)
11
+ puts "Usage: #{$0} <srcip> <dstip>"
12
+ exit
13
+ end
14
+
15
+ n = Racket::Racket.new
16
+ n.iface = "eth0"
17
+
18
+ n.l2 = L2::Ethernet.new(Misc.randstring(14))
19
+ n.l2.ethertype = 0x86DD
20
+
21
+ n.l3 = L3::IPv6.new
22
+ n.l3.src_ip = L3::Misc.ipv62long(ARGV[0])
23
+ n.l3.dst_ip = L3::Misc.ipv62long(ARGV[1])
24
+ n.l3.nhead = 17
25
+
26
+ n.l4 = L4::UDP.new
27
+ n.l4.src_port = 12345
28
+ n.l4.dst_port = 123
29
+ n.l4.fix!(n.l3.src_ip, n.l3.dst_ip)
30
+
31
+ f = n.sendpacket
32
+ n.layers.compact.each do |l|
33
+ puts l.pretty
34
+ end
35
+ #puts "Sent #{f}"
data/examples/nat-pimp ADDED
@@ -0,0 +1,32 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ require 'rubygems'
4
+ require 'racket'
5
+
6
+ include Racket
7
+ if (ARGV.size != 5)
8
+ puts "Usage #{$0} <src_ip> <dst_ip> <op> <internal_port> <external_port>"
9
+ exit!
10
+ end
11
+
12
+ n = Racket::Racket.new
13
+ n.iface = "eth0"
14
+ n.l3 = L3::IPv4.new
15
+ n.l3.src_ip= ARGV[0]
16
+ n.l3.dst_ip = ARGV[1]
17
+ n.l3.version = 0x4
18
+ n.l3.hlen = 0x5
19
+ n.l3.protocol = 0x11
20
+ n.l3.flags = 0x0
21
+ n.l3.foffset = 0x0
22
+ n.l4 = L4::UDP.new
23
+ n.l4.src_port = 5350
24
+ n.l4.dst_port = 5351
25
+ n.l5 = L5::NATPMPMappingRequest.new(:opcode => ARGV[2].to_i, :internal_port => ARGV[3].to_i, :external_port => ARGV[4].to_i)
26
+ n.l5.opcode = ARGV[2].to_i
27
+ n.l5.lifetime = 999999
28
+ n.l4.payload = n.l5
29
+ n.l4.fix!(n.l3.src_ip, n.l3.dst_ip)
30
+ n.l4.payload = ""
31
+ n.sendpacket
32
+ # vim: set ts=2 et sw=2:
data/examples/ntp ADDED
@@ -0,0 +1,38 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # $Id$
4
+ #
5
+ # Send lolcat NTP packets
6
+
7
+ require 'rubygems'
8
+ require 'racket'
9
+
10
+ include Racket
11
+ unless (ARGV.size == 2)
12
+ puts "Usage: #{$0} <srcip> <dstip>"
13
+ exit
14
+ end
15
+
16
+ n = Racket::Racket.new
17
+ n.iface = "eth0"
18
+
19
+ n.l3 = L3::IPv4.new
20
+ n.l3.src_ip = ARGV[0]
21
+ n.l3.dst_ip = ARGV[1]
22
+ n.l3.protocol = 0x11
23
+
24
+ n.l4 = L4::UDP.new
25
+ n.l4.src_port = 12345
26
+ n.l4.dst_port = 123
27
+
28
+ n.l5 = L5::NTP.new("I'm in your ntp, stealin ur time")
29
+
30
+ n.l4.payload = n.l5
31
+ n.l4.fix!(n.l3.src_ip, n.l3.dst_ip)
32
+ n.l4.payload = ""
33
+
34
+ f = n.sendpacket
35
+ n.layers.compact.each do |l|
36
+ puts l.pretty
37
+ end
38
+ puts "Sent #{f}"
data/examples/ntp2 ADDED
@@ -0,0 +1,42 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # $Id$
4
+ #
5
+ # Send lolcat NTP packets
6
+
7
+ require 'rubygems'
8
+ require 'racket'
9
+
10
+ include Racket
11
+ unless (ARGV.size == 2)
12
+ puts "Usage: #{$0} <srcip> <dstip>"
13
+ exit
14
+ end
15
+
16
+ n = Racket::Racket.new
17
+ n.iface = "eth0"
18
+
19
+ n.l3 = L3::IPv4.new
20
+ n.l3.src_ip = ARGV[0]
21
+ n.l3.dst_ip = ARGV[1]
22
+ n.l3.protocol = 0x11
23
+ n.l3.add_option(4, "wt")
24
+ n.l3.add_option(136, "aa")
25
+ n.l3.add_option(130, "123456789")
26
+ n.l3.add_option(148, "yz")
27
+
28
+ n.l4 = L4::UDP.new
29
+ n.l4.src_port = 12345
30
+ n.l4.dst_port = 123
31
+
32
+ n.l5 = L5::NTP.new("I'm in your ntp, stealin ur time")
33
+
34
+ n.l4.payload = n.l5
35
+ n.l4.fix!(n.l3.src_ip, n.l3.dst_ip)
36
+ n.l4.payload = ""
37
+
38
+ f = n.sendpacket
39
+ n.layers.compact.each do |l|
40
+ puts l.pretty
41
+ end
42
+ puts "Sent #{f}"
data/examples/sctp ADDED
@@ -0,0 +1,32 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # $Id$
4
+ #
5
+
6
+ require 'rubygems'
7
+ require 'racket'
8
+
9
+ include Racket
10
+ unless (ARGV.size == 4)
11
+ puts "Usage: #{$0} <srcip> <srcport> <dstip> <dstport>"
12
+ exit
13
+ end
14
+
15
+ n = Racket::Racket.new
16
+ n.iface = "eth0"
17
+
18
+ n.l3 = L3::IPv4.new
19
+ n.l3.src_ip = ARGV[0]
20
+ n.l3.dst_ip = ARGV[2]
21
+ n.l3.protocol = 132
22
+
23
+ n.l4 = L4::SCTP.new
24
+ n.l4.src_port = ARGV[1].to_i
25
+ n.l4.dst_port = ARGV[3].to_i
26
+ #n.l4.add_chunk(1, 2, 8, "blah")
27
+
28
+ f = n.sendpacket
29
+ n.layers.compact.each do |l|
30
+ puts l.pretty
31
+ end
32
+ puts "Sent #{f}"
data/examples/stp-send ADDED
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # $Id$
4
+ #
5
+
6
+ require 'rubygems'
7
+ require 'racket'
8
+
9
+ include Racket
10
+ n = Racket::Racket.new
11
+ n.iface = "eth0"
12
+
13
+ n.layers[2] = L2::EightOTwoDotThree.new
14
+ n.layers[3] = L2::LLC.new()
15
+ n.layers[4] = L2::SNAP.new()
16
+ n.layers[4].pid = 0x010b
17
+
18
+ n.layers[5] = L3::STP.new()
19
+ n.layers[5].version = 2
20
+
21
+ n.sendpacket
data/examples/synflood ADDED
@@ -0,0 +1,147 @@
1
+ #!/usr/bin/ruby
2
+ # $Id$
3
+ # Simple SYN flooder with randomness built in, using Racket
4
+ # Use at your own risk
5
+ #
6
+ # Jon Hart <jhart@spoofed.org>
7
+
8
+ require 'rubygems'
9
+ require 'racket'
10
+ require 'monitor'
11
+ require 'optparse'
12
+ require 'ostruct'
13
+
14
+ include Racket
15
+
16
+ class Options
17
+ def self.parse(name, args)
18
+ options = OpenStruct.new
19
+ options.verbose = false
20
+ options.srcport = nil
21
+ options.dstport = nil
22
+ options.srcip = nil
23
+ options.dstip = nil
24
+ options.packets = nil
25
+ options.threads = 1
26
+
27
+ opts = OptionParser.new do |opts|
28
+ opts.banner = "#{File.basename(name)}"
29
+ opts.banner += "Usage: #{name} [options]"
30
+
31
+ opts.on("--srcip SOURCEIP", "Source IP address (default: random)") do |o|
32
+ options.srcip = o
33
+ end
34
+
35
+ opts.on("--dstip DESTIP", "Destination IP address (required)") do |o|
36
+ options.dstip = o
37
+ end
38
+
39
+ opts.on("--srcport SRCPORT", "Source port (default: random)") do |o|
40
+ options.srcport = o.to_i
41
+ end
42
+
43
+ opts.on("--dstport DSTPORT", "Destination port (default: random)") do |o|
44
+ options.dstport = o.to_i
45
+ end
46
+
47
+ opts.on("--threads NUMTHREADS", "Number of writing threads (default: 1)") do |o|
48
+ options.threads = o.to_i
49
+ end
50
+
51
+ opts.on("--packets NUMPACKETS", "Number of packets to send (default: infinite)") do |o|
52
+ options.packets = o.to_i
53
+ end
54
+ opts.on_tail("-h", "--help", "Show this help message.") { puts opts; exit }
55
+ end
56
+
57
+
58
+ begin
59
+ opts.parse!(args)
60
+ rescue OptionParser::ParseError => e
61
+ puts "#{e}\n\n#{opts}"
62
+ exit(1)
63
+ end
64
+ options.help = opts
65
+ options
66
+ end
67
+ end
68
+
69
+ @options = Options.parse($0, ARGV)
70
+
71
+ if (@options.dstip.nil?)
72
+ puts "Destination IP required"
73
+ puts @options.help
74
+ exit(1)
75
+ end
76
+
77
+
78
+ @p = Racket::Racket.new
79
+ @p.iface = "eth0"
80
+
81
+ @p.l3 = L3::IPv4.new
82
+ @p.l3.src_ip = @options.srcip.nil? ? "0.0.0.0" : @options.srcip
83
+ @p.l3.dst_ip = @options.dstip.nil? ? "0.0.0.0" : @options.dstip
84
+ @p.l3.protocol = 6
85
+
86
+ @p.l4 = L4::TCP.new
87
+ @p.l4.dst_port = @options.dstport.nil? ? 0 : @options.dstport
88
+ @p.l4.src_port = @options.srcport.nil? ? 0 : @options.srcport
89
+ @p.l4.flag_syn = 1
90
+
91
+ t1 = Time.new
92
+ i = 0
93
+
94
+ class Flood < Monitor
95
+ attr_reader :count
96
+ def initialize
97
+ @count = 0
98
+ super
99
+ end
100
+
101
+ def flood(packet, options)
102
+ @packet = packet
103
+ @options = options
104
+ begin
105
+ if ( (! @options.packets.nil?) && @options.packets < @count)
106
+ break
107
+ end
108
+
109
+ if (@options.srcip.nil?)
110
+ @packet.l3.src_ip = L3::Misc.long2ipv4(rand(2**32))
111
+ end
112
+
113
+ if (@options.srcport.nil?)
114
+ @packet.l4.src_port = 1024 + rand(65535-1024)
115
+ end
116
+
117
+ if (@options.dstport.nil?)
118
+ @packet.l4.dst_port = 1024 + rand(65535-1024)
119
+ end
120
+
121
+ @packet.l4.fix!(@packet.l3.src_ip, @packet.l3.dst_ip, "")
122
+
123
+ synchronize do
124
+ @count += 1
125
+ @packet.sendpacket
126
+ end
127
+ end while (true)
128
+ end
129
+ end
130
+
131
+
132
+ t1 = Time.new
133
+ f = Flood.new
134
+ threads = []
135
+ (1.upto(@options.threads)).each do |t|
136
+ threads << Thread.new { f.flood(@p, @options) }
137
+ end
138
+
139
+ threads.each do |t|
140
+ t.join
141
+ end
142
+ t2 = Time.new
143
+
144
+ time = t2 - t1
145
+
146
+ puts "Sent #{f.count} packets in #{time} seconds (#{"%.0f" % (f.count/time).to_f} pps)"
147
+
data/examples/tcp ADDED
@@ -0,0 +1,43 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # $Id$
4
+ #
5
+ # Send a DNS request
6
+
7
+ require 'rubygems'
8
+ require 'racket'
9
+
10
+ include Racket
11
+ unless (ARGV.size == 3)
12
+ puts "Usage: #{$0} <srcip> <dstip> <domain>"
13
+ exit
14
+ end
15
+
16
+ n = Racket::Racket.new
17
+ n.iface = "eth0"
18
+
19
+ n.l3 = Racket::L3::IPv4.new
20
+ n.l3.src_ip = ARGV[0]
21
+ n.l3.dst_ip = ARGV[1]
22
+ n.l3.protocol = 0x6
23
+
24
+ n.l4 = Racket::L4::TCP.new
25
+ n.l4.src_port = 48484
26
+ n.l4.seq = 0xabcdef
27
+ n.l4.ack = 0xfedcba
28
+ n.l4.flag_ack = 1
29
+ n.l4.flag_psh = 1
30
+ n.l4.dst_port = 53
31
+ n.l4.window = 4445
32
+
33
+ n.l5 = Racket::L5::DNS.new
34
+ n.l5.tx_id = 1234
35
+ #n.l5.add_question(ARGV[2], 1, 1)
36
+ n.l4.add_option(2, "\xff\xee")
37
+ n.l4.fix!(n.l3.src_ip, n.l3.dst_ip, n.l5)
38
+
39
+ f = n.sendpacket
40
+ n.layers.compact.each do |l|
41
+ puts l.pretty
42
+ end
43
+ puts "Sent #{f}"
data/examples/tcp2udp ADDED
@@ -0,0 +1,65 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # $Id$
4
+ #
5
+ #
6
+ # Spew TCP packets back at the source but in UDP form. Gross.
7
+ # Pointless.
8
+
9
+
10
+ require 'rubygems'
11
+ require 'pcaprub'
12
+ require 'racket'
13
+
14
+ include Racket
15
+
16
+
17
+ if (ARGV.size < 1)
18
+ puts "Usage: #{$0} <iface> [filter]"
19
+ exit
20
+ end
21
+
22
+ begin
23
+ p = Pcap::open_live(ARGV[0], 1500, true, 1000)
24
+ unless (ARGV[1].nil?)
25
+ p.setfilter(ARGV[1])
26
+ end
27
+ rescue Exception => e
28
+ puts "Pcap: Cannot open device #{ARGV[0]}: #{e}"
29
+ exit
30
+ end
31
+
32
+ p.each do |pkt|
33
+ if (p.datalink == Pcap::DLT_EN10MB)
34
+ eth = L2::Ethernet.new(pkt)
35
+ case eth.ethertype
36
+ when 0x0800:
37
+ orig_ipv4 = L3::IPv4.new(eth.payload)
38
+ if (orig_ipv4.protocol == 6)
39
+ n = Racket::Racket.new
40
+ orig_tcp = L4::TCP.new(orig_ipv4.payload)
41
+
42
+ if (!orig_tcp.payload.nil?)
43
+ n.l3 = L3::IPv4.new
44
+ n.l4 = L4::UDP.new
45
+ n.l4.src_port = orig_tcp.dst_port
46
+ n.l4.dst_port = orig_tcp.src_port
47
+ n.l3.src_ip = orig_ipv4.dst_ip
48
+ n.l3.dst_ip = orig_ipv4.src_ip
49
+ n.l3.protocol = 17
50
+
51
+ n.l4.payload = orig_tcp.payload
52
+ n.l4.fix!(n.l3.src_ip, n.l3.dst_ip)
53
+
54
+ f = n.sendpacket
55
+ puts "Sent #{f}"
56
+ n.layers.compact.each do |l|
57
+ puts l.pretty
58
+ end
59
+ exit
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
65
+ # vim: set ts=2 et sw=2:
data/examples/udp ADDED
@@ -0,0 +1,46 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # $Id$
4
+ #
5
+ # Send random garbage to a UDP port
6
+
7
+ require 'rubygems'
8
+ require 'racket'
9
+
10
+ include Racket
11
+ unless (ARGV.size == 4)
12
+ puts "Usage: #{$0} <srcip> <dstip> <dst_port> <size>"
13
+ exit
14
+ end
15
+
16
+ # create a new Racket object and pick an interface
17
+ n = Racket::Racket.new
18
+ n.iface = "eth0"
19
+
20
+ # skip right to layer3, layer2 will be done automatically
21
+ # build a new IPv4 layer, and assign src and dst ip from the command line
22
+ n.l3 = L3::IPv4.new
23
+ n.l3.src_ip = ARGV[0]
24
+ n.l3.dst_ip = ARGV[1]
25
+ n.l3.protocol = 0x11
26
+
27
+ # tack on UDP
28
+ n.l4 = L4::UDP.new
29
+ # randomize source port
30
+ n.l4.src_port = 1024 + rand(65535-1024)
31
+ # take destination port from the commandline
32
+ n.l4.dst_port = ARGV[2].to_i
33
+ # build a random amount of garbage for the payload
34
+ n.l4.payload = Misc.randstring(ARGV[3].to_i)
35
+
36
+ # fix 'er up (checksum, length) prior to sending
37
+ n.l4.fix!(n.l3.src_ip, n.l3.dst_ip)
38
+
39
+ # off you go
40
+ f = n.sendpacket
41
+
42
+ # print out what we built
43
+ n.layers.compact.each do |l|
44
+ puts l.pretty
45
+ end
46
+ puts "Sent #{f}"
data/examples/vrrp ADDED
@@ -0,0 +1,34 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # $Id$
4
+ #
5
+
6
+ require 'rubygems'
7
+ require 'racket'
8
+
9
+ include Racket
10
+ unless (ARGV.size == 3)
11
+ puts "Usage: #{$0} <srcip> <dstip> <type>"
12
+ exit
13
+ end
14
+
15
+ n = Racket::Racket.new
16
+ n.iface = "eth0"
17
+
18
+ n.l3 = L3::IPv4.new
19
+ n.l3.src_ip = ARGV[0]
20
+ n.l3.dst_ip = ARGV[1]
21
+ n.l3.protocol = 112
22
+
23
+ n.l4 = L4::VRRP.new
24
+ n.l4.type = ARGV[2].to_i
25
+ n.l4.auth_type = 1
26
+ n.l4.add_ip("1.2.3.4")
27
+ n.l4.add_auth("haha")
28
+ #n.l4.payload = [ L3::Misc.ipv42long("1.2.3.4") ].pack("N")
29
+
30
+ f = n.sendpacket
31
+ n.layers.compact.each do |l|
32
+ puts l.pretty
33
+ end
34
+ puts "Sent #{f}"
data/examples/vtp ADDED
@@ -0,0 +1,28 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # $Id$
4
+ #
5
+ # Send amusing CDP packets
6
+ require 'rubygems'
7
+ require '../lib/racket'
8
+
9
+ include Racket
10
+ n = Racket::Racket.new
11
+ n.iface = "eth0"
12
+
13
+ n.layers[2] = L2::EightOTwoDotThree.new(Misc.randstring(14))
14
+ n.layers[2].dst_mac = "01:00:0c:cc:cc:cc"
15
+ n.layers[3] = L2::LLC.new()
16
+ n.layers[4] = L2::SNAP.new()
17
+ n.layers[4].pid = 0x2003
18
+
19
+ n.layers[5] = L2::VTPSubsetAdvertisement.new
20
+ n.layers[5].version = 1
21
+ n.layers[5].revision = 12345
22
+ n.layers[5].add_vlan_info(0xFF, 3, 5, 6, 7, "blafadfadsfasdf")
23
+
24
+ n.layers.compact.each do |l|
25
+ puts l.pretty
26
+ end
27
+
28
+ n.sendpacket