packetfu 1.1.13.pre → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. checksums.yaml +5 -5
  2. checksums.yaml.gz.sig +0 -0
  3. data/.github/ISSUE_TEMPLATE.md +29 -0
  4. data/.github/workflows/verify.yml +72 -0
  5. data/.travis.yml +10 -5
  6. data/LICENSE.txt +1 -1
  7. data/README.md +8 -8
  8. data/certs/todb.pem +25 -0
  9. data/examples/100kpackets.rb +2 -2
  10. data/examples/ackscan.rb +7 -6
  11. data/examples/pcap2pcapng.rb +2 -2
  12. data/examples/readpcap.rb +28 -0
  13. data/lib/packetfu/capture.rb +1 -1
  14. data/lib/packetfu/config.rb +2 -2
  15. data/lib/packetfu/inject.rb +1 -1
  16. data/lib/packetfu/packet.rb +6 -3
  17. data/lib/packetfu/pcap.rb +25 -25
  18. data/lib/packetfu/pcapng/file.rb +1 -1
  19. data/lib/packetfu/protos/arp.rb +1 -8
  20. data/lib/packetfu/protos/eth.rb +0 -7
  21. data/lib/packetfu/protos/hsrp.rb +0 -7
  22. data/lib/packetfu/protos/icmp/header.rb +7 -10
  23. data/lib/packetfu/protos/icmp.rb +0 -7
  24. data/lib/packetfu/protos/icmpv6.rb +4 -17
  25. data/lib/packetfu/protos/ip/header.rb +2 -2
  26. data/lib/packetfu/protos/ip/mixin.rb +9 -0
  27. data/lib/packetfu/protos/ip.rb +0 -8
  28. data/lib/packetfu/protos/ipv6/mixin.rb +12 -0
  29. data/lib/packetfu/protos/ipv6.rb +0 -7
  30. data/lib/packetfu/protos/lldp.rb +1 -8
  31. data/lib/packetfu/protos/tcp.rb +73 -30
  32. data/lib/packetfu/protos/udp/header.rb +4 -5
  33. data/lib/packetfu/protos/udp.rb +6 -18
  34. data/lib/packetfu/structfu.rb +1 -1
  35. data/lib/packetfu/version.rb +1 -1
  36. data/packetfu.gemspec +10 -18
  37. data/spec/arp_spec.rb +1 -1
  38. data/spec/capture_spec.rb +137 -0
  39. data/spec/eth_spec.rb +1 -1
  40. data/spec/icmp_spec.rb +1 -1
  41. data/spec/icmpv6_spec.rb +1 -1
  42. data/spec/inject_spec.rb +95 -0
  43. data/spec/ip_spec.rb +23 -1
  44. data/spec/packetfu_spec.rb +1 -1
  45. data/spec/pcap_spec.rb +3 -3
  46. data/spec/pcapng/file_spec.rb +1 -1
  47. data/spec/spec_helper.rb +4 -2
  48. data/spec/structfu_spec.rb +86 -82
  49. data/spec/tcp_spec.rb +155 -53
  50. data/test/sample-ipv6.pcap +0 -0
  51. data.tar.gz.sig +0 -0
  52. metadata +62 -57
  53. metadata.gz.sig +0 -0
  54. data/test/test_capture.rb +0 -58
  55. data/test/test_inject.rb +0 -31
  56. 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
