ruby_smb 2.0.8 → 2.0.9

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e3cfb7914736c49c84c366382e133ea0c2e9a5ecb6f0a3badceb498652bbaa76
4
- data.tar.gz: 6f47a0ad156545a259d0496f9e1c59d50b6327889600b6acda0e93ec5c835963
3
+ metadata.gz: 6c56b48b8782a1622a0d9586244a82a4527868e20519a5ab7339a4b679909288
4
+ data.tar.gz: b5aef9f1775e56661b9248567f5a2d254a7b64e67b7252cc742a66b392ab45a4
5
5
  SHA512:
6
- metadata.gz: 90c181090093eeb71d4ef508a2b1e7b75ccb31b7e40cdee973397f7554af1085e8b39a518f43e9e4e3eba5fd12d0677d1f059ed614eab8dfb5b0db74a956236a
7
- data.tar.gz: 443e97e78383d44deb155c0d6e3ca8bc3923c49b2561fa41670e09d7916cdfaa7223143a29b24697699e7470cdcaf6f71a2e0e4167d8c19a7b80b2fc56b2a555
6
+ metadata.gz: 1cf475d6429f701a37557668a1baba47ff241109c99c5a133e3f0c89dbdfc6eda8658952485b8e71eed8a6815541a2d729a093b96230907e2c58f9a63170851d
7
+ data.tar.gz: d5189ce906e257765049e08a6c60d360c5c6bbc389c40d51a3d18c882e68375578cadf74b5b1b892a2b8bee72d3b2ffdc3384259ce0d4213f6d98d076cfcd21e
checksums.yaml.gz.sig CHANGED
Binary file
data.tar.gz.sig CHANGED
@@ -1 +1 @@
1
- �Ss�.�倮�����;�ͦ��c7-ȡ��.�84����R�Q�.]��^�_��w� =r��ܖhu9r(�9� �0�D@�˫"c��z�N{-��F~U�3����@/��nD~,O���B��^tƯ�F>�Ż��4��tתp@ҫw�,B������j9��
2
1
  ��J�t��&kk��94��*��GTL9p�C
2
+ v�����򊩟l�Ek�~����HQ��H����XK��`�[����Ȇ N�p�@�ڎ�jϑ*����
@@ -277,7 +277,8 @@ module RubySMB
277
277
  # @param smb1 [Boolean] whether or not to enable SMB1 support
278
278
  # @param smb2 [Boolean] whether or not to enable SMB2 support
279
279
  # @param smb3 [Boolean] whether or not to enable SMB3 support
280
- def initialize(dispatcher, smb1: true, smb2: true, smb3: true, username:, password:, domain: '.', local_workstation: 'WORKSTATION', always_encrypt: true)
280
+ def initialize(dispatcher, smb1: true, smb2: true, smb3: true, username:, password:, domain: '.',
281
+ local_workstation: 'WORKSTATION', always_encrypt: true, ntlm_flags: default_flags)
281
282
  raise ArgumentError, 'No Dispatcher provided' unless dispatcher.is_a? RubySMB::Dispatcher::Base
282
283
  if smb1 == false && smb2 == false && smb3 == false
283
284
  raise ArgumentError, 'You must enable at least one Protocol'
@@ -306,18 +307,12 @@ module RubySMB
306
307
  # SMB 3.x options
307
308
  @session_encrypt_data = always_encrypt
308
309
 
309
- negotiate_version_flag = 0x02000000
310
- flags = Net::NTLM::Client::DEFAULT_FLAGS |
311
- Net::NTLM::FLAGS[:TARGET_INFO] |
312
- negotiate_version_flag ^
313
- Net::NTLM::FLAGS[:OEM]
314
-
315
310
  @ntlm_client = Net::NTLM::Client.new(
316
311
  @username,
317
312
  @password,
318
313
  workstation: @local_workstation,
319
314
  domain: @domain,
320
- flags: flags
315
+ flags: ntlm_flags
321
316
  )
322
317
 
323
318
  @tree_connects = []
@@ -368,31 +363,28 @@ module RubySMB
368
363
 
369
364
  # Performs protocol negotiation and session setup. It defaults to using
370
365
  # the credentials supplied during initialization, but can take a new set of credentials if needed.
371
- def login(username: self.username, password: self.password, domain: self.domain, local_workstation: self.local_workstation)
366
+ def login(username: self.username, password: self.password,
367
+ domain: self.domain, local_workstation: self.local_workstation,
368
+ ntlm_flags: default_flags)
372
369
  negotiate
373
- session_setup(username, password, domain, true,
374
- local_workstation: local_workstation)
370
+ session_setup(username, password, domain,
371
+ local_workstation: local_workstation,
372
+ ntlm_flags: ntlm_flags)
375
373
  end
376
374
 
377
375
  def session_setup(user, pass, domain, do_recv=true,
378
- local_workstation: self.local_workstation)
376
+ local_workstation: self.local_workstation, ntlm_flags: default_flags)
379
377
  @domain = domain
380
378
  @local_workstation = local_workstation
381
379
  @password = pass.encode('utf-8') || ''.encode('utf-8')
382
380
  @username = user.encode('utf-8') || ''.encode('utf-8')
383
381
 
384
- negotiate_version_flag = 0x02000000
385
- flags = Net::NTLM::Client::DEFAULT_FLAGS |
386
- Net::NTLM::FLAGS[:TARGET_INFO] |
387
- negotiate_version_flag ^
388
- Net::NTLM::FLAGS[:OEM]
389
-
390
382
  @ntlm_client = Net::NTLM::Client.new(
391
383
  @username,
392
384
  @password,
393
385
  workstation: @local_workstation,
394
386
  domain: @domain,
395
- flags: flags
387
+ flags: ntlm_flags
396
388
  )
397
389
 
398
390
  authenticate
@@ -654,5 +646,17 @@ module RubySMB
654
646
  @preauth_integrity_hash_value + data.to_binary_s
655
647
  )
656
648
  end
649
+
650
+ private
651
+
652
+ def default_flags
653
+ negotiate_version_flag = 0x02000000
654
+ flags = Net::NTLM::Client::DEFAULT_FLAGS |
655
+ Net::NTLM::FLAGS[:TARGET_INFO] |
656
+ negotiate_version_flag ^
657
+ Net::NTLM::FLAGS[:OEM]
658
+
659
+ flags
660
+ end
657
661
  end
658
662
  end
@@ -57,15 +57,20 @@ module RubySMB
57
57
 
58
58
  # Takes the raw response data from the server and tries
59
59
  # parse it into a valid Response packet object.
60
- # This method currently assumes that all SMB1 will use Extended Security.
61
60
  #
62
61
  # @param raw_data [String] the raw binary response from the server
63
62
  # @return [RubySMB::SMB1::Packet::NegotiateResponseExtended] when the response is an SMB1 Extended Security Negotiate Response Packet
63
+ # @return [RubySMB::SMB1::Packet::NegotiateResponse] when the response is an SMB1 Negotiate Response Packet
64
64
  # @return [RubySMB::SMB2::Packet::NegotiateResponse] when the response is an SMB2 Negotiate Response Packet
65
65
  def negotiate_response(raw_data)
66
66
  response = nil
67
67
  if smb1
68
68
  packet = RubySMB::SMB1::Packet::NegotiateResponseExtended.read raw_data
69
+
70
+ unless packet.valid?
71
+ packet = RubySMB::SMB1::Packet::NegotiateResponse.read raw_data
72
+ end
73
+
69
74
  response = packet if packet.valid?
70
75
  end
71
76
  if (smb2 || smb3) && response.nil?
@@ -74,17 +79,10 @@ module RubySMB
74
79
  end
75
80
  if response.nil?
76
81
  if packet.packet_smb_version == 'SMB1'
77
- extended_security = if packet.is_a? RubySMB::SMB1::Packet::NegotiateResponseExtended
78
- packet.parameter_block.capabilities.extended_security
79
- else
80
- "n/a"
81
- end
82
82
  raise RubySMB::Error::InvalidPacket.new(
83
83
  expected_proto: RubySMB::SMB1::SMB_PROTOCOL_ID,
84
- expected_cmd: RubySMB::SMB1::Packet::NegotiateResponseExtended::COMMAND,
85
- expected_custom: "extended_security=1",
86
- packet: packet,
87
- received_custom: "extended_security=#{extended_security}"
84
+ expected_cmd: RubySMB::SMB1::Packet::NegotiateResponse::COMMAND,
85
+ packet: packet
88
86
  )
89
87
  elsif packet.packet_smb_version == 'SMB2'
90
88
  raise RubySMB::Error::InvalidPacket.new(
@@ -1,3 +1,3 @@
1
1
  module RubySMB
2
- VERSION = '2.0.8'.freeze
2
+ VERSION = '2.0.9'.freeze
3
3
  end
@@ -809,6 +809,18 @@ RSpec.describe RubySMB::Client do
809
809
  smb1_extended_response.to_binary_s
810
810
  }
811
811
 
812
+ let(:smb1_response) {
813
+ packet = RubySMB::SMB1::Packet::NegotiateResponse.new
814
+ smb1_capabilities_dup = smb1_capabilities.dup
815
+ smb1_capabilities_dup[:extended_security] = 0
816
+
817
+ packet.parameter_block.capabilities = smb1_capabilities_dup
818
+ packet
819
+ }
820
+ let(:smb1_response_raw) {
821
+ smb1_response.to_binary_s
822
+ }
823
+
812
824
  let(:smb2_response) { RubySMB::SMB2::Packet::NegotiateResponse.new(dialect_revision: 0x200) }
813
825
  let(:smb3_response) { RubySMB::SMB2::Packet::NegotiateResponse.new(dialect_revision: 0x300) }
814
826
 
@@ -997,10 +1009,14 @@ RSpec.describe RubySMB::Client do
997
1009
 
998
1010
  describe '#negotiate_response' do
999
1011
  context 'with only SMB1' do
1000
- it 'returns a properly formed packet' do
1012
+ it 'returns a properly formed NegotiateResponseExtended packet if extended_security is set as 1' do
1001
1013
  expect(smb1_client.negotiate_response(smb1_extended_response_raw)).to eq smb1_extended_response
1002
1014
  end
1003
1015
 
1016
+ it 'returns a properly formed NegotiateResponse packet if extended_security is set as 0' do
1017
+ expect(smb1_client.negotiate_response(smb1_response_raw)).to eq smb1_response
1018
+ end
1019
+
1004
1020
  it 'raises an exception if the response is not a SMB packet' do
1005
1021
  expect { smb1_client.negotiate_response(random_junk) }.to raise_error(RubySMB::Error::InvalidPacket)
1006
1022
  end
@@ -1015,12 +1031,6 @@ RSpec.describe RubySMB::Client do
1015
1031
  bogus_response.smb_header.command = 0xff
1016
1032
  expect { smb1_client.negotiate_response(bogus_response.to_binary_s) }.to raise_error(RubySMB::Error::InvalidPacket)
1017
1033
  end
1018
-
1019
- it 'considers the response invalid if Extended Security is not enabled' do
1020
- bogus_response = smb1_extended_response
1021
- bogus_response.parameter_block.capabilities.extended_security = 0
1022
- expect { smb1_client.negotiate_response(bogus_response.to_binary_s) }.to raise_error(RubySMB::Error::InvalidPacket)
1023
- end
1024
1034
  end
1025
1035
 
1026
1036
  context 'with only SMB2' do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby_smb
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.8
4
+ version: 2.0.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Metasploit Hackers
@@ -97,7 +97,7 @@ cert_chain:
97
97
  EknWpNgVhohbot1lfVAMmIhdtOVaRVcQQixWPwprDj/ydB8ryDMDosIMcw+fkoXU
98
98
  9GJsSaSRRYQ9UUkVL27b64okU8D48m8=
99
99
  -----END CERTIFICATE-----
100
- date: 2021-04-09 00:00:00.000000000 Z
100
+ date: 2021-05-17 00:00:00.000000000 Z
101
101
  dependencies:
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: redcarpet
metadata.gz.sig CHANGED
Binary file