From fc3a4341f933cdf34c259d996d182d8882b98152 Mon Sep 17 00:00:00 2001 From: TalAloni Date: Sat, 28 Nov 2020 22:00:44 +0200 Subject: [PATCH] Server: Added option to enable SMB 3.0 --- SMBLibrary/Server/Enums/SMBDialect.cs | 1 + SMBLibrary/Server/SMB2/NegotiateHelper.cs | 9 +++++++-- SMBLibrary/Server/SMBServer.SMB2.cs | 4 +++- SMBLibrary/Server/SMBServer.cs | 18 +++++++++++++++--- 4 files changed, 26 insertions(+), 6 deletions(-) diff --git a/SMBLibrary/Server/Enums/SMBDialect.cs b/SMBLibrary/Server/Enums/SMBDialect.cs index b15a469..a69337a 100644 --- a/SMBLibrary/Server/Enums/SMBDialect.cs +++ b/SMBLibrary/Server/Enums/SMBDialect.cs @@ -7,5 +7,6 @@ namespace SMBLibrary.Server NTLM012, // NT LM 0.12 SMB202, // SMB 2.0.2 SMB210, // SMB 2.1 + SMB300, // SMB 3.0 } } diff --git a/SMBLibrary/Server/SMB2/NegotiateHelper.cs b/SMBLibrary/Server/SMB2/NegotiateHelper.cs index 54a1a6e..d366176 100644 --- a/SMBLibrary/Server/SMB2/NegotiateHelper.cs +++ b/SMBLibrary/Server/SMB2/NegotiateHelper.cs @@ -73,10 +73,15 @@ namespace SMBLibrary.Server.SMB2 return response; } - internal static SMB2Command GetNegotiateResponse(NegotiateRequest request, GSSProvider securityProvider, ConnectionState state, SMBTransportType transportType, Guid serverGuid, DateTime serverStartTime) + internal static SMB2Command GetNegotiateResponse(NegotiateRequest request, GSSProvider securityProvider, ConnectionState state, SMBTransportType transportType, Guid serverGuid, DateTime serverStartTime, bool enableSMB3) { NegotiateResponse response = new NegotiateResponse(); - if (request.Dialects.Contains(SMB2Dialect.SMB210)) + if (enableSMB3 && request.Dialects.Contains(SMB2Dialect.SMB300)) + { + state.Dialect = SMBDialect.SMB300; + response.DialectRevision = SMB2Dialect.SMB300; + } + else if (request.Dialects.Contains(SMB2Dialect.SMB210)) { state.Dialect = SMBDialect.SMB210; response.DialectRevision = SMB2Dialect.SMB210; diff --git a/SMBLibrary/Server/SMBServer.SMB2.cs b/SMBLibrary/Server/SMBServer.SMB2.cs index 65671ec..babd50d 100644 --- a/SMBLibrary/Server/SMBServer.SMB2.cs +++ b/SMBLibrary/Server/SMBServer.SMB2.cs @@ -83,7 +83,7 @@ namespace SMBLibrary.Server if (command is NegotiateRequest) { NegotiateRequest request = (NegotiateRequest)command; - SMB2Command response = NegotiateHelper.GetNegotiateResponse(request, m_securityProvider, state, m_transport, m_serverGuid, m_serverStartTime); + SMB2Command response = NegotiateHelper.GetNegotiateResponse(request, m_securityProvider, state, m_transport, m_serverGuid, m_serverStartTime, m_enableSMB3); if (state.Dialect != SMBDialect.NotSet) { state = new SMB2ConnectionState(state); @@ -260,6 +260,8 @@ namespace SMBLibrary.Server return SMB2Dialect.SMB202; case SMBDialect.SMB210: return SMB2Dialect.SMB210; + case SMBDialect.SMB300: + return SMB2Dialect.SMB300; default: throw new ArgumentException("Unsupported SMB2 Dialect: " + smbDialect.ToString()); } diff --git a/SMBLibrary/Server/SMBServer.cs b/SMBLibrary/Server/SMBServer.cs index 41bfe24..c85a266 100644 --- a/SMBLibrary/Server/SMBServer.cs +++ b/SMBLibrary/Server/SMBServer.cs @@ -38,6 +38,7 @@ namespace SMBLibrary.Server private SMBTransportType m_transport; private bool m_enableSMB1; private bool m_enableSMB2; + private bool m_enableSMB3; private Socket m_listenerSocket; private bool m_listening; private DateTime m_serverStartTime; @@ -61,7 +62,12 @@ namespace SMBLibrary.Server public void Start(IPAddress serverAddress, SMBTransportType transport, bool enableSMB1, bool enableSMB2) { - Start(serverAddress, transport, enableSMB1, enableSMB2, null); + Start(serverAddress, transport, enableSMB1, enableSMB2, false); + } + + public void Start(IPAddress serverAddress, SMBTransportType transport, bool enableSMB1, bool enableSMB2, bool enableSMB3) + { + Start(serverAddress, transport, enableSMB1, enableSMB2, enableSMB3, null); } /// @@ -70,15 +76,21 @@ namespace SMBLibrary.Server /// to prevent such connections from hanging around indefinitely, this parameter can be used. /// /// - public void Start(IPAddress serverAddress, SMBTransportType transport, bool enableSMB1, bool enableSMB2, TimeSpan? connectionInactivityTimeout) + public void Start(IPAddress serverAddress, SMBTransportType transport, bool enableSMB1, bool enableSMB2, bool enableSMB3, TimeSpan? connectionInactivityTimeout) { if (!m_listening) { + if (enableSMB3 && !enableSMB2) + { + throw new ArgumentException("SMB2 must be enabled for SMB3 to be enabled"); + } + Log(Severity.Information, "Starting server"); m_serverAddress = serverAddress; m_transport = transport; m_enableSMB1 = enableSMB1; m_enableSMB2 = enableSMB2; + m_enableSMB3 = enableSMB3; m_listening = true; m_serverStartTime = DateTime.Now; @@ -290,7 +302,7 @@ namespace SMBLibrary.Server // Note: To be compatible with SMB2 specifications, we must accept SMB_COM_NEGOTIATE. // We will disconnect the connection if m_enableSMB1 == false and the client does not support SMB2. bool acceptSMB1 = (state.Dialect == SMBDialect.NotSet || state.Dialect == SMBDialect.NTLM012); - bool acceptSMB2 = (m_enableSMB2 && (state.Dialect == SMBDialect.NotSet || state.Dialect == SMBDialect.SMB202 || state.Dialect == SMBDialect.SMB210)); + bool acceptSMB2 = (m_enableSMB2 && (state.Dialect == SMBDialect.NotSet || state.Dialect == SMBDialect.SMB202 || state.Dialect == SMBDialect.SMB210 || state.Dialect == SMBDialect.SMB300)); if (SMB1Header.IsValidSMB1Header(packet.Trailer)) {