packetgen 4.0.0 → 4.1.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 +4 -4
- data/README.md +1 -1
- data/lib/packetgen/deprecation.rb +7 -1
- data/lib/packetgen/header/arp.rb +6 -7
- data/lib/packetgen/header/asn1_base.rb +2 -1
- data/lib/packetgen/header/base.rb +27 -24
- data/lib/packetgen/header/bootp.rb +14 -14
- data/lib/packetgen/header/dhcp/option.rb +8 -8
- data/lib/packetgen/header/dhcp/options.rb +2 -2
- data/lib/packetgen/header/dhcp.rb +6 -7
- data/lib/packetgen/header/dhcpv6/duid.rb +1 -1
- data/lib/packetgen/header/dhcpv6/option.rb +37 -15
- data/lib/packetgen/header/dhcpv6/options.rb +3 -3
- data/lib/packetgen/header/dhcpv6/relay.rb +1 -0
- data/lib/packetgen/header/dhcpv6.rb +13 -14
- data/lib/packetgen/header/dns/name.rb +9 -8
- data/lib/packetgen/header/dns/opt.rb +3 -0
- data/lib/packetgen/header/dns/option.rb +7 -7
- data/lib/packetgen/header/dns/qdsection.rb +2 -2
- data/lib/packetgen/header/dns/question.rb +1 -0
- data/lib/packetgen/header/dns/rrsection.rb +2 -2
- data/lib/packetgen/header/dns.rb +76 -60
- data/lib/packetgen/header/dot11/control.rb +5 -5
- data/lib/packetgen/header/dot11/data.rb +11 -10
- data/lib/packetgen/header/dot11/element.rb +1 -1
- data/lib/packetgen/header/dot11/management.rb +18 -15
- data/lib/packetgen/header/dot11/sub_mngt.rb +22 -21
- data/lib/packetgen/header/dot11.rb +38 -38
- data/lib/packetgen/header/dot1q.rb +5 -4
- data/lib/packetgen/header/dot1x.rb +8 -8
- data/lib/packetgen/header/eap/fast.rb +3 -3
- data/lib/packetgen/header/eap/md5.rb +11 -3
- data/lib/packetgen/header/eap/tls.rb +9 -8
- data/lib/packetgen/header/eap/ttls.rb +13 -10
- data/lib/packetgen/header/eap.rb +58 -33
- data/lib/packetgen/header/eth.rb +26 -12
- data/lib/packetgen/header/gre.rb +26 -2
- data/lib/packetgen/header/http/headers.rb +6 -5
- data/lib/packetgen/header/http/request.rb +24 -16
- data/lib/packetgen/header/http/response.rb +22 -15
- data/lib/packetgen/header/icmp.rb +10 -10
- data/lib/packetgen/header/icmpv6.rb +10 -9
- data/lib/packetgen/header/igmp.rb +21 -10
- data/lib/packetgen/header/igmpv3/group_record.rb +7 -2
- data/lib/packetgen/header/igmpv3/mq.rb +1 -1
- data/lib/packetgen/header/igmpv3/mr.rb +1 -1
- data/lib/packetgen/header/igmpv3.rb +11 -10
- data/lib/packetgen/header/ip/addr.rb +6 -2
- data/lib/packetgen/header/ip/option.rb +18 -5
- data/lib/packetgen/header/ip.rb +52 -35
- data/lib/packetgen/header/ipv6/addr.rb +14 -13
- data/lib/packetgen/header/ipv6/extension.rb +9 -7
- data/lib/packetgen/header/ipv6/hop_by_hop.rb +26 -7
- data/lib/packetgen/header/ipv6.rb +31 -22
- data/lib/packetgen/header/llc.rb +20 -13
- data/lib/packetgen/header/mdns.rb +9 -2
- data/lib/packetgen/header/mld.rb +11 -9
- data/lib/packetgen/header/mldv2/mcast_address_record.rb +6 -1
- data/lib/packetgen/header/mldv2/mlq.rb +8 -8
- data/lib/packetgen/header/mldv2/mlr.rb +4 -4
- data/lib/packetgen/header/mldv2.rb +1 -1
- data/lib/packetgen/header/ospfv2/db_description.rb +10 -10
- data/lib/packetgen/header/ospfv2/hello.rb +11 -10
- data/lib/packetgen/header/ospfv2/ls_ack.rb +5 -6
- data/lib/packetgen/header/ospfv2/ls_request.rb +7 -6
- data/lib/packetgen/header/ospfv2/ls_update.rb +7 -7
- data/lib/packetgen/header/ospfv2/lsa.rb +33 -10
- data/lib/packetgen/header/ospfv2/lsa_header.rb +3 -2
- data/lib/packetgen/header/ospfv2.rb +31 -26
- data/lib/packetgen/header/ospfv3/db_description.rb +12 -13
- data/lib/packetgen/header/ospfv3/hello.rb +10 -9
- data/lib/packetgen/header/ospfv3/ipv6_prefix.rb +6 -2
- data/lib/packetgen/header/ospfv3/ls_ack.rb +5 -6
- data/lib/packetgen/header/ospfv3/ls_request.rb +10 -10
- data/lib/packetgen/header/ospfv3/ls_update.rb +7 -7
- data/lib/packetgen/header/ospfv3/lsa.rb +23 -9
- data/lib/packetgen/header/ospfv3/lsa_header.rb +3 -2
- data/lib/packetgen/header/ospfv3.rb +38 -34
- data/lib/packetgen/header/sctp/chunk.rb +38 -17
- data/lib/packetgen/header/sctp/error.rb +169 -197
- data/lib/packetgen/header/sctp/padded32.rb +3 -3
- data/lib/packetgen/header/sctp/parameter.rb +85 -132
- data/lib/packetgen/header/sctp.rb +14 -3
- data/lib/packetgen/header/snmp.rb +108 -7
- data/lib/packetgen/header/tcp/option.rb +7 -0
- data/lib/packetgen/header/tcp/options.rb +11 -3
- data/lib/packetgen/header/tcp.rb +33 -26
- data/lib/packetgen/header/tftp.rb +16 -10
- data/lib/packetgen/header/udp.rb +15 -13
- data/lib/packetgen/header.rb +19 -13
- data/lib/packetgen/headerable.rb +9 -3
- data/lib/packetgen/inspect.rb +2 -7
- data/lib/packetgen/packet.rb +94 -36
- data/lib/packetgen/pcapng/block.rb +2 -1
- data/lib/packetgen/pcapng/file.rb +41 -14
- data/lib/packetgen/pcapng/idb.rb +2 -1
- data/lib/packetgen/pcapng/shb.rb +2 -1
- data/lib/packetgen/pcapng/spb.rb +1 -1
- data/lib/packetgen/pcapng.rb +2 -0
- data/lib/packetgen/proto.rb +4 -0
- data/lib/packetgen/unknown_packet.rb +3 -3
- data/lib/packetgen/utils.rb +2 -1
- data/lib/packetgen/version.rb +1 -1
- data/lib/packetgen.rb +8 -2
- metadata +4 -4
@@ -8,9 +8,24 @@
|
|
8
8
|
|
9
9
|
module PacketGen
|
10
10
|
module PcapNG
|
11
|
-
# PcapNG::File is a complete Pcap-NG file handler.
|
11
|
+
# PcapNG::File is a complete Pcap-NG file handler. It provides methods to:
|
12
|
+
# * read and write PcapNG files,
|
13
|
+
# * process packets from such files.
|
14
|
+
#
|
15
|
+
# @example Writing a file
|
16
|
+
# pkt1 = PacketGen.gen('IP', id: 1).add('TCP')
|
17
|
+
# pkt2 = PacketGen.gen('IP', id: 2).add('UDP')
|
18
|
+
# file = PacketGen::PcapNG::File.new
|
19
|
+
# file.read_array([pkt1, pkt2])
|
20
|
+
# file.write('/tmp/file.pcapng')
|
21
|
+
#
|
22
|
+
# @example Reading a file
|
23
|
+
# file = PacketGen::PcapNG::File.new
|
24
|
+
# pkts = file.read_packets('/tmp/file.pcapng')
|
25
|
+
#
|
12
26
|
# @author Sylvain Daubert
|
13
|
-
|
27
|
+
# @author LemonTree55
|
28
|
+
class File
|
14
29
|
# Known link types
|
15
30
|
KNOWN_LINK_TYPES = {
|
16
31
|
LINKTYPE_ETHERNET => 'Eth',
|
@@ -29,19 +44,19 @@ module PacketGen
|
|
29
44
|
end.freeze
|
30
45
|
|
31
46
|
# Get file sections
|
32
|
-
# @return [Array]
|
47
|
+
# @return [Array<SHB>]
|
33
48
|
attr_accessor :sections
|
34
49
|
|
35
50
|
def initialize
|
36
51
|
@sections = []
|
37
52
|
end
|
38
53
|
|
39
|
-
# Read a string to populate the object. Note that this appends new blocks to
|
54
|
+
# Read a binary string to populate the object. Note that this appends new blocks to
|
40
55
|
# the Pcapng::File object.
|
41
56
|
# @param [String] str
|
42
57
|
# @return [self]
|
43
58
|
def read(str)
|
44
|
-
|
59
|
+
str = str.b unless str.encoding == Encoding::BINARY
|
45
60
|
io = StringIO.new(str)
|
46
61
|
parse_section(io)
|
47
62
|
self
|
@@ -59,11 +74,19 @@ module PacketGen
|
|
59
74
|
|
60
75
|
# Read a given file and analyze it.
|
61
76
|
# If given a block, it will yield PcapNG::EPB or PcapNG::SPB objects.
|
62
|
-
# This is the only way to get packet timestamps.
|
77
|
+
# This is the only way to get packet timestamps (via {EPB#timestamp}).
|
63
78
|
# @param [String] fname pcapng file name
|
64
79
|
# @yieldparam [EPB,SPB] block
|
65
80
|
# @return [Integer] return number of yielded blocks (only if a block is given)
|
66
81
|
# @raise [ArgumentError] cannot read +fname+
|
82
|
+
# @example Parse packets and get their timestamp
|
83
|
+
# hsh = {}
|
84
|
+
# file = PacketGen::PcapNG::File.new
|
85
|
+
# file.readfile('/tmp/file.pcapng') do |xpb|
|
86
|
+
# ts = xpb.is_a?(PacketGen::PcapNG::EPB) ? xpb.timestamp : nil
|
87
|
+
# pkt = PacketGen.parse(xpb.data)
|
88
|
+
# hsh[pkt] = ts
|
89
|
+
# end
|
67
90
|
def readfile(fname, &blk)
|
68
91
|
raise ArgumentError, "cannot read file #{fname}" unless ::File.readable?(fname)
|
69
92
|
|
@@ -168,13 +191,15 @@ module PacketGen
|
|
168
191
|
end
|
169
192
|
|
170
193
|
# Writes the {File} to a file.
|
171
|
-
# @param [
|
172
|
-
# @
|
194
|
+
# @param [String] filename file name to write
|
195
|
+
# @param [Boolean] append if set to +true+,
|
173
196
|
# the packets are appended to the file, rather than overwriting it
|
174
|
-
# @return [Array] array of 2 elements: filename and size written
|
175
|
-
# @
|
176
|
-
|
177
|
-
|
197
|
+
# @return [Array(String, Integer)] array of 2 elements: filename and size written
|
198
|
+
# @since 4.1.0 Options hash with single +:append+ option is replaced by +append+ keyword argument.
|
199
|
+
# @see #append
|
200
|
+
# @see #write
|
201
|
+
def to_file(filename, append: false)
|
202
|
+
mode = append && ::File.exist?(filename) ? 'ab' : 'wb'
|
178
203
|
::File.open(filename, mode) { |f| f.write(self.to_s) }
|
179
204
|
[filename, self.to_s.size]
|
180
205
|
end
|
@@ -182,14 +207,16 @@ module PacketGen
|
|
182
207
|
|
183
208
|
# Shorthand method for writing to a file.
|
184
209
|
# @param [#to_s] filename
|
185
|
-
# @return [Array]
|
210
|
+
# @return [Array(String, Integer)]
|
211
|
+
# @see #to_file
|
186
212
|
def write(filename='out.pcapng')
|
187
213
|
self.to_file(filename.to_s, append: false)
|
188
214
|
end
|
189
215
|
|
190
216
|
# Shorthand method for appending to a file.
|
191
217
|
# @param [#to_s] filename
|
192
|
-
# @return [Array]
|
218
|
+
# @return [Array(String, Integer)]
|
219
|
+
# @see #to_file
|
193
220
|
def append(filename='out.pcapng')
|
194
221
|
self.to_file(filename.to_s, append: true)
|
195
222
|
end
|
data/lib/packetgen/pcapng/idb.rb
CHANGED
@@ -8,7 +8,8 @@
|
|
8
8
|
|
9
9
|
module PacketGen
|
10
10
|
module PcapNG
|
11
|
-
# {IDB} represents
|
11
|
+
# {IDB} represents an Interface Description Block (IDB) of a pcapng file. It is associated to a network interfaces.
|
12
|
+
# It contains packet data as {EPB} and/or {SPB}.
|
12
13
|
#
|
13
14
|
# == IDB Definition
|
14
15
|
# Int32 :type Default: 0x00000001
|
data/lib/packetgen/pcapng/shb.rb
CHANGED
@@ -8,7 +8,8 @@
|
|
8
8
|
|
9
9
|
module PacketGen
|
10
10
|
module PcapNG
|
11
|
-
# {SHB} represents a Section Header Block (SHB) of a pcapng file.
|
11
|
+
# {SHB} represents a Section Header Block (SHB) of a pcapng file. A SHB contains {IDB}, which contain
|
12
|
+
# {EPB} and/or {SPB}.
|
12
13
|
#
|
13
14
|
# == SHB Definition
|
14
15
|
# Int32 :type Default: 0x0A0D0D0A
|
data/lib/packetgen/pcapng/spb.rb
CHANGED
data/lib/packetgen/pcapng.rb
CHANGED
@@ -11,6 +11,8 @@ require 'stringio'
|
|
11
11
|
module PacketGen
|
12
12
|
# Module to handle PCAP-NG file format.
|
13
13
|
# See http://xml2rfc.tools.ietf.org/cgi-bin/xml2rfc.cgi?url=https://raw.githubusercontent.com/pcapng/pcapng/master/draft-tuexen-opsawg-pcapng.xml&modeAsFormat=html/ascii&type=ascii
|
14
|
+
#
|
15
|
+
# See {PcapNG::File} to handle Pcap-NG files.
|
14
16
|
# @author Sylvain Daubert
|
15
17
|
module PcapNG
|
16
18
|
# Section Header Block type number
|
data/lib/packetgen/proto.rb
CHANGED
@@ -30,6 +30,8 @@ module PacketGen
|
|
30
30
|
# Get protocol number from its name
|
31
31
|
# @param [String] name
|
32
32
|
# @return [Integer,nil] return nil for unknown protocol names
|
33
|
+
# @example
|
34
|
+
# PacketGen::Proto.getprotobyname('tcp') #=> 6
|
33
35
|
def self.getprotobyname(name)
|
34
36
|
@cache[name]
|
35
37
|
end
|
@@ -37,6 +39,8 @@ module PacketGen
|
|
37
39
|
# Get protocol name from its number
|
38
40
|
# @param [Integer] num
|
39
41
|
# @return [String,nil] return nil for unknown protocol numbers
|
42
|
+
# @example
|
43
|
+
# PacketGen::Proto.getprotobynumber(6) #=> 'tcp'
|
40
44
|
def self.getprotobynumber(num)
|
41
45
|
@cache.key(num)
|
42
46
|
end
|
@@ -20,7 +20,7 @@ module PacketGen
|
|
20
20
|
|
21
21
|
def initialize
|
22
22
|
@headers = [].freeze
|
23
|
-
@binary_str =
|
23
|
+
@binary_str = ::String.new # Return empty string with encoding ASCII-8BIT, so BINARY
|
24
24
|
end
|
25
25
|
|
26
26
|
# Unknown packet, so unknown protocol.
|
@@ -40,7 +40,7 @@ module PacketGen
|
|
40
40
|
# @param [String] str
|
41
41
|
# @return [void]
|
42
42
|
def body=(str)
|
43
|
-
@binary_str =
|
43
|
+
@binary_str = str.b
|
44
44
|
end
|
45
45
|
|
46
46
|
# Write packet to a PCapNG file on disk.
|
@@ -56,7 +56,7 @@ module PacketGen
|
|
56
56
|
# @param [String] binary_str
|
57
57
|
# @return [self]
|
58
58
|
def parse(binary_str, _first_header: nil)
|
59
|
-
@binary_str =
|
59
|
+
@binary_str = binary_str.b
|
60
60
|
self
|
61
61
|
end
|
62
62
|
|
data/lib/packetgen/utils.rb
CHANGED
@@ -168,7 +168,8 @@ module PacketGen
|
|
168
168
|
def self.mitm(target1, target2, options={}, &block)
|
169
169
|
options = { iface: PacketGen.default_iface }.merge(options)
|
170
170
|
|
171
|
-
|
171
|
+
spoofer_options = options.slice(:timeout, :interval, :iface)
|
172
|
+
spoofer = Utils::ARPSpoofer.new(**spoofer_options.compact)
|
172
173
|
spoofer.add target1, target2, options
|
173
174
|
spoofer.add target2, target1, options
|
174
175
|
|
data/lib/packetgen/version.rb
CHANGED
data/lib/packetgen.rb
CHANGED
@@ -13,6 +13,7 @@ require 'interfacez'
|
|
13
13
|
|
14
14
|
# PacketGen is a network packet generator and analyzor.
|
15
15
|
# @author Sylvain Daubert
|
16
|
+
# @author LemonTree
|
16
17
|
module PacketGen
|
17
18
|
# Base exception class for PacketGen exceptions
|
18
19
|
class Error < StandardError; end
|
@@ -33,12 +34,15 @@ module PacketGen
|
|
33
34
|
# @return [Headerable]
|
34
35
|
attr_reader :hdr
|
35
36
|
|
37
|
+
# @param [Headerable] prev_hdr
|
38
|
+
# @param [Headerable] hdr
|
36
39
|
def initialize(prev_hdr, hdr)
|
37
40
|
super()
|
38
41
|
@prev_hdr = prev_hdr
|
39
42
|
@hdr = hdr
|
40
43
|
end
|
41
44
|
|
45
|
+
# @return [String]
|
42
46
|
def message
|
43
47
|
"#{prev_hdr.class} knowns no layer association with #{hdr.protocol_name}. " \
|
44
48
|
"Try #{prev_hdr.class}.bind_layer(#{hdr.class}, " \
|
@@ -92,8 +96,10 @@ module PacketGen
|
|
92
96
|
# Force binary encoding for +str+
|
93
97
|
# @param [String] str
|
94
98
|
# @return [String] binary encoded string
|
99
|
+
# @deprecated Use +String#b+ instead.
|
95
100
|
def self.force_binary(str)
|
96
|
-
|
101
|
+
Deprecation.deprecated(self, :force_binary, 'String#b')
|
102
|
+
str.b
|
97
103
|
end
|
98
104
|
|
99
105
|
# Get default network interface (ie. first non-loopback declared interface)
|
@@ -120,7 +126,7 @@ module PacketGen
|
|
120
126
|
# Shortcut to get a header class
|
121
127
|
# @example builtin class
|
122
128
|
# # same as PacketGen::Header::Dot11:Data.new(id: 0xfedc)
|
123
|
-
# dot11 = PacketGen.header('Dot11::Data', id: 0xfedc)
|
129
|
+
# dot11 = PacketGen.header('Dot11::Data', id: 0xfedc)
|
124
130
|
# @example plugin class
|
125
131
|
# require 'packet-plugin-smb'
|
126
132
|
# # same as PacketGen::Plugin::SMB::CloseRequest.new(fid: 0x1234)
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: packetgen
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.
|
4
|
+
version: 4.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- LemonTree55
|
8
8
|
bindir: bin
|
9
9
|
cert_chain: []
|
10
|
-
date:
|
10
|
+
date: 2025-03-08 00:00:00.000000000 Z
|
11
11
|
dependencies:
|
12
12
|
- !ruby/object:Gem::Dependency
|
13
13
|
name: bin_struct
|
@@ -15,14 +15,14 @@ dependencies:
|
|
15
15
|
requirements:
|
16
16
|
- - "~>"
|
17
17
|
- !ruby/object:Gem::Version
|
18
|
-
version: 0.
|
18
|
+
version: 0.5.0
|
19
19
|
type: :runtime
|
20
20
|
prerelease: false
|
21
21
|
version_requirements: !ruby/object:Gem::Requirement
|
22
22
|
requirements:
|
23
23
|
- - "~>"
|
24
24
|
- !ruby/object:Gem::Version
|
25
|
-
version: 0.
|
25
|
+
version: 0.5.0
|
26
26
|
- !ruby/object:Gem::Dependency
|
27
27
|
name: digest-crc
|
28
28
|
requirement: !ruby/object:Gem::Requirement
|