packetgen-plugin-smb 0.6.1 → 0.6.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/specs.yml +28 -0
  3. data/.rubocop.yml +6 -0
  4. data/Gemfile +15 -0
  5. data/README.md +50 -12
  6. data/Rakefile +10 -4
  7. data/lib/packetgen-plugin-smb.rb +2 -2
  8. data/lib/packetgen/plugin/gssapi.rb +4 -2
  9. data/lib/packetgen/plugin/llmnr.rb +4 -4
  10. data/lib/packetgen/plugin/netbios.rb +2 -0
  11. data/lib/packetgen/plugin/netbios/datagram.rb +3 -3
  12. data/lib/packetgen/plugin/netbios/name.rb +4 -4
  13. data/lib/packetgen/plugin/netbios/session.rb +5 -5
  14. data/lib/packetgen/plugin/ntlm.rb +3 -3
  15. data/lib/packetgen/plugin/ntlm/authenticate.rb +2 -2
  16. data/lib/packetgen/plugin/ntlm/av_pair.rb +3 -5
  17. data/lib/packetgen/plugin/ntlm/challenge.rb +2 -2
  18. data/lib/packetgen/plugin/ntlm/negotiate.rb +2 -2
  19. data/lib/packetgen/plugin/ntlm/ntlmv2_response.rb +2 -2
  20. data/lib/packetgen/plugin/smb.rb +12 -12
  21. data/lib/packetgen/plugin/smb/blocks.rb +2 -2
  22. data/lib/packetgen/plugin/smb/browser.rb +2 -2
  23. data/lib/packetgen/plugin/smb/browser/domain_announcement.rb +2 -2
  24. data/lib/packetgen/plugin/smb/browser/host_announcement.rb +2 -2
  25. data/lib/packetgen/plugin/smb/browser/local_master_announcement.rb +2 -2
  26. data/lib/packetgen/plugin/smb/close.rb +2 -2
  27. data/lib/packetgen/plugin/smb/close/request.rb +2 -2
  28. data/lib/packetgen/plugin/smb/close/response.rb +2 -2
  29. data/lib/packetgen/plugin/smb/filetime.rb +4 -2
  30. data/lib/packetgen/plugin/smb/negotiate.rb +2 -2
  31. data/lib/packetgen/plugin/smb/negotiate/dialect.rb +7 -0
  32. data/lib/packetgen/plugin/smb/negotiate/request.rb +7 -0
  33. data/lib/packetgen/plugin/smb/negotiate/response.rb +8 -2
  34. data/lib/packetgen/plugin/smb/nt_create_and_x.rb +2 -2
  35. data/lib/packetgen/plugin/smb/ntcreateandx/request.rb +4 -4
  36. data/lib/packetgen/plugin/smb/ntcreateandx/response.rb +2 -2
  37. data/lib/packetgen/plugin/smb/string.rb +40 -28
  38. data/lib/packetgen/plugin/smb/trans.rb +2 -2
  39. data/lib/packetgen/plugin/smb/trans/request.rb +3 -3
  40. data/lib/packetgen/plugin/smb/trans/response.rb +2 -2
  41. data/lib/packetgen/plugin/smb2.rb +3 -3
  42. data/lib/packetgen/plugin/smb2/base.rb +3 -3
  43. data/lib/packetgen/plugin/smb2/error.rb +3 -4
  44. data/lib/packetgen/plugin/smb2/guid.rb +4 -3
  45. data/lib/packetgen/plugin/smb2/negotiate.rb +2 -2
  46. data/lib/packetgen/plugin/smb2/negotiate/context.rb +3 -3
  47. data/lib/packetgen/plugin/smb2/negotiate/request.rb +3 -5
  48. data/lib/packetgen/plugin/smb2/negotiate/response.rb +4 -6
  49. data/lib/packetgen/plugin/smb2/session_setup.rb +2 -2
  50. data/lib/packetgen/plugin/smb2/session_setup/request.rb +4 -4
  51. data/lib/packetgen/plugin/smb2/session_setup/response.rb +5 -5
  52. data/lib/packetgen/plugin/smb_version.rb +3 -1
  53. data/packetgen-plugin-smb.gemspec +4 -11
  54. metadata +6 -82
  55. data/.travis.yml +0 -12
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: aa4ced67494f74b0d29b87e1f37e872ae96d39362317aeb9b5ae5a61d780ba0d
4
- data.tar.gz: bbb29b0fae6de210a9c36aef771566b741c59ae633271d32704e78db49f66077
3
+ metadata.gz: 4b63382e5580528b23ba059cd370db53203efec6cd6273388f88b15976b9343d
4
+ data.tar.gz: 425f63395bdc0c38e1288f0690fd8cc51c944645b5fc017e2c6289ba9c54b78d
5
5
  SHA512:
