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.
Files changed (89) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +0 -1
  3. data/README.md +5 -4
  4. data/lib/packetgen.rb +6 -12
  5. data/lib/packetgen/capture.rb +43 -39
  6. data/lib/packetgen/config.rb +0 -1
  7. data/lib/packetgen/deprecation.rb +1 -1
  8. data/lib/packetgen/header.rb +9 -9
  9. data/lib/packetgen/header/asn1_base.rb +10 -10
  10. data/lib/packetgen/header/base.rb +42 -101
  11. data/lib/packetgen/header/dhcp/option.rb +5 -11
  12. data/lib/packetgen/header/dhcpv6/duid.rb +2 -0
  13. data/lib/packetgen/header/dhcpv6/option.rb +2 -19
  14. data/lib/packetgen/header/dhcpv6/options.rb +7 -0
  15. data/lib/packetgen/header/dns.rb +5 -23
  16. data/lib/packetgen/header/dns/name.rb +1 -0
  17. data/lib/packetgen/header/dns/qdsection.rb +1 -0
  18. data/lib/packetgen/header/dns/question.rb +3 -7
  19. data/lib/packetgen/header/dns/rr.rb +3 -0
  20. data/lib/packetgen/header/dns/rrsection.rb +1 -0
  21. data/lib/packetgen/header/dot11.rb +1 -17
  22. data/lib/packetgen/header/dot1x.rb +1 -0
  23. data/lib/packetgen/header/eap.rb +4 -7
  24. data/lib/packetgen/header/eth.rb +2 -0
  25. data/lib/packetgen/header/http/headers.rb +3 -0
  26. data/lib/packetgen/header/http/request.rb +5 -4
  27. data/lib/packetgen/header/http/response.rb +5 -4
  28. data/lib/packetgen/header/icmp.rb +6 -0
  29. data/lib/packetgen/header/icmpv6.rb +6 -0
  30. data/lib/packetgen/header/igmpv3/mq.rb +2 -0
  31. data/lib/packetgen/header/ip.rb +32 -30
  32. data/lib/packetgen/header/ip/addr.rb +1 -0
  33. data/lib/packetgen/header/ip/option.rb +23 -20
  34. data/lib/packetgen/header/ip/options.rb +11 -24
  35. data/lib/packetgen/header/ipv6.rb +45 -34
  36. data/lib/packetgen/header/ipv6/addr.rb +2 -0
  37. data/lib/packetgen/header/ipv6/hop_by_hop.rb +7 -31
  38. data/lib/packetgen/header/mdns.rb +1 -0
  39. data/lib/packetgen/header/mldv2/mlq.rb +2 -0
  40. data/lib/packetgen/header/ospfv2/lsa.rb +15 -25
  41. data/lib/packetgen/header/ospfv3/ipv6_prefix.rb +1 -1
  42. data/lib/packetgen/header/ospfv3/lsa.rb +8 -25
  43. data/lib/packetgen/header/snmp.rb +2 -0
  44. data/lib/packetgen/header/tcp.rb +23 -2
  45. data/lib/packetgen/header/tcp/option.rb +51 -52
  46. data/lib/packetgen/header/tcp/options.rb +17 -52
  47. data/lib/packetgen/header/tftp.rb +3 -0
  48. data/lib/packetgen/header/udp.rb +8 -0
  49. data/lib/packetgen/packet.rb +119 -102
  50. data/lib/packetgen/pcapng/block.rb +4 -10
  51. data/lib/packetgen/pcapng/epb.rb +4 -4
  52. data/lib/packetgen/pcapng/file.rb +7 -3
  53. data/lib/packetgen/pcapng/idb.rb +2 -2
  54. data/lib/packetgen/pcapng/shb.rb +3 -3
  55. data/lib/packetgen/pcapng/spb.rb +1 -8
  56. data/lib/packetgen/pcapng/unknown_block.rb +0 -7
  57. data/lib/packetgen/types.rb +1 -0
  58. data/lib/packetgen/types/array.rb +73 -71
  59. data/lib/packetgen/types/cstring.rb +1 -1
  60. data/lib/packetgen/types/enum.rb +3 -3
  61. data/lib/packetgen/types/fields.rb +66 -106
  62. data/lib/packetgen/types/int.rb +9 -5
  63. data/lib/packetgen/types/length_from.rb +45 -0
  64. data/lib/packetgen/types/oui.rb +2 -0
  65. data/lib/packetgen/types/string.rb +10 -16
  66. data/lib/packetgen/types/tlv.rb +7 -15
  67. data/lib/packetgen/utils.rb +8 -8
  68. data/lib/packetgen/utils/arp_spoofer.rb +1 -2
  69. data/lib/packetgen/version.rb +1 -1
  70. metadata +3 -21
  71. data/lib/packetgen/header/crypto.rb +0 -62
  72. data/lib/packetgen/header/esp.rb +0 -413
  73. data/lib/packetgen/header/ike.rb +0 -243
  74. data/lib/packetgen/header/ike/auth.rb +0 -165
  75. data/lib/packetgen/header/ike/cert.rb +0 -76
  76. data/lib/packetgen/header/ike/certreq.rb +0 -66
  77. data/lib/packetgen/header/ike/id.rb +0 -99
  78. data/lib/packetgen/header/ike/ke.rb +0 -79
  79. data/lib/packetgen/header/ike/nonce.rb +0 -40
  80. data/lib/packetgen/header/ike/notify.rb +0 -176
  81. data/lib/packetgen/header/ike/payload.rb +0 -315
  82. data/lib/packetgen/header/ike/sa.rb +0 -561
  83. data/lib/packetgen/header/ike/sk.rb +0 -261
  84. data/lib/packetgen/header/ike/ts.rb +0 -270
  85. data/lib/packetgen/header/ike/vendor_id.rb +0 -39
  86. data/lib/packetgen/header/netbios.rb +0 -20
  87. data/lib/packetgen/header/netbios/datagram.rb +0 -105
  88. data/lib/packetgen/header/netbios/name.rb +0 -67
  89. 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