- subject do
33
- bytes = PcapFile.file_to_array(File.join(File.dirname(__FILE__), "sample2.pcap"))[2]
34
- packet = Packet.parse(bytes)
35
- end
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
- context "TcpHlen set via an Integer for the setter" do
42
- (0..15).each do |i|
43
- context "i is #{i}" do
44
- before { subject.tcp_hlen = i }
45
- tcp_hlen_numeric(i)
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
- context "TcpReserved reading and setting" do
60
- context "TcpReserved set via #read" do
61
- tcp_reserved_numeric(0)
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
- context "TcpReserved set via an Integer for the setter" do
64
- (0..7).each do |i|
65
- context "i is #{i}" do
66
- before { subject.tcp_reserved = i }
67
- tcp_reserved_numeric(i)
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
- context "TcpReserved set via a String for the setter" do
72
- before { subject.tcp_reserved = "\x03" }
73
- tcp_reserved_numeric(3)
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
- context "TcpReserved set via a TcpReserved for the setter" do
76
- before { subject.tcp_reserved = TcpReserved.new(:r1 => 1, :r2 => 0, :r3 => 1) }
77
- tcp_reserved_numeric(5)
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 "TcpEcn reading and setting" do
82
- context "TcpEcn set via #read" do
83
- tcp_ecn_numeric(0)
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
- context "TcpEcn set via an Integer for the setter" do
86
- (0..7).each do |i|
87
- context "i is #{i}" do
88
- before { subject.tcp_ecn = i }
89
- tcp_ecn_numeric(i)
90
- end
91
- end
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
- context "TcpEcn set via a String for the setter" do
94
- before { subject.tcp_ecn = "\x00\xc0" }
95
- tcp_ecn_numeric(3)
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
- context "TcpEcn set via a TcpEcn for the setter" do
98
- before { subject.tcp_ecn = TcpEcn.new(:n => 1, :c => 0, :e => 1) }
99
- tcp_ecn_numeric(5)
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
Binary file
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,52 +1,56 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: packetfu
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.13.pre
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
11
  cert_chain:
12
12
  - |
13
13
  -----BEGIN CERTIFICATE-----
14
- MIIDbDCCAlSgAwIBAgIBATANBgkqhkiG9w0BAQUFADA+MQ0wCwYDVQQDDAR0b2Ri
15
- MRgwFgYKCZImiZPyLGQBGRYIcGFja2V0ZnUxEzARBgoJkiaJk/IsZAEZFgNjb20w
16
- HhcNMTcwMjAzMTc1MjAyWhcNMTgwMjAzMTc1MjAyWjA+MQ0wCwYDVQQDDAR0b2Ri
17
- MRgwFgYKCZImiZPyLGQBGRYIcGFja2V0ZnUxEzARBgoJkiaJk/IsZAEZFgNjb20w
18
- ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDig9ogvD2veEAEcmJt92br
19
- 5RhDcUv6VobqIazGJKdXhEYU6wk1353IxEfRTEWOwSKlFjJqwuV/Bm+jmZktoTQV
20
- ry8IZAfTxdHBSyWiXBGgg5UA3QS5ZH8gJIv7z9YQLWy8XORo76Xjpt0tr33z5+TU
21
- 8N3hh0ede6CAlM+TtCPJ6/GYvusJ1ThKjTWKMftllBFwFkbxMjrla6tfFu02tw/D
22
- bIeaC9kLliH+3exUzVDRqXZjHaD4edUPAId1QiFpLOgQBtqMCSm2aN3Cwdtb/4rc
23
- 7NSF7js+i+tgeAqNWogimx7P0/SKjE+UJ+qj7PK4bvPDqOxCwBprVzeQACQd/wNJ
24
- AgMBAAGjdTBzMAkGA1UdEwQCMAAwCwYDVR0PBAQDAgSwMB0GA1UdDgQWBBS0hsMH
25
- SbakJkxOU8dncu6xO+S/6zAcBgNVHREEFTATgRF0b2RiQHBhY2tldGZ1LmNvbTAc
26
- BgNVHRIEFTATgRF0b2RiQHBhY2tldGZ1LmNvbTANBgkqhkiG9w0BAQUFAAOCAQEA
27
- JuFlw48r9fmUML3z9e82Ldx+zh8Y5ry6Pf/fgacLpP9fpn62Dc/lZlCE6jYAyHo1
28
- hK40RP+CJAm/6pGfCX66nX3+CTWQimZLRMpaBoAvSFEZ6ksBqXnzFH0YZlJccTxe
29
- FIyxZQgxjsXfAbmkFfSh8zGGN0Yk1TSjnS54b9sQpmmopRShM2nMFimu6381SmLU
30
- LZVT1SzAMqjK5HKaFwBwmb9i+vPycblrL8ngjSg4TWqMt4PLXOTvyiCy2IQRXb+o
31
- aNODmav4FDa8Yham3QhPACahVVxZczCpbDHFvojjk127uca93t3gc2IGx1jYO0mv
32
- bGMb9KcX7MTVhg4J4u5k6A==
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
33
37
  -----END CERTIFICATE-----