6
- metadata.gz: e418ab51abca304c9d735feb636222581dbacd86a76eb7aa2060755bc2ed975e9b9d598f72c445c087e9b614289d6dc54bfcba3aa5e429a483f4b6255a79f953
7
- data.tar.gz: baf6dacfb460e6d0365e7398e4d1ec119bce98a5efebd5147f75587ea286974e6d57c64fb778982dba5e1a07c4ce0c0ed187d20b1416a4d1ebbdd5f6de81ed93
6
+ metadata.gz: '08a4a6e817ff3ae8c7c341c6af64722fcdf09331767627adf04c36a6f442dcc6ea7dfb21cd76f2ec3c1f9818b5b3e565806b5391d041130c189de9fc89eacaf6'
7
+ data.tar.gz: b537ad94930b18a5ab93a219a66090384c84f0cfae44426b42304732c0f31e41c9903e9cf8eb41778e82661eb5803d33cdca640104b7a0e5db37df2497320af9
@@ -0,0 +1,28 @@
1
+ name: Specs
2
+ on:
3
+ push:
4
+ branches: [ master ]
5
+ pull_request:
6
+ branches: [ master ]
7
+ jobs:
8
+ test:
9
+ strategy:
10
+ fail-fast: false
11
+ matrix:
12
+ os: [ubuntu-latest]
13
+ ruby: [2.4, 2.5, 2.6, 2.7]
14
+ runs-on: ${{ matrix.os }}
15
+ steps:
16
+ - uses: actions/checkout@v2
17
+ - name: Install dependencies
18
+ run: sudo apt-get update -qq && sudo apt-get install libpcap-dev -qq
19
+ - name: Set up Ruby
20
+ uses: ruby/setup-ruby@v1
21
+ with:
22
+ ruby-version: ${{ matrix.ruby }}
23
+ - name: Run tests
24
+ run: |
25
+ bundle config set path 'vendor/bundle'
26
+ bundle config set --local without noci
27
+ bundle install
28
+ bundle exec rake
@@ -1,3 +1,7 @@
1
+ require:
2
+ - rubocop-performance
3
+ Layout/LineLength:
4
+ Max: 150
1
5
  Layout/SpaceAroundEqualsInParameterDefault:
2
6
  EnforcedStyle: no_space
3
7
  Lint/EmptyWhen:
@@ -6,6 +10,8 @@ Lint/Void:
6
10
  Enabled: false
7
11
  Metrics:
8
12
  Enabled: false
13
+ Style/AccessModifierDeclarations:
14
+ Enabled: false
9
15
  Style/AsciiComments:
10
16
  Enabled: false
11
17
  Style/ClassAndModuleChildren:
data/Gemfile CHANGED
@@ -1,3 +1,18 @@
1
+ # frozen_string_literal: true
2
+
1
3
  source 'https://rubygems.org'
2
4
 
3
5
  gemspec
