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