packetgen 2.8.7 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
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