6
+
7
+ gem 'bundler', '>=1.17', '<3'
8
+ gem 'rake', '~> 12.3'
9
+ gem 'rspec', '~> 3.10'
10
+
11
+ group :noci do
12
+ gem 'debase', '~>0.2'
13
+ gem 'rubocop', '~> 1.6.0'
14
+ gem 'rubocop-performance', '~> 1.9'
15
+ gem 'ruby-debug-ide', '~> 0.7'
16
+ gem 'simplecov', '~> 0.18'
17
+ gem 'yard', '~> 0.9'
18
+ end
data/README.md CHANGED
@@ -1,23 +1,26 @@
1
1
  [![Gem Version](https://badge.fury.io/rb/packetgen-plugin-smb.svg)](https://badge.fury.io/rb/packetgen-plugin-smb)
2
- [![Build Status](https://travis-ci.com/sdaubert/packetgen-plugin-smb.svg?branch=master)](https://travis-ci.com/sdaubert/packetgen-plugin-smb)
3
2
 
4
3
  # Packetgen::Plugin::SMB
5
4
 
6
5
  This is a plugin for [PacketGen gem](https://github.com/sdaubert/packetgen). It adds some support for SMB protocol suite:
7
6
 
7
+ * NetBIOS:
8
+ * Datagram service,
9
+ * Session service,
8
10
  * SMB:
9
- * SMB common header,
10
- * Close command,
11
- * NtCreateAndX command,
12
- * Trans command,
13
- * Browser subprotocol,
11
+ * SMB common header,
12
+ * Negotiate command,
13
+ * Close command,
14
+ * NtCreateAndX command,
15
+ * Trans command,
16
+ * Browser subprotocol,
14
17
  * SMB2:
15
- * SMB2 common header (support 2.x and 3.x dialects),
16
- * Negotiate command,
17
- * SessionSetup command,
18
+ * SMB2 common header (support 2.x and 3.x dialects),
19
+ * Negotiate command,
20
+ * SessionSetup command,
18
21
  * GSSAPI, used to transport negotiation over SMB2 commands,
19
- * NTLM, SMB authentication protocol.
20
-
22
+ * NTLM, SMB authentication protocol,
23
+ * LLMNR (_Link-Local Multicast Name Resolution_), resolution protocol used in SMB networks.
21
24
 
22
25
  ## Installation
23
26
 
@@ -37,7 +40,42 @@ Or install it yourself as:
37
40
 
38
41
  ## Usage
39
42
 
40
- TODO
43
+ ### SMB2 with NTLM negociation
44
+
45
+ See [examples/smb-responder](/examples/smb-responder).
46
+
47
+ ### LLMNR
48
+
49
+ LLMNR is a multicast protocol. Unless you want to have a fine control on UDP layer, the simplest way is to use it over a UDP ruby socket:
50
+
51
+ ```ruby
52
+ require 'socket'
53
+ require 'packetgen'
54
+ require 'packetgen-plugin-smb'
55
+
56
+ LLMNR_MCAST_ADDR = '224.0.0.252'
57
+ LOCAL_IPADDR = 'x.x.x.x' # your IP
58
+
59
+ # Open a UDP socket
60
+ socket = UDPSocket.new
61
+ # Bind it to receive LLMNR response packets
62
+ socket.bind(LOCAL_IPADDR, 0)
63
+
64
+ # Send a LLMNR query
65
+ query = PacketGen.gen('LLMNR', id: 0x1234, opcode: 'query')
66
+ query.llmnr.qd << { rtype: 'Question', name: 'example.local' }
67
+ socket.send(query.to_s, 0, LLMNR_MCAST_ADDR, PacketGen::Plugin::LLMNR::UDP_PORT)
68
+
69
+ # Get answer
70
+ # data = socket.recv(1024)
71
+ data, peer = socket.recvfrom(1024)
72
+ answer = PacketGen.parse(data, first_header: 'LLMNR')
73
+ example_local_ip = answer.llmnr.an.to_a
74
+ .find { |an| an.is_a?(PacketGen::Header::DNS::RR) }.human_rdata
75
+ puts example_local_ip
76
+ ```
77
+
78
+ You have to manage multicast if you want to make a LLMNR responder. For further details, see [examples/llmnr-responder](/examples/llmnr-responder).
41
79
 
42
80
  ## See also
43
81
 
data/Rakefile CHANGED
@@ -1,13 +1,19 @@
1
+ # frozen_string_literal: true
1
2
 
2
3
  require 'bundler/gem_tasks'
3
4
  require 'rspec/core/rake_task'
4
- require 'yard'
5
5
 
6
6
  task default: :spec
7
7
 
8
8
  RSpec::Core::RakeTask.new
9
9
 
10
- YARD::Rake::YardocTask.new do |t|
11
- t.options = ['--no-private']
12
- t.files = ['lib/**/*.rb', '-', 'LICENSE']
10
+ begin
11
+ require 'yard'
12
+
13
+ YARD::Rake::YardocTask.new do |t|
14
+ t.options = ['--no-private']
15
+ t.files = ['lib/**/*.rb', '-', 'LICENSE']
16
+ end
17
+ rescue LoadError
18
+ # no yard, so no yard task
13
19
  end
@@ -1,10 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # This file is part of packetgen-plugin-smb.
2
4
  # See https://github.com/sdaubert/packetgen-plugin-smb for more informations
3
5
  # Copyright (C) 2018 Sylvain Daubert <sylvain.daubert@laposte.net>
4
6
  # This program is published under MIT license.
5
7
 
6
- # frozen_string_literal: true
7
-
8
8
  require 'packetgen'
9
9
  require_relative 'packetgen/plugin/smb_version'
10
10
  require_relative 'packetgen/plugin/gssapi'
@@ -1,10 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # This file is part of packetgen-plugin-smb.
2
4
  # See https://github.com/sdaubert/packetgen-plugin-smb for more informations
3
5
  # Copyright (C) 2018 Sylvain Daubert <sylvain.daubert@laposte.net>
4
6
  # This program is published under MIT license.
5
7
 
6
- # frozen_string_literal: true
7
-
8
8
  require 'rasn1'
9
9
 
10
10
  module PacketGen::Plugin
@@ -113,6 +113,8 @@ module PacketGen::Plugin
113
113
  # @param [String] str
114
114
  # @return [self]
115
115
  def read(str)
116
+ return self if str.nil?
117
+
116
118
  parse!(str, ber: true)
117
119
  self
118
120
  end
@@ -1,10 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # This file is part of packetgen-plugin-smb.
2
4
  # See https://github.com/sdaubert/packetgen-plugin-smb for more informations
3
5
  # Copyright (C) 2018 Sylvain Daubert <sylvain.daubert@laposte.net>
4
6
  # This program is published under MIT license.
5
7
 
6
- # frozen_string_literal: true
7
-
8
8
  module PacketGen::Plugin
9
9
  # Link-Local Multicast Name Resolution (LLMNR) header ({https://tools.ietf.org/html/rfc4795 RFC 4795}).
10
10
  # @author Sylvain Daubert
@@ -43,13 +43,13 @@ module PacketGen::Plugin
43
43
  ip.dst = dst unless dst.nil?
44
44
  ip.ttl = 1 if ip[:dst].mcast?
45
45
 
46
- # rubocop:disable Lint/HandleExceptions
46
+ # rubocop:disable Lint/SuppressedException
47
47
  begin
48
48
  llh = ll_header(self)
49
49
  llh.dst = MAC_IPV4_MCAST if ip[:dst].mcast?
50
50
  rescue PacketGen::FormatError
51
51
  end
52
- # rubocop:enable Lint/HandleExceptions
52
+ # rubocop:enable Lint/SuppressedException
53
53
  end
54
54
  end
55
55
  PacketGen::Header.add_class LLMNR
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # This file is part of PacketGen
2
4
  # See https://github.com/sdaubert/packetgen-plugin-smb for more informations
3
5
  # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
@@ -1,15 +1,15 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # This file is part of PacketGen
2
4
  # See https://github.com/sdaubert/packetgen-plugin-smb for more informations
3
5
  # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
4
6
  # This program is published under MIT license.
5
7
 
6
- # frozen_string_literal: true
7
-
8
8
  module PacketGen::Plugin
9
9
  # Module to group all NetBIOS headers
10
10
  # @author Sylvain Daubert
11
11
  module NetBIOS
12
- # NetBIOS Session Service messages.
12
+ # NetBIOS Datagram Service messages.
13
13
  # @author Sylvain Daubert
14
14
  class Datagram < PacketGen::Header::Base
15
15
  # Give protocol name
@@ -1,13 +1,13 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # This file is part of PacketGen
2
4
  # See https://github.com/sdaubert/packetgen-plugin-smb for more informations
3
5
  # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
4
6
  # This program is published under MIT license.
5
7
 
6
- # frozen_string_literal: true
7
-
8
8
  module PacketGen::Plugin
9
- # Module to group all NetBIOS headers
10
- # @author Sylvain Daubert
9
+ # Module to group all NetBIOS headers
10
+ # @author Sylvain Daubert
11
11
  module NetBIOS
12
12
  # NetBIOS Name.
13
13
  # @author Sylvain Daubert
@@ -1,10 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # This file is part of PacketGen
2
4
  # See https://github.com/sdaubert/packetgen-plugin-smb for more informations
3
5
  # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
4
6
  # This program is published under MIT license.
5
7
 
6
- # frozen_string_literal: true
7
-
8
8
  module PacketGen::Plugin
9
9
  # Module to group all NetBIOS headers
10
10
  # @author Sylvain Daubert
@@ -25,12 +25,12 @@ module PacketGen::Plugin
25
25
 
26
26
  # Session packet types
27
27
  TYPES = {
28
- 'message' => 0,
29
- 'request' => 0x81,
28
+ 'message' => 0,
29
+ 'request' => 0x81,
30
30
  'positive_response' => 0x82,
31
31
  'negative_response' => 0x83,
32
32
  'retarget_response' => 0x84,
33
- 'keep_alive' => 0x85,
33
+ 'keep_alive' => 0x85,
34
34
  }.freeze
35
35
 
36
36
  # @!attribute type
@@ -1,10 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # This file is part of packetgen-plugin-smb.
2
4
  # See https://github.com/sdaubert/packetgen-plugin-smb for more informations
3
5
  # Copyright (C) 2018 Sylvain Daubert <sylvain.daubert@laposte.net>
4
6
  # This program is published under MIT license.
5
7
 
6
- # frozen_string_literal: true
7
-
8
8
  module PacketGen::Plugin
9
9
  # Base class for NTLM authentication protocol.
10
10
  # @author Sylvain Daubert
@@ -159,7 +159,7 @@ module PacketGen::Plugin
159
159
  else
160
160
  type.new(options)
161
161
  end
162
- content.read(payload[offset_in_payload, length]) if length > 0
162
+ content.read(payload[offset_in_payload, length]) if length.positive?
163
163
  send(:"#{name}=", content)
164
164
  end
165
165
 
@@ -1,10 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # This file is part of packetgen-plugin-smb.
2
4
  # See https://github.com/sdaubert/packetgen-plugin-smb for more informations
3
5
  # Copyright (C) 2018 Sylvain Daubert <sylvain.daubert@laposte.net>
4
6
  # This program is published under MIT license.
5
7
 
6
- # frozen_string_literal: true
7
-
8
8
  module PacketGen::Plugin
9
9
  class NTLM
10
10
  # NTLM Challenge message
@@ -1,10 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # This file is part of packetgen-plugin-smb.
2
4
  # See https://github.com/sdaubert/packetgen-plugin-smb for more informations
3
5
  # Copyright (C) 2018 Sylvain Daubert <sylvain.daubert@laposte.net>
4
6
  # This program is published under MIT license.
5
7
 
6
- # frozen_string_literal: true
7
-
8
8
  module PacketGen::Plugin
9
9
  class NTLM
10
10
  # Known AvPair IDs
@@ -64,9 +64,7 @@ module PacketGen::Plugin
64
64
 
65
65
  # Get unicode property
66
66
  # @return [Boolean]
67
- def unicode
68
- @unicode
69
- end
67
+ attr_reader :unicode
70
68
  alias unicode? unicode
71
69
 
72
70
  # Set unicode property
@@ -1,10 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # This file is part of packetgen-plugin-smb.
2
4
  # See https://github.com/sdaubert/packetgen-plugin-smb for more informations
3
5
  # Copyright (C) 2018 Sylvain Daubert <sylvain.daubert@laposte.net>
4
6
  # This program is published under MIT license.
5
7
 
6
- # frozen_string_literal: true
7
-
8
8
  module PacketGen::Plugin
9
9
  class NTLM
10
10
  # NTLM Challenge message
@@ -1,10 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # This file is part of packetgen-plugin-smb.
2
4
  # See https://github.com/sdaubert/packetgen-plugin-smb for more informations
3
5
  # Copyright (C) 2018 Sylvain Daubert <sylvain.daubert@laposte.net>
4
6
  # This program is published under MIT license.
5
7
 
6
- # frozen_string_literal: true
7
-
8
8
  module PacketGen::Plugin
9
9
  class NTLM
10
10
  # NTLM Negotiate message
@@ -1,10 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # This file is part of packetgen-plugin-smb.
2
4
  # See https://github.com/sdaubert/packetgen-plugin-smb for more informations
3
5
  # Copyright (C) 2018 Sylvain Daubert <sylvain.daubert@laposte.net>
4
6
  # This program is published under MIT license.
5
7
 
6
- # frozen_string_literal: true
7
-
8
8
  module PacketGen::Plugin
9
9
  class NTLM
10
10
  class Ntlmv2Response < PacketGen::Types::Fields
@@ -1,26 +1,26 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # This file is part of packetgen-plugin-smb.
2
4
  # See https://github.com/sdaubert/packetgen-plugin-smb for more informations
3
5
  # Copyright (C) 2018 Sylvain Daubert <sylvain.daubert@laposte.net>
4
6
  # This program is published under MIT license.
5
7
 
6
- # frozen_string_literal: true
7
-
8
8
  module PacketGen::Plugin
9
9
  # Server Message Block (SMB) header.
10
10
  # @author Sylvain Daubert
11
11
  class SMB < PacketGen::Header::Base
12
12
  # Known commands
13
13
  COMMANDS = {
14
- 'delete_dir' => 0x01,
15
- 'close' => 0x04,
16
- 'delete' => 0x06,
17
- 'query_info2' => 0x23,
18
- 'trans' => 0x25,
19
- 'echo' => 0x2b,
20
- 'open_and_x' => 0x2d,
21
- 'read_and_x' => 0x2e,
22
- 'write_and_x' => 0x2f,
23
- 'trans2' => 0x32,
14
+ 'delete_dir' => 0x01,
15
+ 'close' => 0x04,
16
+ 'delete' => 0x06,
17
+ 'query_info2' => 0x23,
18
+ 'trans' => 0x25,
19
+ 'echo' => 0x2b,
20
+ 'open_and_x' => 0x2d,
21
+ 'read_and_x' => 0x2e,
22
+ 'write_and_x' => 0x2f,
23
+ 'trans2' => 0x32,
24
24
  'tree_disconnect' => 0x71,
25
25
  'negotiate' => 0x72,
26
26
  'session_setup_and_x' => 0x73,