packetfu 1.1.8 → 1.1.9
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.
- data/README.rdoc +11 -12
- data/bench/octets.rb +9 -9
- data/examples/100kpackets.rb +13 -12
- data/examples/ackscan.rb +17 -16
- data/examples/arp.rb +36 -35
- data/examples/arphood.rb +37 -36
- data/examples/dissect_thinger.rb +7 -6
- data/examples/ethernet.rb +1 -0
- data/examples/examples.rb +1 -0
- data/examples/ifconfig.rb +1 -0
- data/examples/new-simple-stats.rb +24 -23
- data/examples/packetfu-shell.rb +26 -25
- data/examples/simple-sniffer.rb +10 -9
- data/examples/simple-stats.rb +24 -23
- data/examples/slammer.rb +4 -3
- data/lib/packetfu.rb +128 -127
- data/lib/packetfu/capture.rb +170 -169
- data/lib/packetfu/config.rb +53 -52
- data/lib/packetfu/inject.rb +57 -56
- data/lib/packetfu/packet.rb +529 -528
- data/lib/packetfu/pcap.rb +580 -579
- data/lib/packetfu/protos/arp.rb +91 -90
- data/lib/packetfu/protos/arp/header.rb +159 -158
- data/lib/packetfu/protos/arp/mixin.rb +37 -36
- data/lib/packetfu/protos/eth.rb +45 -44
- data/lib/packetfu/protos/eth/header.rb +244 -243
- data/lib/packetfu/protos/eth/mixin.rb +4 -3
- data/lib/packetfu/protos/hsrp.rb +70 -69
- data/lib/packetfu/protos/hsrp/header.rb +108 -107
- data/lib/packetfu/protos/hsrp/mixin.rb +30 -29
- data/lib/packetfu/protos/icmp.rb +72 -71
- data/lib/packetfu/protos/icmp/header.rb +83 -82
- data/lib/packetfu/protos/icmp/mixin.rb +15 -14
- data/lib/packetfu/protos/invalid.rb +50 -49
- data/lib/packetfu/protos/ip.rb +70 -69
- data/lib/packetfu/protos/ip/header.rb +292 -291
- data/lib/packetfu/protos/ip/mixin.rb +41 -40
- data/lib/packetfu/protos/ipv6.rb +51 -50
- data/lib/packetfu/protos/ipv6/header.rb +189 -188
- data/lib/packetfu/protos/ipv6/mixin.rb +30 -29
- data/lib/packetfu/protos/lldp.rb +3 -1
- data/lib/packetfu/protos/lldp/header.rb +1 -0
- data/lib/packetfu/protos/lldp/mixin.rb +1 -0
- data/lib/packetfu/protos/tcp.rb +177 -176
- data/lib/packetfu/protos/tcp/ecn.rb +36 -35
- data/lib/packetfu/protos/tcp/flags.rb +75 -74
- data/lib/packetfu/protos/tcp/header.rb +269 -268
- data/lib/packetfu/protos/tcp/hlen.rb +33 -32
- data/lib/packetfu/protos/tcp/mixin.rb +47 -46
- data/lib/packetfu/protos/tcp/option.rb +322 -321
- data/lib/packetfu/protos/tcp/options.rb +96 -95
- data/lib/packetfu/protos/tcp/reserved.rb +36 -35
- data/lib/packetfu/protos/udp.rb +117 -116
- data/lib/packetfu/protos/udp/header.rb +92 -91
- data/lib/packetfu/protos/udp/mixin.rb +4 -3
- data/lib/packetfu/structfu.rb +281 -280
- data/lib/packetfu/utils.rb +211 -208
- data/lib/packetfu/version.rb +42 -41
- data/packetfu.gemspec +1 -1
- data/spec/ethpacket_spec.rb +48 -48
- data/spec/packet_spec.rb +57 -57
- data/spec/packet_subclasses_spec.rb +8 -8
- data/spec/packetfu_spec.rb +59 -59
- data/spec/structfu_spec.rb +268 -268
- data/spec/tcp_spec.rb +75 -75
- data/test/all_tests.rb +13 -13
- data/test/func_lldp.rb +3 -3
- data/test/ptest.rb +2 -2
- data/test/test_arp.rb +116 -116
- data/test/test_capture.rb +45 -45
- data/test/test_eth.rb +68 -68
- data/test/test_hsrp.rb +9 -9
- data/test/test_icmp.rb +52 -52
- data/test/test_inject.rb +18 -18
- data/test/test_invalid.rb +16 -16
- data/test/test_ip.rb +36 -36
- data/test/test_ip6.rb +48 -48
- data/test/test_octets.rb +21 -21
- data/test/test_packet.rb +154 -154
- data/test/test_pcap.rb +170 -170
- data/test/test_structfu.rb +97 -97
- data/test/test_tcp.rb +320 -320
- data/test/test_udp.rb +76 -76
- metadata +2 -2
@@ -1,7 +1,8 @@
|
|
1
|
+
# -*- coding: binary -*-
|
1
2
|
module PacketFu
|
2
|
-
|
3
|
-
|
4
|
-
|
3
|
+
# This Mixin simplifies access to the EthHeaders. Mix this in with your
|
4
|
+
# packet interface, and it will add methods that essentially delegate to
|
5
|
+
# the 'eth_header' method (assuming that it is a EthHeader object)
|
5
6
|
module EthHeaderMixin
|
6
7
|
def eth_daddr; self.eth_header.eth_daddr ; end
|
7
8
|
def eth_daddr=(v); self.eth_header.eth_daddr= v; end
|
data/lib/packetfu/protos/hsrp.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# -*- coding: binary -*-
|
1
2
|
require 'packetfu/protos/eth/header'
|
2
3
|
require 'packetfu/protos/eth/mixin'
|
3
4
|
|
@@ -11,85 +12,85 @@ require 'packetfu/protos/hsrp/header'
|
|
11
12
|
require 'packetfu/protos/hsrp/mixin'
|
12
13
|
|
13
14
|
module PacketFu
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
15
|
+
# HSRPPacket is used to construct HSRP Packets. They contain an EthHeader, an IPHeader, and a UDPHeader.
|
16
|
+
#
|
17
|
+
# == Example
|
18
|
+
#
|
19
|
+
# hsrp_pkt.new
|
20
|
+
# hsrp_pkt.hsrp_opcode = 0
|
21
|
+
# hsrp_pkt.hsrp_state = 16
|
22
|
+
# hsrp_pkt.hsrp_priority = 254
|
23
|
+
# hsrp_pkt.hsrp_group = 1
|
24
|
+
# hsrp_pkt.hsrp_vip = 10.100.100.254
|
25
|
+
# hsrp_pkt.recalc
|
26
|
+
# hsrp_pkt.to_f('/tmp/hsrp.pcap')
|
27
|
+
#
|
28
|
+
# == Parameters
|
29
|
+
#
|
30
|
+
# :eth
|
31
|
+
# A pre-generated EthHeader object.
|
32
|
+
# :ip
|
33
|
+
# A pre-generated IPHeader object.
|
34
|
+
# :udp
|
35
|
+
# A pre-generated UDPHeader object.
|
36
|
+
# :flavor
|
37
|
+
# TODO: HSRP packets don't tend have any flavor.
|
38
|
+
# :config
|
39
|
+
# A hash of return address details, often the output of Utils.whoami?
|
40
|
+
class HSRPPacket < Packet
|
40
41
|
include ::PacketFu::EthHeaderMixin
|
41
42
|
include ::PacketFu::IPHeaderMixin
|
42
43
|
include ::PacketFu::UDPHeaderMixin
|
43
44
|
include ::PacketFu::HSRPHeaderMixin
|
44
45
|
|
45
|
-
|
46
|
+
attr_accessor :eth_header, :ip_header, :udp_header, :hsrp_header
|
46
47
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
48
|
+
def self.can_parse?(str)
|
49
|
+
return false unless str.size >= 54
|
50
|
+
return false unless EthPacket.can_parse? str
|
51
|
+
return false unless IPPacket.can_parse? str
|
52
|
+
return false unless UDPPacket.can_parse? str
|
53
|
+
temp_packet = UDPPacket.new
|
54
|
+
temp_packet.read(str)
|
55
|
+
if temp_packet.ip_ttl == 1 and [temp_packet.udp_sport,temp_packet.udp_dport] == [1985,1985]
|
56
|
+
return true
|
57
|
+
else
|
58
|
+
return false
|
59
|
+
end
|
60
|
+
end
|
60
61
|
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
62
|
+
def read(str=nil, args={})
|
63
|
+
raise "Cannot parse `#{str}'" unless self.class.can_parse?(str)
|
64
|
+
@eth_header.read(str)
|
65
|
+
super(args)
|
66
|
+
self
|
67
|
+
end
|
67
68
|
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
69
|
+
def initialize(args={})
|
70
|
+
@eth_header = EthHeader.new(args).read(args[:eth])
|
71
|
+
@ip_header = IPHeader.new(args).read(args[:ip])
|
72
|
+
@ip_header.ip_proto = 0x11
|
73
|
+
@udp_header = UDPHeader.new(args).read(args[:udp])
|
74
|
+
@hsrp_header = HSRPHeader.new(args).read(args[:hsrp])
|
75
|
+
@udp_header.body = @hsrp_header
|
76
|
+
@ip_header.body = @udp_header
|
77
|
+
@eth_header.body = @ip_header
|
78
|
+
@headers = [@eth_header, @ip_header, @udp_header, @hsrp_header]
|
79
|
+
super
|
80
|
+
end
|
80
81
|
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
82
|
+
# Peek provides summary data on packet contents.
|
83
|
+
def peek_format
|
84
|
+
peek_data = ["UH "]
|
85
|
+
peek_data << "%-5d" % self.to_s.size
|
86
|
+
peek_data << "%-16s" % self.hsrp_addr
|
87
|
+
peek_data << "%-4d" % self.hsrp_group
|
88
|
+
peek_data << "%-35s" % self.hsrp_password_readable
|
89
|
+
peek_data << "%-15s" % self.ip_saddr
|
90
|
+
peek_data.join
|
91
|
+
end
|
91
92
|
|
92
|
-
|
93
|
+
end
|
93
94
|
|
94
95
|
end
|
95
96
|
|
@@ -1,120 +1,121 @@
|
|
1
|
+
# -*- coding: binary -*-
|
1
2
|
module PacketFu
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
3
|
+
# HSRPHeader is a complete HSRP struct, used in HSRPPacket. HSRP is typically used for
|
4
|
+
# fault-tolerant default gateway in IP routing environment.
|
5
|
+
#
|
6
|
+
# For more on HSRP packets, see http://www.networksorcery.com/enp/protocol/hsrp.htm
|
7
|
+
#
|
8
|
+
# Submitted by fropert@packetfault.org. Thanks, Francois!
|
9
|
+
#
|
10
|
+
# ==== Header Definition
|
11
|
+
#
|
12
|
+
# Int8 :hsrp_version Default: 0 # Version
|
13
|
+
# Int8 :hsrp_opcode # Opcode
|
14
|
+
# Int8 :hsrp_state # State
|
15
|
+
# Int8 :hsrp_hellotime Default: 3 # Hello Time
|
16
|
+
# Int8 :hsrp_holdtime Default: 10 # Hold Time
|
17
|
+
# Int8 :hsrp_priority # Priority
|
18
|
+
# Int8 :hsrp_group # Group
|
19
|
+
# Int8 :hsrp_reserved Default: 0 # Reserved
|
20
|
+
# String :hsrp_password # Authentication Data
|
21
|
+
# Octets :hsrp_vip # Virtual IP Address
|
22
|
+
# String :body
|
23
|
+
class HSRPHeader < Struct.new(:hsrp_version, :hsrp_opcode, :hsrp_state,
|
24
|
+
:hsrp_hellotime, :hsrp_holdtime,
|
25
|
+
:hsrp_priority, :hsrp_group,
|
26
|
+
:hsrp_reserved, :hsrp_password,
|
27
|
+
:hsrp_vip, :body)
|
27
28
|
|
28
|
-
|
29
|
+
include StructFu
|
29
30
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
31
|
+
def initialize(args={})
|
32
|
+
super(
|
33
|
+
Int8.new(args[:hsrp_version] || 0),
|
34
|
+
Int8.new(args[:hsrp_opcode]),
|
35
|
+
Int8.new(args[:hsrp_state]),
|
36
|
+
Int8.new(args[:hsrp_hellotime] || 3),
|
37
|
+
Int8.new(args[:hsrp_holdtime] || 10),
|
38
|
+
Int8.new(args[:hsrp_priority]),
|
39
|
+
Int8.new(args[:hsrp_group]),
|
40
|
+
Int8.new(args[:hsrp_reserved] || 0),
|
41
|
+
StructFu::String.new.read(args[:hsrp_password] || "cisco\x00\x00\x00"),
|
42
|
+
Octets.new.read(args[:hsrp_vip] || ("\x00" * 4)),
|
43
|
+
StructFu::String.new.read(args[:body])
|
44
|
+
)
|
45
|
+
end
|
45
46
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
47
|
+
# Returns the object in string form.
|
48
|
+
def to_s
|
49
|
+
self.to_a.map {|x| x.to_s}.join
|
50
|
+
end
|
50
51
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
52
|
+
# Reads a string to populate the object.
|
53
|
+
def read(str)
|
54
|
+
force_binary(str)
|
55
|
+
return self if str.nil?
|
56
|
+
self[:hsrp_version].read(str[0,1])
|
57
|
+
self[:hsrp_opcode].read(str[1,1])
|
58
|
+
self[:hsrp_state].read(str[2,1])
|
59
|
+
self[:hsrp_hellotime].read(str[3,1])
|
60
|
+
self[:hsrp_holdtime].read(str[4,1])
|
61
|
+
self[:hsrp_priority].read(str[5,1])
|
62
|
+
self[:hsrp_group].read(str[6,1])
|
63
|
+
self[:hsrp_reserved].read(str[7,1])
|
64
|
+
self[:hsrp_password].read(str[8,8])
|
65
|
+
self[:hsrp_vip].read(str[16,4])
|
66
|
+
self[:body].read(str[20,str.size]) if str.size > 20
|
67
|
+
self
|
68
|
+
end
|
68
69
|
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
70
|
+
# Setter for the type.
|
71
|
+
def hsrp_version=(i); typecast i; end
|
72
|
+
# Getter for the type.
|
73
|
+
def hsrp_version; self[:hsrp_version].to_i; end
|
74
|
+
# Setter for the type.
|
75
|
+
def hsrp_opcode=(i); typecast i; end
|
76
|
+
# Getter for the type.
|
77
|
+
def hsrp_opcode; self[:hsrp_opcode].to_i; end
|
78
|
+
# Setter for the type.
|
79
|
+
def hsrp_state=(i); typecast i; end
|
80
|
+
# Getter for the type.
|
81
|
+
def hsrp_state; self[:hsrp_state].to_i; end
|
82
|
+
# Setter for the type.
|
83
|
+
def hsrp_hellotime=(i); typecast i; end
|
84
|
+
# Getter for the type.
|
85
|
+
def hsrp_hellotime; self[:hsrp_hellotime].to_i; end
|
86
|
+
# Setter for the type.
|
87
|
+
def hsrp_holdtime=(i); typecast i; end
|
88
|
+
# Getter for the type.
|
89
|
+
def hsrp_holdtime; self[:hsrp_holdtime].to_i; end
|
90
|
+
# Setter for the type.
|
91
|
+
def hsrp_priority=(i); typecast i; end
|
92
|
+
# Getter for the type.
|
93
|
+
def hsrp_priority; self[:hsrp_priority].to_i; end
|
94
|
+
# Setter for the type.
|
95
|
+
def hsrp_group=(i); typecast i; end
|
96
|
+
# Getter for the type.
|
97
|
+
def hsrp_group; self[:hsrp_group].to_i; end
|
98
|
+
# Setter for the type.
|
99
|
+
def hsrp_reserved=(i); typecast i; end
|
100
|
+
# Getter for the type.
|
101
|
+
def hsrp_reserved; self[:hsrp_reserved].to_i; end
|
101
102
|
|
102
|
-
|
103
|
-
|
104
|
-
|
103
|
+
def hsrp_addr=(addr)
|
104
|
+
self[:hsrp_vip].read_quad(addr)
|
105
|
+
end
|
105
106
|
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
107
|
+
# Returns a more readable IP source address.
|
108
|
+
def hsrp_addr
|
109
|
+
self[:hsrp_vip].to_x
|
110
|
+
end
|
110
111
|
|
111
|
-
|
112
|
+
# Readability aliases
|
112
113
|
|
113
|
-
|
114
|
+
alias :hsrp_vip_readable :hsrp_addr
|
114
115
|
|
115
|
-
|
116
|
-
|
117
|
-
|
116
|
+
def hsrp_password_readable
|
117
|
+
hsrp_password.to_s.inspect
|
118
|
+
end
|
118
119
|
|
119
|
-
|
120
|
+
end
|
120
121
|
end
|
@@ -1,31 +1,32 @@
|
|
1
|
+
# -*- coding: binary -*-
|
1
2
|
module PacketFu
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
3
|
+
# This Mixin simplifies access to the HSRPHeaders. Mix this in with your
|
4
|
+
# packet interface, and it will add methods that essentially delegate to
|
5
|
+
# the 'hsrp_header' method (assuming that it is a HSRPHeader object)
|
6
|
+
module HSRPHeaderMixin
|
7
|
+
def hsrp_version=(v); self.hsrp_header.hsrp_version= v; end
|
8
|
+
def hsrp_version; self.hsrp_header.hsrp_version; end
|
9
|
+
def hsrp_opcode=(v); self.hsrp_header.hsrp_opcode= v; end
|
10
|
+
def hsrp_opcode; self.hsrp_header.hsrp_opcode; end
|
11
|
+
def hsrp_state=(v); self.hsrp_header.hsrp_state= v; end
|
12
|
+
def hsrp_state; self.hsrp_header.hsrp_state; end
|
13
|
+
def hsrp_hellotime=(v); self.hsrp_header.hsrp_hellotime= v; end
|
14
|
+
def hsrp_hellotime; self.hsrp_header.hsrp_hellotime; end
|
15
|
+
def hsrp_holdtime=(v); self.hsrp_header.hsrp_holdtime= v; end
|
16
|
+
def hsrp_holdtime; self.hsrp_header.hsrp_holdtime; end
|
17
|
+
def hsrp_priority=(v); self.hsrp_header.hsrp_priority= v; end
|
18
|
+
def hsrp_priority; self.hsrp_header.hsrp_priority; end
|
19
|
+
def hsrp_group=(v); self.hsrp_header.hsrp_group= v; end
|
20
|
+
def hsrp_group; self.hsrp_header.hsrp_group; end
|
21
|
+
def hsrp_reserved=(v); self.hsrp_header.hsrp_reserved= v; end
|
22
|
+
def hsrp_reserved; self.hsrp_header.hsrp_reserved; end
|
23
|
+
def hsrp_addr=(v); self.hsrp_header.hsrp_addr= v; end
|
24
|
+
def hsrp_addr; self.hsrp_header.hsrp_addr; end
|
25
|
+
def hsrp_vip_readable; self.hsrp_header.hsrp_vip_readable; end
|
26
|
+
def hsrp_password_readable; self.hsrp_header.hsrp_password_readable; end
|
27
|
+
def hsrp_password; self.hsrp_header.hsrp_password; end
|
28
|
+
def hsrp_password=(v); self.hsrp_header.hsrp_password= v; end
|
29
|
+
def hsrp_vip; self.hsrp_header.hsrp_vip; end
|
30
|
+
def hsrp_vip=(v); self.hsrp_header.hsrp_vip= v; end
|
31
|
+
end
|
31
32
|
end
|