packetgen 2.5.0 → 2.5.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +0 -9
- data/lib/packetgen/config.rb +9 -22
- data/lib/packetgen/header.rb +1 -0
- data/lib/packetgen/header/base.rb +6 -1
- data/lib/packetgen/header/ike/auth.rb +1 -1
- data/lib/packetgen/header/ike/notify.rb +1 -2
- data/lib/packetgen/header/ike/sa.rb +3 -6
- data/lib/packetgen/header/netbios.rb +51 -0
- data/lib/packetgen/packet.rb +1 -1
- data/lib/packetgen/version.rb +1 -1
- data/packetgen.gemspec +1 -1
- metadata +8 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1db3896f30ec86544f468386feb20fcc301e39d5451383543e2ccabb7ca33585
|
4
|
+
data.tar.gz: 21e62d53f3915d9d19fbcf2475e4c9fd60dfe58c1427b7bd65ead51a298141ac
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f5dbe26467d9000d411a810e3a4165e842064a1ad4550b407013ef0b6dee98903a840ad228831a3b292c43d1c5d78e7a418d419eea777d00cab4f411d7d1e5dc
|
7
|
+
data.tar.gz: 66986fab978377b8cf10a1b9a48b2f7d4d4344cec74339db371e690bcd0c98c931699c41812f24998cf403c775feae2b4f53a99082daaced371244de332d7ce4
|
data/.travis.yml
CHANGED
@@ -6,15 +6,6 @@ rvm:
|
|
6
6
|
- 2.4
|
7
7
|
- 2.5
|
8
8
|
|
9
|
-
matrix:
|
10
|
-
# allow 2.5 to fail until Travis CI is fixed.
|
11
|
-
# See travis-ci/travis-ci#8969
|
12
|
-
allow_failures:
|
13
|
-
- rvm: 2.5
|
14
|
-
|
15
|
-
before_install:
|
16
|
-
# work around https://github.com/travis-ci/travis-ci/issues/8969
|
17
|
-
- travis_retry gem update --system
|
18
9
|
install:
|
19
10
|
- sudo apt-get update -qq
|
20
11
|
- sudo apt-get install libpcap-dev -qq
|
data/lib/packetgen/config.rb
CHANGED
@@ -6,7 +6,7 @@
|
|
6
6
|
# frozen_string_literal: true
|
7
7
|
require 'socket'
|
8
8
|
require 'singleton'
|
9
|
-
require '
|
9
|
+
require 'interfacez'
|
10
10
|
|
11
11
|
module PacketGen
|
12
12
|
|
@@ -23,47 +23,34 @@ module PacketGen
|
|
23
23
|
attr_reader :default_iface
|
24
24
|
|
25
25
|
def initialize
|
26
|
-
|
27
|
-
default_iface = Pcap.lookupdev
|
28
|
-
rescue PCAPRUB::BindingError
|
29
|
-
default_iface = NetworkInterface.interfaces.select { |i| i =~ /lo/ }.first
|
30
|
-
end
|
31
|
-
@default_iface = default_iface
|
26
|
+
@default_iface = Interfacez.default || Interfacez.loopback
|
32
27
|
@hwaddr = {}
|
33
28
|
@ipaddr = {}
|
34
29
|
@ip6addr = {}
|
35
30
|
|
36
|
-
|
37
|
-
|
38
|
-
@
|
39
|
-
|
40
|
-
addresses[Socket::AF_LINK][0]['addr'] if addresses[Socket::AF_LINK]
|
41
|
-
else
|
42
|
-
addresses[Socket::AF_PACKET][0]['addr'] if addresses[Socket::AF_PACKET]
|
43
|
-
end
|
44
|
-
@ipaddr[iface] = addresses[Socket::AF_INET][0]['addr'] if addresses[Socket::AF_INET]
|
45
|
-
if addresses[Socket::AF_INET6]
|
46
|
-
@ip6addr[iface] = addresses[Socket::AF_INET6].map { |hsh| hsh['addr'] }
|
47
|
-
end
|
31
|
+
Interfacez.all do |iface_name|
|
32
|
+
@hwaddr[iface_name] = Interfacez.mac_address_of(iface_name)
|
33
|
+
@ipaddr[iface_name] = Interfacez.ipv4_address_of(iface_name)
|
34
|
+
@ip6addr[iface_name] = Interfacez.ipv6_addresses_of(iface_name)
|
48
35
|
end
|
49
36
|
end
|
50
37
|
|
51
38
|
# Get MAC address for given network interface
|
52
|
-
# @param [String,nil] iface network interface.
|
39
|
+
# @param [String,nil] iface network interface. If +nil+, use default one.
|
53
40
|
# @return [String]
|
54
41
|
def hwaddr(iface=nil)
|
55
42
|
@hwaddr[iface || @default_iface]
|
56
43
|
end
|
57
44
|
|
58
45
|
# Get IP address for given network interface
|
59
|
-
# @param [String,nil] iface network interface.
|
46
|
+
# @param [String,nil] iface network interface. If +nil+, use default one.
|
60
47
|
# @return [String]
|
61
48
|
def ipaddr(iface=nil)
|
62
49
|
@ipaddr[iface || @default_iface]
|
63
50
|
end
|
64
51
|
|
65
52
|
# Get IPv6 addresses for given network interface
|
66
|
-
# @param [String,nil] iface network interface.
|
53
|
+
# @param [String,nil] iface network interface. If +nil+, use default one.
|
67
54
|
# @return [Array<String>]
|
68
55
|
def ip6addr(iface=nil)
|
69
56
|
@ip6addr[iface || @default_iface]
|
data/lib/packetgen/header.rb
CHANGED
@@ -151,7 +151,8 @@ module PacketGen
|
|
151
151
|
# Header1.bind_header Header3, field1: 43, field2: 43
|
152
152
|
# Header1.bind_header Header4, op: :and, field1: 43, field2: 43
|
153
153
|
# Header1.bind_header Header5, field1: ->(v) { v.nil? ? 128 : v > 127 }
|
154
|
-
# Header1.bind_header Header6,
|
154
|
+
# Header1.bind_header Header6, procs: [->(hdr) { hdr.field1 = 1 }
|
155
|
+
# ->(hdr) { hdr.field1 == 1 && hdr.body[0..1] == "\x00\x00" }]
|
155
156
|
# @param [Class] header_klass header class to bind to current class
|
156
157
|
# @param [Hash] args current class fields and their value when +header_klass+
|
157
158
|
# is embedded in current class. Given value may be a lambda, whose alone argument
|
@@ -162,6 +163,10 @@ module PacketGen
|
|
162
163
|
# operation on this binding. By default, +:op+ is +:or+ (at least one binding
|
163
164
|
# must match to parse it). It also may be set to +:and+ (all bindings must match
|
164
165
|
# to parse it).
|
166
|
+
#
|
167
|
+
# Special key +procs+ may be used to set 2 lambdas, the former to set
|
168
|
+
# fields, the former to check bindings. This may be used when multiple and
|
169
|
+
# non-trivial checks should be made.
|
165
170
|
# @return [void]
|
166
171
|
def self.bind_header(header_klass, args={})
|
167
172
|
op = args.delete(:op) || :or
|
@@ -138,7 +138,7 @@ module PacketGen
|
|
138
138
|
Transform::PRF_HMAC_SHA2_256, Transform::PRF_HMAC_SHA2_384,
|
139
139
|
Transform::PRF_HMAC_SHA2_512
|
140
140
|
digestname = Transform.constants.grep(/PRF_/).
|
141
|
-
|
141
|
+
detect { |c| Transform.const_get(c) == type }.
|
142
142
|
to_s.sub(/^PRF_HMAC_/, '').sub(/2_/, '')
|
143
143
|
digest = OpenSSL::Digest.const_get(digestname).new
|
144
144
|
else
|
@@ -149,8 +149,7 @@ module PacketGen
|
|
149
149
|
# @return [String]
|
150
150
|
def human_protocol
|
151
151
|
name = IKE.constants.grep(/PROTO/).
|
152
|
-
|
153
|
-
first || "proto #{protocol}"
|
152
|
+
detect { |c| IKE.const_get(c) == protocol } || "proto #{protocol}"
|
154
153
|
name.to_s.sub(/PROTO_/, '')
|
155
154
|
end
|
156
155
|
|
@@ -83,8 +83,7 @@ module PacketGen
|
|
83
83
|
# @return [String]
|
84
84
|
def to_human
|
85
85
|
name = self.class.constants.grep(/TYPE_/).
|
86
|
-
|
87
|
-
first || "attr[#{type & 0x7fff}]"
|
86
|
+
detect { |c| self.class.const_get(c) == (type & 0x7fff) } || "attr[#{type & 0x7fff}]"
|
88
87
|
name = name.to_s.sub(/TYPE_/, '')
|
89
88
|
"#{name}=#{value}"
|
90
89
|
end
|
@@ -300,8 +299,7 @@ module PacketGen
|
|
300
299
|
# @return [String]
|
301
300
|
def human_id
|
302
301
|
name = self.class.constants.grep(/#{human_type}_/).
|
303
|
-
|
304
|
-
first || "ID=#{id}"
|
302
|
+
detect { |c| self.class.const_get(c) == id } || "ID=#{id}"
|
305
303
|
name.to_s.sub(/#{human_type}_/, '')
|
306
304
|
end
|
307
305
|
|
@@ -470,8 +468,7 @@ module PacketGen
|
|
470
468
|
# @return [String]
|
471
469
|
def human_protocol
|
472
470
|
name = IKE.constants.grep(/PROTO/).
|
473
|
-
|
474
|
-
first || "proto #{protocol}"
|
471
|
+
detect { |c| IKE.const_get(c) == protocol } || "proto #{protocol}"
|
475
472
|
name.to_s.sub(/PROTO_/, '')
|
476
473
|
end
|
477
474
|
|
@@ -0,0 +1,51 @@
|
|
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
|
+
module NetBIOS
|
13
|
+
# NetBIOS Session Service messages.
|
14
|
+
# @author Sylvain Daubert
|
15
|
+
class Session < Base
|
16
|
+
# Port number for NetBIOS Session Service over TCP
|
17
|
+
TCP_PORT = 139
|
18
|
+
|
19
|
+
# Session packet types
|
20
|
+
TYPES = {
|
21
|
+
'message' => 0,
|
22
|
+
'request' => 0x81,
|
23
|
+
'positive_response' => 0x82,
|
24
|
+
'negative_response' => 0x83,
|
25
|
+
'retarget_response' => 0x84,
|
26
|
+
'keep_alive' => 0x85,
|
27
|
+
}
|
28
|
+
|
29
|
+
# @!attribute type
|
30
|
+
# 8-bit session packet type
|
31
|
+
# @return [Integer]
|
32
|
+
define_field :type, Types::Int8Enum, enum: TYPES
|
33
|
+
# @!attribute length
|
34
|
+
# 17-bit session packet length
|
35
|
+
# @return [Integer]
|
36
|
+
define_field :length, Types::Int24
|
37
|
+
# @!attribute body
|
38
|
+
# @return [String]
|
39
|
+
define_field :body, Types::String
|
40
|
+
|
41
|
+
# Compute and set {#length} field
|
42
|
+
# @return [Integer] calculated length
|
43
|
+
def calc_length
|
44
|
+
Base.calculate_and_set_length(self, header_in_size: false)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
self.add_class NetBIOS::Session
|
49
|
+
TCP.bind_header NetBIOS::Session, sport: NetBIOS::Session::TCP_PORT, dport: NetBIOS::Session::TCP_PORT
|
50
|
+
end
|
51
|
+
end
|
data/lib/packetgen/packet.rb
CHANGED
@@ -179,7 +179,7 @@ module PacketGen
|
|
179
179
|
# Recalculate all packet checksums
|
180
180
|
# @return [void]
|
181
181
|
def calc_checksum
|
182
|
-
@headers.
|
182
|
+
@headers.reverse_each do |header|
|
183
183
|
header.calc_checksum if header.respond_to? :calc_checksum
|
184
184
|
end
|
185
185
|
end
|
data/lib/packetgen/version.rb
CHANGED
data/packetgen.gemspec
CHANGED
@@ -24,7 +24,7 @@ Gem::Specification.new do |spec|
|
|
24
24
|
spec.required_ruby_version = '>= 2.2.0'
|
25
25
|
|
26
26
|
spec.add_dependency 'pcaprub', '~>0.12.4'
|
27
|
-
spec.add_dependency '
|
27
|
+
spec.add_dependency 'interfacez', '~>1.0'
|
28
28
|
spec.add_dependency 'rasn1', '~>0.5', '>= 0.6.0'
|
29
29
|
|
30
30
|
spec.add_development_dependency 'bundler', '~> 1.7'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: packetgen
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.5.
|
4
|
+
version: 2.5.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sylvain Daubert
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-06-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: pcaprub
|
@@ -25,19 +25,19 @@ dependencies:
|
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 0.12.4
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: interfacez
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '0'
|
33
|
+
version: '1.0'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '0'
|
40
|
+
version: '1.0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rasn1
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -222,6 +222,7 @@ files:
|
|
222
222
|
- lib/packetgen/header/mldv2/mcast_address_record.rb
|
223
223
|
- lib/packetgen/header/mldv2/mlq.rb
|
224
224
|
- lib/packetgen/header/mldv2/mlr.rb
|
225
|
+
- lib/packetgen/header/netbios.rb
|
225
226
|
- lib/packetgen/header/ospfv2.rb
|
226
227
|
- lib/packetgen/header/ospfv2/db_description.rb
|
227
228
|
- lib/packetgen/header/ospfv2/hello.rb
|