Пример #1
0
        internal static SMB2Command GetNegotiateResponse(NegotiateRequest request, GSSProvider securityProvider, ConnectionState state, Guid serverGuid, DateTime serverStartTime)
        {
            NegotiateResponse response = new NegotiateResponse();

            if (request.Dialects.Contains(SMB2Dialect.SMB210))
            {
                state.Dialect            = SMBDialect.SMB210;
                response.DialectRevision = SMB2Dialect.SMB210;
            }
            else if (request.Dialects.Contains(SMB2Dialect.SMB202))
            {
                state.Dialect            = SMBDialect.SMB202;
                response.DialectRevision = SMB2Dialect.SMB202;
            }
            else
            {
                return(new ErrorResponse(request.CommandName, NTStatus.STATUS_NOT_SUPPORTED));
            }
            response.SecurityMode    = SecurityMode.SigningEnabled;
            response.ServerGuid      = serverGuid;
            response.MaxTransactSize = 65536;
            response.MaxReadSize     = 65536;
            response.MaxWriteSize    = 65536;
            response.SystemTime      = DateTime.Now;
            response.ServerStartTime = serverStartTime;
            response.SecurityBuffer  = securityProvider.GetSPNEGOTokenInitBytes();
            return(response);
        }
Пример #2
0
        // Special case - SMB2 client initially connecting using SMB1
        internal static SMB2Command GetNegotiateResponse(List <string> smb2Dialects, GSSProvider securityProvider, ConnectionState state, Guid serverGuid, DateTime serverStartTime)
        {
            NegotiateResponse response = new NegotiateResponse();

            response.Header.Credits = 1;

            if (smb2Dialects.Contains(SMB2xxxDialect))
            {
                response.DialectRevision = SMB2Dialect.SMB2xx;
            }
            else if (smb2Dialects.Contains(SMB2002Dialect))
            {
                state.Dialect            = SMBDialect.SMB202;
                response.DialectRevision = SMB2Dialect.SMB202;
            }
            else
            {
                throw new ArgumentException("SMB2 dialect is not present");
            }
            response.SecurityMode    = SecurityMode.SigningEnabled;
            response.ServerGuid      = serverGuid;
            response.MaxTransactSize = 65536;
            response.MaxReadSize     = 65536;
            response.MaxWriteSize    = 65536;
            response.SystemTime      = DateTime.Now;
            response.ServerStartTime = serverStartTime;
            response.SecurityBuffer  = securityProvider.GetSPNEGOTokenInitBytes();
            return(response);
        }
Пример #3
0
        internal static SMB2Command GetNegotiateResponse(NegotiateRequest request, GSSProvider securityProvider, ConnectionState state, SMBTransportType transportType, Guid serverGuid, DateTime serverStartTime, bool enableSMB3)
        {
            NegotiateResponse response = new NegotiateResponse();

            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;
            }
            else if (request.Dialects.Contains(SMB2Dialect.SMB202))
            {
                state.Dialect            = SMBDialect.SMB202;
                response.DialectRevision = SMB2Dialect.SMB202;
            }
            else
            {
                state.LogToServer(Severity.Verbose, "Negotiate failure: None of the requested SMB2 dialects is supported");
                return(new ErrorResponse(request.CommandName, NTStatus.STATUS_NOT_SUPPORTED));
            }
            response.SecurityMode = SecurityMode.SigningEnabled;
            response.ServerGuid   = serverGuid;
            if (state.Dialect != SMBDialect.SMB202 && transportType == SMBTransportType.DirectTCPTransport)
            {
                response.Capabilities    = Capabilities.LargeMTU;
                response.MaxTransactSize = ServerMaxTransactSizeLargeMTU;
                response.MaxReadSize     = ServerMaxReadSizeLargeMTU;
                response.MaxWriteSize    = ServerMaxWriteSizeLargeMTU;
                // [MS-SMB2] 3.3.5.2 Receiving Any Message - If the length of the message exceeds Connection.MaxTransactSize + 256, the server MUST disconnect the connection.
                int maxPacketSize = SessionPacket.HeaderLength + (int)ServerMaxTransactSizeLargeMTU + 256;
                if (maxPacketSize > state.ReceiveBuffer.Buffer.Length)
                {
                    state.ReceiveBuffer.IncreaseBufferSize(maxPacketSize);
                }
            }
            else
            {
                response.MaxTransactSize = ServerMaxTransactSize;
                response.MaxReadSize     = ServerMaxReadSize;
                response.MaxWriteSize    = ServerMaxWriteSize;
            }
            response.SystemTime      = DateTime.Now;
            response.ServerStartTime = serverStartTime;
            response.SecurityBuffer  = securityProvider.GetSPNEGOTokenInitBytes();
            return(response);
        }
Пример #4
0
        // Special case - SMB2 client initially connecting using SMB1
        internal static SMB2Command GetNegotiateResponse(List <string> smb2Dialects, GSSProvider securityProvider, ConnectionState state, SMBTransportType transportType, Guid serverGuid, DateTime serverStartTime)
        {
            NegotiateResponse response = new NegotiateResponse();

            response.Header.Credits = 1;

            if (smb2Dialects.Contains(SMB2xxxDialect))
            {
                response.DialectRevision = SMB2Dialect.SMB2xx;
            }
            else if (smb2Dialects.Contains(SMB2002Dialect))
            {
                state.Dialect            = SMBDialect.SMB202;
                response.DialectRevision = SMB2Dialect.SMB202;
            }
            else
            {
                throw new ArgumentException("SMB2 dialect is not present");
            }
            response.SecurityMode = SecurityMode.SigningEnabled;
            response.ServerGuid   = serverGuid;
            if (state.Dialect != SMBDialect.SMB202 && transportType == SMBTransportType.DirectTCPTransport)
            {
                response.Capabilities    = Capabilities.LargeMTU;
                response.MaxTransactSize = ServerMaxTransactSizeLargeMTU;
                response.MaxReadSize     = ServerMaxReadSizeLargeMTU;
                response.MaxWriteSize    = ServerMaxWriteSizeLargeMTU;
                // [MS-SMB2] 3.3.5.2 Receiving Any Message - If the length of the message exceeds Connection.MaxTransactSize + 256, the server MUST disconnect the connection.
                int maxPacketSize = SessionPacket.HeaderLength + (int)ServerMaxTransactSizeLargeMTU + 256;
                if (maxPacketSize > state.ReceiveBuffer.Buffer.Length)
                {
                    state.ReceiveBuffer.IncreaseBufferSize(maxPacketSize);
                }
            }
            else
            {
                response.MaxTransactSize = ServerMaxTransactSize;
                response.MaxReadSize     = ServerMaxReadSize;
                response.MaxWriteSize    = ServerMaxWriteSize;
            }
            response.SystemTime      = DateTime.Now;
            response.ServerStartTime = serverStartTime;
            response.SecurityBuffer  = securityProvider.GetSPNEGOTokenInitBytes();
            return(response);
        }