packetgen 2.8.7 → 3.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 +4 -4
- data/.rubocop.yml +0 -1
- data/README.md +5 -4
- data/lib/packetgen.rb +6 -12
- data/lib/packetgen/capture.rb +43 -39
- data/lib/packetgen/config.rb +0 -1
- data/lib/packetgen/deprecation.rb +1 -1
- data/lib/packetgen/header.rb +9 -9
- data/lib/packetgen/header/asn1_base.rb +10 -10
- data/lib/packetgen/header/base.rb +42 -101
- data/lib/packetgen/header/dhcp/option.rb +5 -11
- data/lib/packetgen/header/dhcpv6/duid.rb +2 -0
- data/lib/packetgen/header/dhcpv6/option.rb +2 -19
- data/lib/packetgen/header/dhcpv6/options.rb +7 -0
- data/lib/packetgen/header/dns.rb +5 -23
- data/lib/packetgen/header/dns/name.rb +1 -0
- data/lib/packetgen/header/dns/qdsection.rb +1 -0
- data/lib/packetgen/header/dns/question.rb +3 -7
- data/lib/packetgen/header/dns/rr.rb +3 -0
- data/lib/packetgen/header/dns/rrsection.rb +1 -0
- data/lib/packetgen/header/dot11.rb +1 -17
- data/lib/packetgen/header/dot1x.rb +1 -0
- data/lib/packetgen/header/eap.rb +4 -7
- data/lib/packetgen/header/eth.rb +2 -0
- data/lib/packetgen/header/http/headers.rb +3 -0
- data/lib/packetgen/header/http/request.rb +5 -4
- data/lib/packetgen/header/http/response.rb +5 -4
- data/lib/packetgen/header/icmp.rb +6 -0
- data/lib/packetgen/header/icmpv6.rb +6 -0
- data/lib/packetgen/header/igmpv3/mq.rb +2 -0
- data/lib/packetgen/header/ip.rb +32 -30
- data/lib/packetgen/header/ip/addr.rb +1 -0
- data/lib/packetgen/header/ip/option.rb +23 -20
- data/lib/packetgen/header/ip/options.rb +11 -24
- data/lib/packetgen/header/ipv6.rb +45 -34
- data/lib/packetgen/header/ipv6/addr.rb +2 -0
- data/lib/packetgen/header/ipv6/hop_by_hop.rb +7 -31
- data/lib/packetgen/header/mdns.rb +1 -0
- data/lib/packetgen/header/mldv2/mlq.rb +2 -0
- data/lib/packetgen/header/ospfv2/lsa.rb +15 -25
- data/lib/packetgen/header/ospfv3/ipv6_prefix.rb +1 -1
- data/lib/packetgen/header/ospfv3/lsa.rb +8 -25
- data/lib/packetgen/header/snmp.rb +2 -0
- data/lib/packetgen/header/tcp.rb +23 -2
- data/lib/packetgen/header/tcp/option.rb +51 -52
- data/lib/packetgen/header/tcp/options.rb +17 -52
- data/lib/packetgen/header/tftp.rb +3 -0
- data/lib/packetgen/header/udp.rb +8 -0
- data/lib/packetgen/packet.rb +119 -102
- data/lib/packetgen/pcapng/block.rb +4 -10
- data/lib/packetgen/pcapng/epb.rb +4 -4
- data/lib/packetgen/pcapng/file.rb +7 -3
- data/lib/packetgen/pcapng/idb.rb +2 -2
- data/lib/packetgen/pcapng/shb.rb +3 -3
- data/lib/packetgen/pcapng/spb.rb +1 -8
- data/lib/packetgen/pcapng/unknown_block.rb +0 -7
- data/lib/packetgen/types.rb +1 -0
- data/lib/packetgen/types/array.rb +73 -71
- data/lib/packetgen/types/cstring.rb +1 -1
- data/lib/packetgen/types/enum.rb +3 -3
- data/lib/packetgen/types/fields.rb +66 -106
- data/lib/packetgen/types/int.rb +9 -5
- data/lib/packetgen/types/length_from.rb +45 -0
- data/lib/packetgen/types/oui.rb +2 -0
- data/lib/packetgen/types/string.rb +10 -16
- data/lib/packetgen/types/tlv.rb +7 -15
- data/lib/packetgen/utils.rb +8 -8
- data/lib/packetgen/utils/arp_spoofer.rb +1 -2
- data/lib/packetgen/version.rb +1 -1
- metadata +3 -21
- data/lib/packetgen/header/crypto.rb +0 -62
- data/lib/packetgen/header/esp.rb +0 -413
- data/lib/packetgen/header/ike.rb +0 -243
- data/lib/packetgen/header/ike/auth.rb +0 -165
- data/lib/packetgen/header/ike/cert.rb +0 -76
- data/lib/packetgen/header/ike/certreq.rb +0 -66
- data/lib/packetgen/header/ike/id.rb +0 -99
- data/lib/packetgen/header/ike/ke.rb +0 -79
- data/lib/packetgen/header/ike/nonce.rb +0 -40
- data/lib/packetgen/header/ike/notify.rb +0 -176
- data/lib/packetgen/header/ike/payload.rb +0 -315
- data/lib/packetgen/header/ike/sa.rb +0 -561
- data/lib/packetgen/header/ike/sk.rb +0 -261
- data/lib/packetgen/header/ike/ts.rb +0 -270
- data/lib/packetgen/header/ike/vendor_id.rb +0 -39
- data/lib/packetgen/header/netbios.rb +0 -20
- data/lib/packetgen/header/netbios/datagram.rb +0 -105
- data/lib/packetgen/header/netbios/name.rb +0 -67
- data/lib/packetgen/header/netbios/session.rb +0 -64
@@ -1,39 +0,0 @@
|
|
1
|
-
# coding: utf-8
|
2
|
-
# This file is part of PacketGen
|
3
|
-
# See https://github.com/sdaubert/packetgen for more informations
|
4
|
-
# Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
|
5
|
-
# This program is published under MIT license.
|
6
|
-
|
7
|
-
# frozen_string_literal: true
|
8
|
-
|
9
|
-
module PacketGen
|
10
|
-
module Header
|
11
|
-
class IKE
|
12
|
-
# This class handles Vendor ID payloads, as defined in RFC 7296 §3.12.
|
13
|
-
#
|
14
|
-
# A Vendor ID payload contains a generic payload header (see {Payload})
|
15
|
-
# and data field (type {Types::String}):
|
16
|
-
# 1 2 3
|
17
|
-
# 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
18
|
-
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
19
|
-
# | Next Payload |C| RESERVED | Payload Length |
|
20
|
-
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
21
|
-
# | |
|
22
|
-
# ~ VendorID Data ~
|
23
|
-
# | |
|
24
|
-
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
25
|
-
#
|
26
|
-
# == Create a Vendor ID payload
|
27
|
-
# # Create a IKE packet with a Vendor ID payload
|
28
|
-
# pkt = PacketGen.gen('IP').add('UDP').add('IKE')
|
29
|
-
# pkt.add('IKE::VendorID', data: "abcdefgh")
|
30
|
-
# @author Sylvain Daubert
|
31
|
-
class VendorID < Payload
|
32
|
-
# Payload type number
|
33
|
-
PAYLOAD_TYPE = 43
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
self.add_class IKE::VendorID
|
38
|
-
end
|
39
|
-
end
|
@@ -1,20 +0,0 @@
|
|
1
|
-
# This file is part of PacketGen
|
2
|
-
# See https://github.com/sdaubert/packetgen for more informations
|
3
|
-
# Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
|
4
|
-
# This program is published under MIT license.
|
5
|
-
|
6
|
-
# frozen_string_literal: true
|
7
|
-
|
8
|
-
module PacketGen
|
9
|
-
module Header
|
10
|
-
# Module to group all NetBIOS headers
|
11
|
-
# @author Sylvain Daubert
|
12
|
-
# @since 2.5.1
|
13
|
-
module NetBIOS
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
require_relative 'netbios/name'
|
19
|
-
require_relative 'netbios/session'
|
20
|
-
require_relative 'netbios/datagram'
|
@@ -1,105 +0,0 @@
|
|
1
|
-
# This file is part of PacketGen
|
2
|
-
# See https://github.com/sdaubert/packetgen for more informations
|
3
|
-
# Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
|
4
|
-
# This program is published under MIT license.
|
5
|
-
|
6
|
-
# frozen_string_literal: true
|
7
|
-
|
8
|
-
module PacketGen
|
9
|
-
module Header
|
10
|
-
# Module to group all NetBIOS headers
|
11
|
-
# @author Sylvain Daubert
|
12
|
-
# @since 2.5.1
|
13
|
-
module NetBIOS
|
14
|
-
# NetBIOS Session Service messages.
|
15
|
-
# @author Sylvain Daubert
|
16
|
-
class Datagram < Base
|
17
|
-
# Port number for NetBIOS Session Service over TCP
|
18
|
-
UDP_PORT = 138
|
19
|
-
|
20
|
-
# Datagram packet types
|
21
|
-
TYPES = {
|
22
|
-
'direct_unique' => 0x10,
|
23
|
-
'direct_group' => 0x11,
|
24
|
-
'broadcast' => 0x12,
|
25
|
-
'error' => 0x13,
|
26
|
-
'query_request' => 0x14,
|
27
|
-
'positive_query_resp' => 0x15,
|
28
|
-
'negative_query_resp' => 0x16,
|
29
|
-
}.freeze
|
30
|
-
|
31
|
-
# @!attribute type
|
32
|
-
# 8-bit session packet type
|
33
|
-
# @return [Integer]
|
34
|
-
define_field :type, Types::Int8Enum, enum: TYPES
|
35
|
-
# @!attribute flags
|
36
|
-
# 8-bit flags
|
37
|
-
# @return [Integer]
|
38
|
-
define_field :flags, Types::Int8
|
39
|
-
# @!attribute dgm_id
|
40
|
-
# 16-bit next transaction ID for datagrams
|
41
|
-
# @return [Integer]
|
42
|
-
define_field :dgm_id, Types::Int16
|
43
|
-
# @!attribute src_ip
|
44
|
-
# Source IP address
|
45
|
-
# @return [IP::Addr]
|
46
|
-
define_field :src_ip, IP::Addr
|
47
|
-
# @!attribute src_port
|
48
|
-
# Source port
|
49
|
-
# @return [IP::Addr]
|
50
|
-
define_field :src_port, Types::Int16
|
51
|
-
# @!attribute dgm_length
|
52
|
-
# Length of data + second level of encoded names. Not present in error datagram.
|
53
|
-
# @return [Integer]
|
54
|
-
define_field :dgm_length, Types::Int16, optional: ->(h) { h.type != 0x13 }
|
55
|
-
# @!attribute packet_offset
|
56
|
-
# Not present in error datagram.
|
57
|
-
# @return [Integer]
|
58
|
-
define_field :packet_offset, Types::Int16, optional: ->(h) { h.type != 0x13 }
|
59
|
-
# @!attribute error_code
|
60
|
-
# Error code. Only present in error datagrams.
|
61
|
-
# @return [Integer]
|
62
|
-
define_field :error_code, Types::Int16, optional: ->(h) { h.type == 0x13 }
|
63
|
-
# @!attribute src_name
|
64
|
-
# NetBIOS source name. Only present in direct_unique, direct_group and broadcast datagrams.
|
65
|
-
# @return []
|
66
|
-
define_field :src_name, Name, default: '', optional: ->(h) { (h.type >= 0x10) && (h.type <= 0x12) }
|
67
|
-
# @!attribute dst_name
|
68
|
-
# NetBIOS destination name. Present in all but error datagrams.
|
69
|
-
# @return []
|
70
|
-
define_field :dst_name, Name, default: '', optional: ->(h) { h.type != 0x13 }
|
71
|
-
# @!attribute body
|
72
|
-
# User data. Ony present in direct_unique, direct_group and broadcast datagrams.
|
73
|
-
# @return [String]
|
74
|
-
define_field :body, Types::String, optional: ->(h) { (h.type >= 0x10) && (h.type <= 0x12) }
|
75
|
-
|
76
|
-
# @!attribute :rsv
|
77
|
-
# 4-bit rsv field. 4 upper bits of {#flags}
|
78
|
-
# @return [Integer]
|
79
|
-
# @!attribute :snt
|
80
|
-
# 2-bit SNT (Source end-Node Type) field from {#flags}.
|
81
|
-
# @return [Integer]
|
82
|
-
# @!attribute f
|
83
|
-
# First packet flag. If set then this is first
|
84
|
-
# (and possibly only) fragment of NetBIOS datagram.
|
85
|
-
# @return [Boolean]
|
86
|
-
# @!attribute m
|
87
|
-
# More flag. If set then more NetBIOS datagram
|
88
|
-
# fragments follow.
|
89
|
-
# @return [Boolean]
|
90
|
-
define_bit_fields_on :flags, :rsv, 4, :snt, 2, :f, :m
|
91
|
-
|
92
|
-
# Compute and set {#dgm_length} field
|
93
|
-
# @return [Integer] calculated length
|
94
|
-
def calc_length
|
95
|
-
length = self[:body].sz
|
96
|
-
length += self[:src_name].sz if present?(:src_name)
|
97
|
-
length += self[:dst_name].sz if present?(:dst_name)
|
98
|
-
self.dgm_length = length
|
99
|
-
end
|
100
|
-
end
|
101
|
-
Header.add_class Datagram
|
102
|
-
UDP.bind Datagram, dport: Datagram::UDP_PORT, sport: Datagram::UDP_PORT
|
103
|
-
end
|
104
|
-
end
|
105
|
-
end
|
@@ -1,67 +0,0 @@
|
|
1
|
-
# This file is part of PacketGen
|
2
|
-
# See https://github.com/sdaubert/packetgen for more informations
|
3
|
-
# Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
|
4
|
-
# This program is published under MIT license.
|
5
|
-
|
6
|
-
# frozen_string_literal: true
|
7
|
-
|
8
|
-
module PacketGen
|
9
|
-
module Header
|
10
|
-
# Module to group all NetBIOS headers
|
11
|
-
# @author Sylvain Daubert
|
12
|
-
# @since 2.5.1
|
13
|
-
module NetBIOS
|
14
|
-
# NetBIOS Name.
|
15
|
-
# @author Sylvain Daubert
|
16
|
-
class Name < DNS::Name
|
17
|
-
# Size, in bytes, of an encoded NetBIOS name
|
18
|
-
ENCODED_NAME_SIZE = 32
|
19
|
-
|
20
|
-
# Read a NetBIOS name from a string
|
21
|
-
# @param [String] str
|
22
|
-
# @return [Name] self
|
23
|
-
def from_human(str)
|
24
|
-
clear
|
25
|
-
return self if str.nil?
|
26
|
-
encoded_name = encode_name(str)
|
27
|
-
|
28
|
-
super(encoded_name)
|
29
|
-
end
|
30
|
-
|
31
|
-
# Get a human readable string
|
32
|
-
# @return [String]
|
33
|
-
def to_human
|
34
|
-
encoded_name = super
|
35
|
-
decode_name(encoded_name)
|
36
|
-
end
|
37
|
-
|
38
|
-
private
|
39
|
-
|
40
|
-
def encode_name(name)
|
41
|
-
basename, *scope_id = name.split('.')
|
42
|
-
basename = '' if basename.nil?
|
43
|
-
scope_id = scope_id.join('.')
|
44
|
-
encoded_name = +''
|
45
|
-
basename.each_byte do |byte|
|
46
|
-
a = (byte >> 4) + 0x41
|
47
|
-
b = (byte & 0xf) + 0x41
|
48
|
-
encoded_name << [a, b].pack('C2')
|
49
|
-
end
|
50
|
-
encoded_name << 'CA' * ((ENCODED_NAME_SIZE - encoded_name.size) / 2) if encoded_name.size < ENCODED_NAME_SIZE
|
51
|
-
encoded_name << ".#{scope_id}" if scope_id
|
52
|
-
encoded_name
|
53
|
-
end
|
54
|
-
|
55
|
-
def decode_name(encoded_name)
|
56
|
-
name = +''
|
57
|
-
encoded_name.partition('.').first.scan(/../).map do |duo|
|
58
|
-
a = (duo[0].ord - 0x41) & 0xf
|
59
|
-
b = (duo[1].ord - 0x41) & 0xf
|
60
|
-
name << (a << 4 | b).chr
|
61
|
-
end
|
62
|
-
name.strip
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|
@@ -1,64 +0,0 @@
|
|
1
|
-
# This file is part of PacketGen
|
2
|
-
# See https://github.com/sdaubert/packetgen for more informations
|
3
|
-
# Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
|
4
|
-
# This program is published under MIT license.
|
5
|
-
|
6
|
-
# frozen_string_literal: true
|
7
|
-
|
8
|
-
module PacketGen
|
9
|
-
module Header
|
10
|
-
# Module to group all NetBIOS headers
|
11
|
-
# @author Sylvain Daubert
|
12
|
-
# @since 2.5.1
|
13
|
-
module NetBIOS
|
14
|
-
# NetBIOS Session Service messages.
|
15
|
-
# @author Sylvain Daubert
|
16
|
-
class Session < Base
|
17
|
-
# Port number for NetBIOS Session Service over TCP
|
18
|
-
TCP_PORT = 139
|
19
|
-
|
20
|
-
# Session packet types
|
21
|
-
TYPES = {
|
22
|
-
'message' => 0,
|
23
|
-
'request' => 0x81,
|
24
|
-
'positive_response' => 0x82,
|
25
|
-
'negative_response' => 0x83,
|
26
|
-
'retarget_response' => 0x84,
|
27
|
-
'keep_alive' => 0x85,
|
28
|
-
}.freeze
|
29
|
-
|
30
|
-
# @!attribute type
|
31
|
-
# 8-bit session packet type
|
32
|
-
# @return [Integer]
|
33
|
-
define_field :type, Types::Int8Enum, enum: TYPES
|
34
|
-
# @!attribute length
|
35
|
-
# 17-bit session packet length
|
36
|
-
# @return [Integer]
|
37
|
-
define_field :length, Types::Int24
|
38
|
-
# @!attribute body
|
39
|
-
# @return [String]
|
40
|
-
define_field :body, Types::String
|
41
|
-
|
42
|
-
# Compute and set {#length} field
|
43
|
-
# @return [Integer] calculated length
|
44
|
-
def calc_length
|
45
|
-
Base.calculate_and_set_length(self, header_in_size: false)
|
46
|
-
end
|
47
|
-
|
48
|
-
# @api private
|
49
|
-
# @note This method is used internally by PacketGen and should not be
|
50
|
-
# directly called
|
51
|
-
# @since 2.7.0 Set TCP sport according to bindings, only if sport is 0.
|
52
|
-
# Needed by new bind API.
|
53
|
-
def added_to_packet(packet)
|
54
|
-
return unless packet.is? 'TCP'
|
55
|
-
return unless packet.tcp.sport.zero?
|
56
|
-
packet.tcp.sport = TCP_PORT
|
57
|
-
end
|
58
|
-
end
|
59
|
-
Header.add_class Session
|
60
|
-
TCP.bind Session, dport: Session::TCP_PORT
|
61
|
-
TCP.bind Session, sport: Session::TCP_PORT
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|