34
- date: 2017-02-06 00:00:00.000000000 Z
38
+ date: 2023-06-28 00:00:00.000000000 Z
35
39
  dependencies:
36
40
  - !ruby/object:Gem::Dependency
37
41
  name: pcaprub
38
42
  requirement: !ruby/object:Gem::Requirement
39
43
  requirements:
40
- - - ">="
44
+ - - "~>"
41
45
  - !ruby/object:Gem::Version
42
- version: '0'
46
+ version: 0.13.1
43
47
  type: :runtime
44
48
  prerelease: false
45
49
  version_requirements: !ruby/object:Gem::Requirement
46
50
  requirements:
47
- - - ">="
51
+ - - "~>"
48
52
  - !ruby/object:Gem::Version
49
- version: '0'
53
+ version: 0.13.1
50
54
  - !ruby/object:Gem::Dependency
51
55
  name: rake
52
56
  requirement: !ruby/object:Gem::Requirement
@@ -65,46 +69,46 @@ dependencies:
65
69
  name: rspec
66
70
  requirement: !ruby/object:Gem::Requirement
67
71
  requirements:
68
- - - ">="
72
+ - - "~>"
69
73
  - !ruby/object:Gem::Version
70
- version: '0'
74
+ version: '3.0'
71
75
  type: :development
72
76
  prerelease: false
73
77
  version_requirements: !ruby/object:Gem::Requirement
74
78
  requirements:
75
- - - ">="
79
+ - - "~>"
76
80
  - !ruby/object:Gem::Version
77
- version: '0'
81
+ version: '3.0'
78
82
  - !ruby/object:Gem::Dependency
79
83
  name: rspec-its
80
84
  requirement: !ruby/object:Gem::Requirement
81
85
  requirements:
82
- - - ">="
86
+ - - "~>"
83
87
  - !ruby/object:Gem::Version
84
- version: '0'
88
+ version: '1.2'
85
89
  type: :development
86
90
  prerelease: false
87
91
  version_requirements: !ruby/object:Gem::Requirement
88
92
  requirements:
89
- - - ">="
93
+ - - "~>"
90
94
  - !ruby/object:Gem::Version
91
- version: '0'
95
+ version: '1.2'
92
96
  - !ruby/object:Gem::Dependency
93
97
  name: sdoc
94
98
  requirement: !ruby/object:Gem::Requirement
95
99
  requirements:
96
- - - ">="
100
+ - - "~>"
97
101
  - !ruby/object:Gem::Version
98
- version: '0'
102
+ version: '0.4'
99
103
  type: :development
100
104
  prerelease: false
101
105
  version_requirements: !ruby/object:Gem::Requirement
102
106
  requirements:
103
- - - ">="
107
+ - - "~>"
104
108
  - !ruby/object:Gem::Version
105
- version: '0'
109
+ version: '0.4'
106
110
  - !ruby/object:Gem::Dependency
107
- name: pry
111
+ name: pry-byebug
108
112
  requirement: !ruby/object:Gem::Requirement
109
113
  requirements:
110
114
  - - ">="
@@ -121,16 +125,16 @@ dependencies:
121
125
  name: coveralls
122
126
  requirement: !ruby/object:Gem::Requirement
123
127
  requirements:
124
- - - ">="
128
+ - - "~>"
125
129
  - !ruby/object:Gem::Version
126
- version: '0'
130
+ version: '0.8'
127
131
  type: :development
128
132
  prerelease: false
129
133
  version_requirements: !ruby/object:Gem::Requirement
130
134
  requirements:
131
- - - ">="
135
+ - - "~>"
132
136
  - !ruby/object:Gem::Version
133
- version: '0'
137
+ version: '0.8'
134
138
  description: "\n PacketFu is a mid-level packet manipulation library for Ruby.
135
139
  With\n it, users can read, parse, and write network packets with the level of\n
136
140
  \ ease and fun they expect from Ruby.\n "
@@ -144,6 +148,8 @@ extra_rdoc_files:
144
148
  - README.md
