Skip to content

Commit a4543b0

Browse files
authored
Land rapid7#18897, Update smb login to support additional configuration
2 parents 435759b + 1315852 commit a4543b0

File tree

4 files changed

+24
-3
lines changed

4 files changed

+24
-3
lines changed

lib/metasploit/framework/login_scanner/smb.rb

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,12 @@ module StatusCodes
4848
].freeze
4949
end
5050

51+
# @returns [Array[Integer]] The SMB versions to negotiate
52+
attr_accessor :versions
53+
54+
# @returns [Boolean] By default the client uses encryption even if it is not required by the server. Disable this by setting always_encrypt to false
55+
attr_accessor :always_encrypt
56+
5157
# @!attribute dispatcher
5258
# @return [RubySMB::Dispatcher::Socket]
5359
attr_accessor :dispatcher
@@ -104,7 +110,16 @@ def attempt_login(credential)
104110
realm = (credential.realm || '').dup.force_encoding('UTF-8')
105111
username = (credential.public || '').dup.force_encoding('UTF-8')
106112
password = (credential.private || '').dup.force_encoding('UTF-8')
107-
client = RubySMB::Client.new(dispatcher, username: username, password: password, domain: realm)
113+
client = RubySMB::Client.new(
114+
dispatcher,
115+
username: username,
116+
password: password,
117+
domain: realm,
118+
smb1: versions.include?(1),
119+
smb2: versions.include?(2),
120+
smb3: versions.include?(3),
121+
always_encrypt: always_encrypt
122+
)
108123

109124
if kerberos_authenticator_factory
110125
client.extend(Msf::Exploit::Remote::SMB::Client::KerberosAuthentication)
@@ -187,6 +202,8 @@ def set_sane_defaults
187202
self.connection_timeout = 10 if connection_timeout.nil?
188203
self.max_send_size = 0 if max_send_size.nil?
189204
self.send_delay = 0 if send_delay.nil?
205+
self.always_encrypt = true if always_encrypt.nil?
206+
self.versions = ::Rex::Proto::SMB::SimpleClient::DEFAULT_VERSIONS if versions.nil?
190207
end
191208

192209
end

lib/msf/core/exploit/remote/smb/client.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ def initialize(info = {})
9696
# @return (see Exploit::Remote::Tcp#connect)
9797
def connect(global=true, versions: [], backend: nil)
9898
if versions.nil? || versions.empty?
99-
versions = datastore['SMB::ProtocolVersion'].split(',').map(&:to_i)
99+
versions = datastore['SMB::ProtocolVersion'].split(',').map(&:strip).reject(&:blank?).map(&:to_i)
100100
# if the user explicitly set the protocol version to 1, still use ruby_smb
101101
backend ||= :ruby_smb if versions == [1]
102102
end

lib/rex/proto/smb/simple_client.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,16 @@ class SimpleClient
1616
XCEPT = Rex::Proto::SMB::Exceptions
1717
EVADE = Rex::Proto::SMB::Evasions
1818

19+
DEFAULT_VERSIONS = [1, 2, 3].freeze
20+
1921
# Public accessors
2022
attr_accessor :last_error, :server_max_buffer_size, :address, :port
2123

2224
# Private accessors
2325
attr_accessor :socket, :client, :direct, :shares, :last_share, :versions
2426

2527
# Pass the socket object and a boolean indicating whether the socket is netbios or cifs
26-
def initialize(socket, direct = false, versions = [1, 2, 3], always_encrypt: true, backend: nil, client: nil)
28+
def initialize(socket, direct = false, versions = DEFAULT_VERSIONS, always_encrypt: true, backend: nil, client: nil)
2729
self.socket = socket
2830
self.direct = direct
2931
self.versions = versions

modules/auxiliary/scanner/smb/smb_login.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,8 @@ def run_host(ip)
128128
send_delay: datastore['TCP::send_delay'],
129129
framework: framework,
130130
framework_module: self,
131+
always_encrypt: datastore['SMB::AlwaysEncrypt'],
132+
versions: datastore['SMB::ProtocolVersion'].split(',').map(&:strip).reject(&:blank?).map(&:to_i),
131133
kerberos_authenticator_factory: kerberos_authenticator_factory,
132134
use_client_as_proof: create_session?
133135
)

0 commit comments

Comments
 (0)