packetfu 1.1.13 → 2.0.0
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.
- checksums.yaml +5 -5
- checksums.yaml.gz.sig +0 -0
- data/.github/ISSUE_TEMPLATE.md +29 -0
- data/.github/workflows/verify.yml +72 -0
- data/.travis.yml +10 -6
- data/LICENSE.txt +1 -1
- data/README.md +8 -8
- data/certs/todb.pem +25 -0
- data/examples/100kpackets.rb +2 -2
- data/examples/ackscan.rb +7 -6
- data/examples/pcap2pcapng.rb +2 -2
- data/examples/readpcap.rb +28 -0
- data/lib/packetfu/capture.rb +1 -1
- data/lib/packetfu/config.rb +2 -2
- data/lib/packetfu/inject.rb +1 -1
- data/lib/packetfu/packet.rb +6 -3
- data/lib/packetfu/pcap.rb +25 -25
- data/lib/packetfu/pcapng/file.rb +1 -1
- data/lib/packetfu/protos/arp.rb +1 -8
- data/lib/packetfu/protos/eth.rb +0 -7
- data/lib/packetfu/protos/hsrp.rb +0 -7
- data/lib/packetfu/protos/icmp/header.rb +7 -10
- data/lib/packetfu/protos/icmp.rb +0 -7
- data/lib/packetfu/protos/icmpv6.rb +4 -17
- data/lib/packetfu/protos/ip/header.rb +2 -2
- data/lib/packetfu/protos/ip/mixin.rb +9 -0
- data/lib/packetfu/protos/ip.rb +0 -8
- data/lib/packetfu/protos/ipv6/mixin.rb +12 -0
- data/lib/packetfu/protos/ipv6.rb +0 -7
- data/lib/packetfu/protos/lldp.rb +1 -8
- data/lib/packetfu/protos/tcp.rb +73 -30
- data/lib/packetfu/protos/udp/header.rb +4 -5
- data/lib/packetfu/protos/udp.rb +6 -18
- data/lib/packetfu/structfu.rb +1 -1
- data/lib/packetfu/version.rb +1 -1
- data/packetfu.gemspec +10 -18
- data/spec/arp_spec.rb +1 -1
- data/spec/capture_spec.rb +137 -0
- data/spec/eth_spec.rb +1 -1
- data/spec/icmp_spec.rb +1 -1
- data/spec/icmpv6_spec.rb +1 -1
- data/spec/inject_spec.rb +95 -0
- data/spec/ip_spec.rb +23 -1
- data/spec/packetfu_spec.rb +1 -1
- data/spec/pcap_spec.rb +3 -3
- data/spec/pcapng/file_spec.rb +1 -1
- data/spec/spec_helper.rb +4 -2
- data/spec/structfu_spec.rb +86 -82
- data/spec/tcp_spec.rb +155 -53
- data/test/sample-ipv6.pcap +0 -0
- data.tar.gz.sig +0 -0
- metadata +64 -37
- metadata.gz.sig +0 -0
- data/test/test_capture.rb +0 -58
- data/test/test_inject.rb +0 -31
- data/test/test_structfu.rb +0 -114
data/spec/tcp_spec.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
require 'packetfu/protos/eth'
|
3
3
|
require 'packetfu/protos/ip'
|
4
|
+
require 'packetfu/protos/ipv6'
|
4
5
|
require 'packetfu/protos/tcp'
|
5
6
|
require 'packetfu/pcap'
|
6
7
|
|
@@ -29,75 +30,176 @@ end
|
|
29
30
|
|
30
31
|
describe TCPPacket do
|
31
32
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
context "TcpHlen reading and setting" do
|
38
|
-
context "TcpHlen set via #read" do
|
39
|
-
tcp_hlen_numeric(8)
|
33
|
+
context 'TCPHeader' do
|
34
|
+
subject do
|
35
|
+
bytes = PcapFile.file_to_array(File.join(File.dirname(__FILE__), "sample2.pcap"))[2]
|
36
|
+
packet = Packet.parse(bytes)
|
40
37
|
end
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
38
|
+
|
39
|
+
context "TcpHlen reading and setting" do
|
40
|
+
context "TcpHlen set via #read" do
|
41
|
+
tcp_hlen_numeric(8)
|
42
|
+
end
|
43
|
+
context "TcpHlen set via an Integer for the setter" do
|
44
|
+
(0..15).each do |i|
|
45
|
+
context "i is #{i}" do
|
46
|
+
before { subject.tcp_hlen = i }
|
47
|
+
tcp_hlen_numeric(i)
|
48
|
+
end
|
46
49
|
end
|
47
50
|
end
|
51
|
+
context "TcpHlen set via a String for the setter" do
|
52
|
+
before { subject.tcp_hlen = "\x60" }
|
53
|
+
tcp_hlen_numeric(6)
|
54
|
+
end
|
55
|
+
context "TcpHlen set via a TcpHlen for the setter" do
|
56
|
+
before { subject.tcp_hlen = TcpHlen.new(:hlen => 7) }
|
57
|
+
tcp_hlen_numeric(7)
|
58
|
+
end
|
48
59
|
end
|
49
|
-
context "TcpHlen set via a String for the setter" do
|
50
|
-
before { subject.tcp_hlen = "\x60" }
|
51
|
-
tcp_hlen_numeric(6)
|
52
|
-
end
|
53
|
-
context "TcpHlen set via a TcpHlen for the setter" do
|
54
|
-
before { subject.tcp_hlen = TcpHlen.new(:hlen => 7) }
|
55
|
-
tcp_hlen_numeric(7)
|
56
|
-
end
|
57
|
-
end
|
58
60
|
|
59
|
-
|
60
|
-
|
61
|
-
|
61
|
+
context "TcpReserved reading and setting" do
|
62
|
+
context "TcpReserved set via #read" do
|
63
|
+
tcp_reserved_numeric(0)
|
64
|
+
end
|
65
|
+
context "TcpReserved set via an Integer for the setter" do
|
66
|
+
(0..7).each do |i|
|
67
|
+
context "i is #{i}" do
|
68
|
+
before { subject.tcp_reserved = i }
|
69
|
+
tcp_reserved_numeric(i)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
context "TcpReserved set via a String for the setter" do
|
74
|
+
before { subject.tcp_reserved = "\x03" }
|
75
|
+
tcp_reserved_numeric(3)
|
76
|
+
end
|
77
|
+
context "TcpReserved set via a TcpReserved for the setter" do
|
78
|
+
before { subject.tcp_reserved = TcpReserved.new(:r1 => 1, :r2 => 0, :r3 => 1) }
|
79
|
+
tcp_reserved_numeric(5)
|
80
|
+
end
|
62
81
|
end
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
82
|
+
|
83
|
+
context "TcpEcn reading and setting" do
|
84
|
+
context "TcpEcn set via #read" do
|
85
|
+
tcp_ecn_numeric(0)
|
86
|
+
end
|
87
|
+
context "TcpEcn set via an Integer for the setter" do
|
88
|
+
(0..7).each do |i|
|
89
|
+
context "i is #{i}" do
|
90
|
+
before { subject.tcp_ecn = i }
|
91
|
+
tcp_ecn_numeric(i)
|
92
|
+
end
|
68
93
|
end
|
69
94
|
end
|
95
|
+
context "TcpEcn set via a String for the setter" do
|
96
|
+
before { subject.tcp_ecn = "\x00\xc0" }
|
97
|
+
tcp_ecn_numeric(3)
|
98
|
+
end
|
99
|
+
context "TcpEcn set via a TcpEcn for the setter" do
|
100
|
+
before { subject.tcp_ecn = TcpEcn.new(:n => 1, :c => 0, :e => 1) }
|
101
|
+
tcp_ecn_numeric(5)
|
102
|
+
end
|
70
103
|
end
|
71
|
-
|
72
|
-
|
73
|
-
|
104
|
+
end
|
105
|
+
|
106
|
+
context 'when read from a pcap file' do
|
107
|
+
context '(TCP over IPv4)' do
|
108
|
+
before(:all) do
|
109
|
+
@tcp4_packet = PcapFile.read_packets(File.join(__dir__, '..', 'test',
|
110
|
+
'sample2.pcap'))[5]
|
111
|
+
end
|
112
|
+
|
113
|
+
it 'should be recognize as a TCP packet' do
|
114
|
+
expect(@tcp4_packet).to be_a(TCPPacket)
|
115
|
+
expect(@tcp4_packet.is_tcp?).to be(true)
|
116
|
+
expect(@tcp4_packet.ipv6?).to be(false)
|
117
|
+
end
|
118
|
+
|
119
|
+
it 'should have the right port numbers' do
|
120
|
+
expect(@tcp4_packet.tcp_src).to eq(80)
|
121
|
+
expect(@tcp4_packet.tcp_dst).to eq(55954)
|
122
|
+
end
|
123
|
+
|
124
|
+
it 'should have the right length' do
|
125
|
+
expect(@tcp4_packet.tcp_hlen).to eq(8)
|
126
|
+
end
|
127
|
+
|
128
|
+
it 'should have the right checksum' do
|
129
|
+
expect(@tcp4_packet.tcp_sum).to eq(0x243a)
|
130
|
+
end
|
74
131
|
end
|
75
|
-
|
76
|
-
|
77
|
-
|
132
|
+
|
133
|
+
context '(TCP over IPv6)' do
|
134
|
+
before(:all) do
|
135
|
+
@tcp6_packet = PcapFile.read_packets(File.join(__dir__, '..', 'test',
|
136
|
+
'sample-ipv6.pcap')).last
|
137
|
+
end
|
138
|
+
|
139
|
+
it 'should be recognize as a TCP packet' do
|
140
|
+
expect(@tcp6_packet).to be_a(TCPPacket)
|
141
|
+
expect(@tcp6_packet.is_tcp?).to be(true)
|
142
|
+
expect(@tcp6_packet.ipv6?).to be(true)
|
143
|
+
end
|
144
|
+
|
145
|
+
it 'should have the right port numbers' do
|
146
|
+
expect(@tcp6_packet.tcp_src).to eq(39278)
|
147
|
+
expect(@tcp6_packet.tcp_dst).to eq(443)
|
148
|
+
end
|
149
|
+
|
150
|
+
it 'should have the right length' do
|
151
|
+
expect(@tcp6_packet.tcp_hlen).to eq(8)
|
152
|
+
end
|
153
|
+
|
154
|
+
it 'should have the right checksum' do
|
155
|
+
expect(@tcp6_packet.tcp_sum).to eq(0xd8c9)
|
156
|
+
end
|
78
157
|
end
|
79
158
|
end
|
80
159
|
|
81
|
-
context "
|
82
|
-
|
83
|
-
|
160
|
+
context "when initializing TCPPacket from scratch" do
|
161
|
+
it "should create TCP on IPv4 packets by default" do
|
162
|
+
tcp = TCPPacket.new
|
163
|
+
expect(tcp.ip_header).to be_a(IPHeader)
|
164
|
+
expect(tcp.ipv6_header).to be_nil
|
84
165
|
end
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
166
|
+
|
167
|
+
it "should create TCP on IPv6 packets" do
|
168
|
+
tcp = TCPPacket.new(:on_ipv6 => true)
|
169
|
+
expect(tcp.ip_header).to be_nil
|
170
|
+
expect(tcp.ipv6_header).to be_a(IPv6Header)
|
171
|
+
|
172
|
+
tcp.ipv6_saddr = "::1"
|
173
|
+
tcp.ipv6_daddr = "::2"
|
174
|
+
tcp.tcp_src = 41000
|
175
|
+
tcp.tcp_dst = 42000
|
176
|
+
tcp.tcp_seq = 1
|
177
|
+
tcp.payload = "\0" * 16
|
178
|
+
tcp.recalc
|
179
|
+
expect(tcp.tcp_sum).to eq(0x2b98)
|
180
|
+
expect(tcp.tcp_hlen).to eq(5)
|
92
181
|
end
|
93
|
-
|
94
|
-
|
95
|
-
|
182
|
+
|
183
|
+
it 'should support peek functionnality (IPv4 case)' do
|
184
|
+
tcp = TCPPacket.new
|
185
|
+
tcp.ip_saddr = '192.168.1.1'
|
186
|
+
tcp.ip_daddr = '192.168.1.254'
|
187
|
+
tcp.tcp_src = 32756
|
188
|
+
tcp.tcp_dst = 80
|
189
|
+
tcp.payload = 'abcdefghijklmnopqrstuvwxyz'
|
190
|
+
tcp.recalc
|
191
|
+
expect(tcp.peek).to match(/T 80\s+192.168.1.1:32756\s+->\s+192.168.1.254:80 \[\.{6,6}\] S:[a-f0-9]+|I:[a-f0-9]+/)
|
96
192
|
end
|
97
|
-
|
98
|
-
|
99
|
-
|
193
|
+
|
194
|
+
it 'should support peek functionnality (IPv6 case)' do
|
195
|
+
tcp = TCPPacket.new(:on_ipv6 => true)
|
196
|
+
tcp.ipv6_saddr = '2000::1'
|
197
|
+
tcp.ipv6_daddr = '2001::1'
|
198
|
+
tcp.tcp_src = 32756
|
199
|
+
tcp.tcp_dst = 80
|
200
|
+
tcp.payload = 'abcdefghijklmnopqrstuvwxyz'
|
201
|
+
tcp.recalc
|
202
|
+
expect(tcp.peek).to match(/6T 100\s+2000::1:32756\s+->\s+2001::1:80 \[\.{6,6}\] S:[a-f0-9]+/)
|
100
203
|
end
|
101
204
|
end
|
102
|
-
|
103
205
|
end
|
data/test/sample-ipv6.pcap
CHANGED
Binary file
|
data.tar.gz.sig
ADDED
Binary file
|
metadata
CHANGED
@@ -1,30 +1,56 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: packetfu
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tod Beardsley
|
8
8
|
- Jonathan Claudius
|
9
|
-
autorequire:
|
9
|
+
autorequire:
|
10
10
|
bindir: bin
|
11
|
-
cert_chain:
|
12
|
-
|
11
|
+
cert_chain:
|
12
|
+
- |
|
13
|
+
-----BEGIN CERTIFICATE-----
|
14
|
+
MIIENDCCApygAwIBAgIBATANBgkqhkiG9w0BAQsFADAiMSAwHgYDVQQDDBd0b2Ri
|
15
|
+
L0RDPXBhY2tldGZ1L0RDPWNvbTAeFw0yMzA2MjcwMDExMjdaFw0yNDA2MjYwMDEx
|
16
|
+
MjdaMCIxIDAeBgNVBAMMF3RvZGIvREM9cGFja2V0ZnUvREM9Y29tMIIBojANBgkq
|
17
|
+
hkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAyz2+nfp+Vv+JVHrJMy5Ck3qWBkiZmE0w
|
18
|
+
7bR1I/bNXrCtv75l1GxTdRAoxKcXpXyC8elJQ9PEjEEDtdGBYQ13BKcQbDJ36etD
|
19
|
+
wjbhRs5SBXgIilJAiR3i/cVnNoNJKOpiJZPufkOpag7Sg8Ze+cWbsc0gYN9nyCmz
|
20
|
+
LYwWDC6Ji0KgJFw5YxFvIxVeOx86Ccfd64Wsa3EhkZd6fOpDE3029GWDqZwZTBIX
|
21
|
+
RzJP4M7QZHZjq3gbHgSKFCFv0MqsjnQzUhPyB/U27c/n+wfRzZNx4Y1eRVm7gwPP
|
22
|
+
LJDzt6mvtlXqc6pQ1NsR9hv3sieFLZDDPU1AaWiOAckIKcVoXB8sGnuFMczMW97o
|
23
|
+
OZLfqfZUAN6LSY939T2sCyOcGhjxZIQbXtn/R/RAJ7UTfJld9UdthKm1W/f0cjwW
|
24
|
+
yqoVsFL+nda6xfta9EnRqqFLOJqyX/wwA2cPO9B8EyM8vFEE8AG8wLu1tF3ggoMg
|
25
|
+
rKut/WQADc3ymKAtsr9bOWajj7bIQVJnAgMBAAGjdTBzMAkGA1UdEwQCMAAwCwYD
|
26
|
+
VR0PBAQDAgSwMB0GA1UdDgQWBBR2kf7ATPt3O7Lpc0uyyCiow3P88DAcBgNVHREE
|
27
|
+
FTATgRF0b2RiQHBhY2tldGZ1LmNvbTAcBgNVHRIEFTATgRF0b2RiQHBhY2tldGZ1
|
28
|
+
LmNvbTANBgkqhkiG9w0BAQsFAAOCAYEAZMp8nY7WzGOPO6TrAlZg37D3s3Rcm0/z
|
29
|
+
6DBzFcY4F5CF3xq1Z/DZ3JwhjILaHPAZTvVT4uj91K4BYh/QgteS52C+O/9qsZ25
|
30
|
+
L3Ocu4Yp+aU40KpjW+IjlzgTS3E21pCBrBTgT7NuTHmTmoNmHfE6Gbbig3a68C9z
|
31
|
+
LcXj2RaEQuhOKrq5vw/0AV34wRieClM/oW8kWAKJDQ8/WEocHQpO1K/dhQ9hHNir
|
32
|
+
lMpjKXsWuxdAZPyvNj15w9fw5a4gZgW26P4VBNJUD/iCe7QYhwXrhdhxf+cygW2A
|
33
|
+
gBCt2UC6yISUDFiajyTw8cTJB1UyfLIADS4hiOEShx7hvVee444bgmOA99C+YuzT
|
34
|
+
FFUt9KVtWsXKD0R6GBvbAUW4/LjmXCCM+Z3uWo1Ph6zljlNHz6/tg+SB7DVgsI3i
|
35
|
+
XuSkzAmFsPisZ7uZk/7gJVlmyaqIxdrPVt9ZOTeSc/8pgSoRurHEJ7KlUXv4kcYM
|
36
|
+
F3a8dA5tl/TC0vkHlCtghhLuD46SlAmH
|
37
|
+
-----END CERTIFICATE-----
|
38
|
+
date: 2023-06-28 00:00:00.000000000 Z
|
13
39
|
dependencies:
|
14
40
|
- !ruby/object:Gem::Dependency
|
15
41
|
name: pcaprub
|
16
42
|
requirement: !ruby/object:Gem::Requirement
|
17
43
|
requirements:
|
18
|
-
- - "
|
44
|
+
- - "~>"
|
19
45
|
- !ruby/object:Gem::Version
|
20
|
-
version:
|
46
|
+
version: 0.13.1
|
21
47
|
type: :runtime
|
22
48
|
prerelease: false
|
23
49
|
version_requirements: !ruby/object:Gem::Requirement
|
24
50
|
requirements:
|
25
|
-
- - "
|
51
|
+
- - "~>"
|
26
52
|
- !ruby/object:Gem::Version
|
27
|
-
version:
|
53
|
+
version: 0.13.1
|
28
54
|
- !ruby/object:Gem::Dependency
|
29
55
|
name: rake
|
30
56
|
requirement: !ruby/object:Gem::Requirement
|
@@ -43,46 +69,46 @@ dependencies:
|
|
43
69
|
name: rspec
|
44
70
|
requirement: !ruby/object:Gem::Requirement
|
45
71
|
requirements:
|
46
|
-
- - "
|
72
|
+
- - "~>"
|
47
73
|
- !ruby/object:Gem::Version
|
48
|
-
version: '0'
|
74
|
+
version: '3.0'
|
49
75
|
type: :development
|
50
76
|
prerelease: false
|
51
77
|
version_requirements: !ruby/object:Gem::Requirement
|
52
78
|
requirements:
|
53
|
-
- - "
|
79
|
+
- - "~>"
|
54
80
|
- !ruby/object:Gem::Version
|
55
|
-
version: '0'
|
81
|
+
version: '3.0'
|
56
82
|
- !ruby/object:Gem::Dependency
|
57
83
|
name: rspec-its
|
58
84
|
requirement: !ruby/object:Gem::Requirement
|
59
85
|
requirements:
|
60
|
-
- - "
|
86
|
+
- - "~>"
|
61
87
|
- !ruby/object:Gem::Version
|
62
|
-
version: '
|
88
|
+
version: '1.2'
|
63
89
|
type: :development
|
64
90
|
prerelease: false
|
65
91
|
version_requirements: !ruby/object:Gem::Requirement
|
66
92
|
requirements:
|
67
|
-
- - "
|
93
|
+
- - "~>"
|
68
94
|
- !ruby/object:Gem::Version
|
69
|
-
version: '
|
95
|
+
version: '1.2'
|
70
96
|
- !ruby/object:Gem::Dependency
|
71
97
|
name: sdoc
|
72
98
|
requirement: !ruby/object:Gem::Requirement
|
73
99
|
requirements:
|
74
|
-
- - "
|
100
|
+
- - "~>"
|
75
101
|
- !ruby/object:Gem::Version
|
76
|
-
version: '0'
|
102
|
+
version: '0.4'
|
77
103
|
type: :development
|
78
104
|
prerelease: false
|
79
105
|
version_requirements: !ruby/object:Gem::Requirement
|
80
106
|
requirements:
|
81
|
-
- - "
|
107
|
+
- - "~>"
|
82
108
|
- !ruby/object:Gem::Version
|
83
|
-
version: '0'
|
109
|
+
version: '0.4'
|
84
110
|
- !ruby/object:Gem::Dependency
|
85
|
-
name: pry
|
111
|
+
name: pry-byebug
|
86
112
|
requirement: !ruby/object:Gem::Requirement
|
87
113
|
requirements:
|
88
114
|
- - ">="
|
@@ -99,16 +125,16 @@ dependencies:
|
|
99
125
|
name: coveralls
|
100
126
|
requirement: !ruby/object:Gem::Requirement
|
101
127
|
requirements:
|
102
|
-
- - "
|
128
|
+
- - "~>"
|
103
129
|
- !ruby/object:Gem::Version
|
104
|
-
version: '0'
|
130
|
+
version: '0.8'
|
105
131
|
type: :development
|
106
132
|
prerelease: false
|
107
133
|
version_requirements: !ruby/object:Gem::Requirement
|
108
134
|
requirements:
|
109
|
-
- - "
|
135
|
+
- - "~>"
|
110
136
|
- !ruby/object:Gem::Version
|
111
|
-
version: '0'
|
137
|
+
version: '0.8'
|
112
138
|
description: "\n PacketFu is a mid-level packet manipulation library for Ruby.
|
113
139
|
With\n it, users can read, parse, and write network packets with the level of\n
|
114
140
|
\ ease and fun they expect from Ruby.\n "
|
@@ -122,6 +148,8 @@ extra_rdoc_files:
|
|
122
148
|
- README.md
|
123
149
|
files:
|
124
150
|
- ".document"
|
151
|
+
- ".github/ISSUE_TEMPLATE.md"
|
152
|
+
- ".github/workflows/verify.yml"
|
125
153
|
- ".gitignore"
|
126
154
|
- ".mailmap"
|
127
155
|
- ".rspec"
|
@@ -139,6 +167,7 @@ files:
|
|
139
167
|
- bench/octets_after.txt
|
140
168
|
- bench/octets_after_refactor.txt
|
141
169
|
- bench/octets_before.txt
|
170
|
+
- certs/todb.pem
|
142
171
|
- examples/100kpackets.rb
|
143
172
|
- examples/ackscan.rb
|
144
173
|
- examples/arp.rb
|
@@ -153,6 +182,7 @@ files:
|
|
153
182
|
- examples/packetfu-shell.rb
|
154
183
|
- examples/pcap2pcapng.rb
|
155
184
|
- examples/ping.rb
|
185
|
+
- examples/readpcap.rb
|
156
186
|
- examples/simple-sniffer.rb
|
157
187
|
- examples/simple-stats.rb
|
158
188
|
- examples/slammer.rb
|
@@ -217,11 +247,13 @@ files:
|
|
217
247
|
- lib/packetfu/version.rb
|
218
248
|
- packetfu.gemspec
|
219
249
|
- spec/arp_spec.rb
|
250
|
+
- spec/capture_spec.rb
|
220
251
|
- spec/eth_spec.rb
|
221
252
|
- spec/fake_packets.rb
|
222
253
|
- spec/hsrp_spec.rb
|
223
254
|
- spec/icmp_spec.rb
|
224
255
|
- spec/icmpv6_spec.rb
|
256
|
+
- spec/inject_spec.rb
|
225
257
|
- spec/invalid_spec.rb
|
226
258
|
- spec/ip_spec.rb
|
227
259
|
- spec/ipv4_icmp.pcap
|
@@ -357,17 +389,14 @@ files:
|
|
357
389
|
- test/sample2.pcapng
|
358
390
|
- test/sample_hsrp_pcapr.cap
|
359
391
|
- test/sample_lldp.pcap
|
360
|
-
- test/test_capture.rb
|
361
|
-
- test/test_inject.rb
|
362
392
|
- test/test_packet.rb
|
363
|
-
- test/test_structfu.rb
|
364
393
|
- test/test_tcp.rb
|
365
394
|
- test/vlan-pcapr.cap
|
366
395
|
homepage: https://github.com/packetfu/packetfu
|
367
396
|
licenses:
|
368
|
-
- BSD
|
397
|
+
- BSD-3-Clause
|
369
398
|
metadata: {}
|
370
|
-
post_install_message:
|
399
|
+
post_install_message:
|
371
400
|
rdoc_options: []
|
372
401
|
require_paths:
|
373
402
|
- lib
|
@@ -375,24 +404,25 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
375
404
|
requirements:
|
376
405
|
- - ">="
|
377
406
|
- !ruby/object:Gem::Version
|
378
|
-
version: 2.
|
407
|
+
version: 2.7.0
|
379
408
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
380
409
|
requirements:
|
381
410
|
- - ">="
|
382
411
|
- !ruby/object:Gem::Version
|
383
412
|
version: '0'
|
384
413
|
requirements: []
|
385
|
-
|
386
|
-
|
387
|
-
signing_key:
|
414
|
+
rubygems_version: 3.4.13
|
415
|
+
signing_key:
|
388
416
|
specification_version: 4
|
389
417
|
summary: PacketFu is a mid-level packet manipulation library.
|
390
418
|
test_files:
|
391
419
|
- spec/arp_spec.rb
|
420
|
+
- spec/capture_spec.rb
|
392
421
|
- spec/eth_spec.rb
|
393
422
|
- spec/hsrp_spec.rb
|
394
423
|
- spec/icmp_spec.rb
|
395
424
|
- spec/icmpv6_spec.rb
|
425
|
+
- spec/inject_spec.rb
|
396
426
|
- spec/invalid_spec.rb
|
397
427
|
- spec/ip_spec.rb
|
398
428
|
- spec/ipv6_spec.rb
|
@@ -412,8 +442,5 @@ test_files:
|
|
412
442
|
- spec/tcp_spec.rb
|
413
443
|
- spec/udp_spec.rb
|
414
444
|
- spec/utils_spec.rb
|
415
|
-
- test/test_capture.rb
|
416
|
-
- test/test_inject.rb
|
417
445
|
- test/test_packet.rb
|
418
|
-
- test/test_structfu.rb
|
419
446
|
- test/test_tcp.rb
|
metadata.gz.sig
ADDED
Binary file
|
data/test/test_capture.rb
DELETED
@@ -1,58 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
require 'test/unit'
|
3
|
-
$:.unshift File.join(File.expand_path(File.dirname(__FILE__)), "..", "lib")
|
4
|
-
require 'packetfu'
|
5
|
-
|
6
|
-
|
7
|
-
class CaptureTest < Test::Unit::TestCase
|
8
|
-
|
9
|
-
def test_cap
|
10
|
-
assert_nothing_raised { PacketFu::Capture }
|
11
|
-
end
|
12
|
-
|
13
|
-
def test_whoami
|
14
|
-
assert_nothing_raised { PacketFu::Utils.whoami?(:iface => PacketFu::Utils.default_int) }
|
15
|
-
end
|
16
|
-
|
17
|
-
def test_new
|
18
|
-
cap = PacketFu::Capture.new
|
19
|
-
assert_kind_of PacketFu::Capture, cap
|
20
|
-
cap = PacketFu::Capture.new(
|
21
|
-
:filter => 'tcp and dst host 1.2.3.4'
|
22
|
-
)
|
23
|
-
end
|
24
|
-
|
25
|
-
def test_filter
|
26
|
-
daddr = PacketFu::Utils.rand_routable_daddr.to_s
|
27
|
-
cap = PacketFu::Capture.new( :filter => "icmp and dst host #{daddr}")
|
28
|
-
cap.start
|
29
|
-
%x{ping -c 1 #{daddr}}
|
30
|
-
sleep 1
|
31
|
-
cap.save
|
32
|
-
assert cap.array.size == 1
|
33
|
-
pkt = PacketFu::Packet.parse(cap.array.first)
|
34
|
-
assert pkt.ip_daddr == daddr
|
35
|
-
end
|
36
|
-
|
37
|
-
def test_no_filter
|
38
|
-
daddr = PacketFu::Utils.rand_routable_daddr.to_s
|
39
|
-
daddr2 = PacketFu::Utils.rand_routable_daddr.to_s
|
40
|
-
cap = PacketFu::Capture.new
|
41
|
-
cap.start
|
42
|
-
%x{ping -c 1 #{daddr}}
|
43
|
-
%x{ping -c 1 #{daddr2}}
|
44
|
-
sleep 1
|
45
|
-
cap.save
|
46
|
-
assert cap.array.size > 1
|
47
|
-
end
|
48
|
-
|
49
|
-
def test_bpf_alias
|
50
|
-
daddr = PacketFu::Utils.rand_routable_daddr.to_s
|
51
|
-
cap = PacketFu::Capture.new( :filter => "icmp and dst host #{daddr}")
|
52
|
-
assert cap.filter.object_id == cap.bpf.object_id
|
53
|
-
end
|
54
|
-
|
55
|
-
end
|
56
|
-
|
57
|
-
|
58
|
-
# vim: nowrap sw=2 sts=0 ts=2 ff=unix ft=ruby
|
data/test/test_inject.rb
DELETED
@@ -1,31 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
require 'test/unit'
|
3
|
-
$:.unshift File.join(File.expand_path(File.dirname(__FILE__)), "..", "lib")
|
4
|
-
require 'packetfu'
|
5
|
-
|
6
|
-
|
7
|
-
class InjectTest < Test::Unit::TestCase
|
8
|
-
|
9
|
-
def test_cap
|
10
|
-
assert_nothing_raised { PacketFu::Capture }
|
11
|
-
end
|
12
|
-
|
13
|
-
def test_whoami
|
14
|
-
assert_nothing_raised { PacketFu::Utils.whoami?(:iface => PacketFu::Utils.default_int) }
|
15
|
-
end
|
16
|
-
|
17
|
-
def test_to_w
|
18
|
-
assert_equal(Process.euid, 0, "TEST FAIL: This test must be run as root")
|
19
|
-
conf = PacketFu::Utils.whoami?(:iface => PacketFu::Utils.default_int)
|
20
|
-
p = PacketFu::UDPPacket.new(:config => conf)
|
21
|
-
p.udp_dport = 12345
|
22
|
-
p.udp_sport = 12345
|
23
|
-
p.payload = "PacketFu test packet"
|
24
|
-
p.recalc
|
25
|
-
assert p.to_w
|
26
|
-
end
|
27
|
-
|
28
|
-
end
|
29
|
-
|
30
|
-
|
31
|
-
# vim: nowrap sw=2 sts=0 ts=2 ff=unix ft=ruby
|
data/test/test_structfu.rb
DELETED
@@ -1,114 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
# -*- coding: binary -*-
|
3
|
-
|
4
|
-
require 'test/unit'
|
5
|
-
$:.unshift File.join(File.expand_path(File.dirname(__FILE__)), "..", "lib")
|
6
|
-
require 'packetfu'
|
7
|
-
|
8
|
-
# Whee unit testing.
|
9
|
-
class IntStringTest < Test::Unit::TestCase
|
10
|
-
include StructFu
|
11
|
-
|
12
|
-
def test_intstring_len
|
13
|
-
s = IntString.new("hello!", Int32)
|
14
|
-
assert_equal(s.len, s.int.v)
|
15
|
-
assert_not_equal(s.len, s.length)
|
16
|
-
s.len=10
|
17
|
-
assert_equal(s.len, s[:int][:value])
|
18
|
-
end
|
19
|
-
|
20
|
-
def test_intstring_to_s
|
21
|
-
s = IntString.new("hello!", Int16)
|
22
|
-
assert_equal("\x00\x06hello!",s.to_s)
|
23
|
-
s.len=10
|
24
|
-
assert_equal("\x00\x0ahello!",s.to_s)
|
25
|
-
s = IntString.new("hello!", Int16, :parse)
|
26
|
-
s.len=10
|
27
|
-
assert_equal("\x00\x0ahello!\x00\x00\x00\x00",s.to_s)
|
28
|
-
s = IntString.new("hello!", Int16, :fix)
|
29
|
-
s.len=10
|
30
|
-
assert_equal("\x00\x06hello!",s.to_s)
|
31
|
-
end
|
32
|
-
|
33
|
-
def test_intstring_new
|
34
|
-
assert_equal("\x06Hello!",IntString.new("Hello!").to_s)
|
35
|
-
assert_equal("\x00\x06Hello!",IntString.new("Hello!",Int16).to_s)
|
36
|
-
assert_equal("\x06\x00\x00\x00Hello!",IntString.new("Hello!",Int32le).to_s)
|
37
|
-
end
|
38
|
-
|
39
|
-
def test_intstring_read
|
40
|
-
s = IntString.new
|
41
|
-
s.read("\x06Hello!")
|
42
|
-
assert_equal("Hello!", s.string)
|
43
|
-
assert_equal("Hello!", s[:string])
|
44
|
-
assert_equal(6, s.int.value)
|
45
|
-
assert_equal(6, s.len)
|
46
|
-
end
|
47
|
-
|
48
|
-
def test_intstring_parse
|
49
|
-
s = IntString.new
|
50
|
-
s[:mode] = :parse
|
51
|
-
s.parse("\x02Hello!")
|
52
|
-
assert_equal("He", s.string)
|
53
|
-
assert_equal(2, s.int.v)
|
54
|
-
s.parse("\x0aHello!")
|
55
|
-
assert_equal("Hello!\x00\x00\x00\x00", s.string)
|
56
|
-
s[:mode] = :fix
|
57
|
-
s.parse("\x0aHello!")
|
58
|
-
assert_equal("Hello!", s.string)
|
59
|
-
end
|
60
|
-
|
61
|
-
def test_intstring_nocalc
|
62
|
-
s = IntString.new
|
63
|
-
s[:string] = "Hello"
|
64
|
-
assert_equal(0,s.int.value)
|
65
|
-
end
|
66
|
-
|
67
|
-
end
|
68
|
-
|
69
|
-
class IntTest < Test::Unit::TestCase
|
70
|
-
include StructFu
|
71
|
-
|
72
|
-
def test_int_to_s
|
73
|
-
assert_equal("\x02",Int8.new(2).to_s)
|
74
|
-
assert_equal("\x00\x07",Int16.new(7).to_s)
|
75
|
-
assert_equal("\x00\x00\x00\x0a",Int32.new(10).to_s)
|
76
|
-
end
|
77
|
-
|
78
|
-
def test_int_big
|
79
|
-
assert_equal("\x00\x07",Int16be.new(7).to_s)
|
80
|
-
assert_equal("\x00\x00\x00\x0a",Int32be.new(10).to_s)
|
81
|
-
end
|
82
|
-
|
83
|
-
def test_int_little
|
84
|
-
assert_equal("\x07\x00",Int16le.new(7).to_s)
|
85
|
-
assert_equal("\x01\x04\x00\x00",Int32le.new(1025).to_s)
|
86
|
-
end
|
87
|
-
|
88
|
-
def test_read
|
89
|
-
assert_equal(7,Int16.new.read("\x00\x07").to_i)
|
90
|
-
assert_equal(Int32.new.read("\x00\x00\x00\x0a").to_i,10)
|
91
|
-
i = Int32.new
|
92
|
-
i.read("\x00\x00\x00\xff")
|
93
|
-
assert_equal(i.v, 255)
|
94
|
-
assert_equal(7, Int16le.new.read("\x07\x00").to_i)
|
95
|
-
assert_equal(1025,Int32le.new.read("\x01\x04\x00\x00").to_i)
|
96
|
-
i = Int32le.new
|
97
|
-
i.read("\xff\x00\x00\x00")
|
98
|
-
assert_equal(i.v, 255)
|
99
|
-
end
|
100
|
-
|
101
|
-
def test_int_compare
|
102
|
-
little = Int32le.new
|
103
|
-
big = Int32be.new
|
104
|
-
little.v = 128
|
105
|
-
big.v = 0x80
|
106
|
-
assert_not_equal(little.to_s, big.to_s)
|
107
|
-
assert_equal(little.v, big.v)
|
108
|
-
assert_equal(little[:value], big[:value])
|
109
|
-
assert_equal(little.value, big.value)
|
110
|
-
end
|
111
|
-
|
112
|
-
end
|
113
|
-
|
114
|
-
# vim: nowrap sw=2 sts=0 ts=2 ff=unix ft=ruby
|