145
149
  files:
146
150
  - ".document"
151
+ - ".github/ISSUE_TEMPLATE.md"
152
+ - ".github/workflows/verify.yml"
147
153
  - ".gitignore"
148
154
  - ".mailmap"
149
155
  - ".rspec"
@@ -161,6 +167,7 @@ files:
161
167
  - bench/octets_after.txt
162
168
  - bench/octets_after_refactor.txt
163
169
  - bench/octets_before.txt
170
+ - certs/todb.pem
164
171
  - examples/100kpackets.rb
165
172
  - examples/ackscan.rb
166
173
  - examples/arp.rb
@@ -175,6 +182,7 @@ files:
175
182
  - examples/packetfu-shell.rb
176
183
  - examples/pcap2pcapng.rb
177
184
  - examples/ping.rb
185
+ - examples/readpcap.rb
178
186
  - examples/simple-sniffer.rb
179
187
  - examples/simple-stats.rb
180
188
  - examples/slammer.rb
@@ -239,11 +247,13 @@ files:
239
247
  - lib/packetfu/version.rb
240
248
  - packetfu.gemspec
241
249
  - spec/arp_spec.rb
250
+ - spec/capture_spec.rb
242
251
  - spec/eth_spec.rb
243
252
  - spec/fake_packets.rb
244
253
  - spec/hsrp_spec.rb
245
254
  - spec/icmp_spec.rb
246
255
  - spec/icmpv6_spec.rb
256
+ - spec/inject_spec.rb
247
257
  - spec/invalid_spec.rb
248
258
  - spec/ip_spec.rb
249
259
  - spec/ipv4_icmp.pcap
@@ -379,17 +389,14 @@ files:
379
389
  - test/sample2.pcapng
380
390
  - test/sample_hsrp_pcapr.cap
381
391
  - test/sample_lldp.pcap
382
- - test/test_capture.rb
383
- - test/test_inject.rb
384
392
  - test/test_packet.rb
385
- - test/test_structfu.rb
386
393
  - test/test_tcp.rb
387
394
  - test/vlan-pcapr.cap
388
395
  homepage: https://github.com/packetfu/packetfu
389
396
  licenses:
390
- - BSD
397
+ - BSD-3-Clause
391
398
  metadata: {}
392
- post_install_message:
399
+ post_install_message:
393
400
  rdoc_options: []
394
401
  require_paths:
395
402
  - lib
@@ -397,24 +404,25 @@ required_ruby_version: !ruby/object:Gem::Requirement
397
404
  requirements:
398
405
  - - ">="
399
406
  - !ruby/object:Gem::Version
400
- version: 2.1.0
407
+ version: 2.7.0
401
408
  required_rubygems_version: !ruby/object:Gem::Requirement
402
409
  requirements:
403
- - - ">"
410
+ - - ">="
404
411
  - !ruby/object:Gem::Version
405
- version: 1.3.1
412
+ version: '0'
406
413
  requirements: []
407
- rubyforge_project: packetfu
408
- rubygems_version: 2.6.8
409
- signing_key:
414
+ rubygems_version: 3.4.13
415
+ signing_key:
410
416
  specification_version: 4
411
417
  summary: PacketFu is a mid-level packet manipulation library.
412
418
  test_files:
413
419
  - spec/arp_spec.rb
420
+ - spec/capture_spec.rb
414
421
  - spec/eth_spec.rb
415
422
  - spec/hsrp_spec.rb
416
423
  - spec/icmp_spec.rb
417
424
  - spec/icmpv6_spec.rb
425
+ - spec/inject_spec.rb
418
426
  - spec/invalid_spec.rb
419
427
  - spec/ip_spec.rb
420
428
  - spec/ipv6_spec.rb
@@ -434,8 +442,5 @@ test_files:
434
442
  - spec/tcp_spec.rb
435
443
  - spec/udp_spec.rb
436
444
  - spec/utils_spec.rb
437
- - test/test_capture.rb
438
- - test/test_inject.rb
439
445
  - test/test_packet.rb
440
- - test/test_structfu.rb
441
446
  - test/test_tcp.rb
metadata.gz.sig CHANGED
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