From ae8a3d77d346da7771e10f794e7fa4e4cb52b276 Mon Sep 17 00:00:00 2001 From: Tal Aloni Date: Thu, 18 May 2017 10:32:15 +0300 Subject: [PATCH] SMB1: Added support for paths without leading backslash --- .../Server/SMB1/FileStoreResponseHelper.cs | 24 ++++++++++++++----- SMBLibrary/Server/SMB1/NTCreateHelper.cs | 5 ++++ SMBLibrary/Server/SMB1/OpenAndXHelper.cs | 5 ++++ .../SMB1/Transaction2SubcommandHelper.cs | 9 +++++++ 4 files changed, 37 insertions(+), 6 deletions(-) diff --git a/SMBLibrary/Server/SMB1/FileStoreResponseHelper.cs b/SMBLibrary/Server/SMB1/FileStoreResponseHelper.cs index 196cec8..4f6c6eb 100644 --- a/SMBLibrary/Server/SMB1/FileStoreResponseHelper.cs +++ b/SMBLibrary/Server/SMB1/FileStoreResponseHelper.cs @@ -110,17 +110,23 @@ namespace SMBLibrary.Server.SMB1 internal static SMB1Command GetCheckDirectoryResponse(SMB1Header header, CheckDirectoryRequest request, ISMBShare share, SMB1ConnectionState state) { SMB1Session session = state.GetSession(header.UID); + string path = request.DirectoryName; + if (!path.StartsWith(@"\")) + { + path = @"\" + path; + } + if (share is FileSystemShare) { - if (!((FileSystemShare)share).HasReadAccess(session.SecurityContext, request.DirectoryName)) + if (!((FileSystemShare)share).HasReadAccess(session.SecurityContext, path)) { - state.LogToServer(Severity.Verbose, "Check Directory '{0}{1}' failed. User '{2}' was denied access.", share.Name, request.DirectoryName, session.UserName); + state.LogToServer(Severity.Verbose, "Check Directory '{0}{1}' failed. User '{2}' was denied access.", share.Name, path, session.UserName); header.Status = NTStatus.STATUS_ACCESS_DENIED; return new ErrorResponse(request.CommandName); } } - header.Status = SMB1FileStoreHelper.CheckDirectory(share.FileStore, request.DirectoryName, session.SecurityContext); + header.Status = SMB1FileStoreHelper.CheckDirectory(share.FileStore, path, session.SecurityContext); if (header.Status != NTStatus.STATUS_SUCCESS) { return new ErrorResponse(request.CommandName); @@ -132,18 +138,24 @@ namespace SMBLibrary.Server.SMB1 internal static SMB1Command GetQueryInformationResponse(SMB1Header header, QueryInformationRequest request, ISMBShare share, SMB1ConnectionState state) { SMB1Session session = state.GetSession(header.UID); + string path = request.FileName; + if (!path.StartsWith(@"\")) + { + path = @"\" + path; + } + if (share is FileSystemShare) { - if (!((FileSystemShare)share).HasReadAccess(session.SecurityContext, request.FileName)) + if (!((FileSystemShare)share).HasReadAccess(session.SecurityContext, path)) { - state.LogToServer(Severity.Verbose, "Query Information on '{0}{1}' failed. User '{2}' was denied access.", share.Name, request.FileName, session.UserName); + state.LogToServer(Severity.Verbose, "Query Information on '{0}{1}' failed. User '{2}' was denied access.", share.Name, path, session.UserName); header.Status = NTStatus.STATUS_ACCESS_DENIED; return new ErrorResponse(request.CommandName); } } FileNetworkOpenInformation fileInfo; - header.Status = SMB1FileStoreHelper.QueryInformation(out fileInfo, share.FileStore, request.FileName, session.SecurityContext); + header.Status = SMB1FileStoreHelper.QueryInformation(out fileInfo, share.FileStore, path, session.SecurityContext); if (header.Status != NTStatus.STATUS_SUCCESS) { return new ErrorResponse(request.CommandName); diff --git a/SMBLibrary/Server/SMB1/NTCreateHelper.cs b/SMBLibrary/Server/SMB1/NTCreateHelper.cs index 9855f0f..6c9c0c2 100644 --- a/SMBLibrary/Server/SMB1/NTCreateHelper.cs +++ b/SMBLibrary/Server/SMB1/NTCreateHelper.cs @@ -21,6 +21,11 @@ namespace SMBLibrary.Server.SMB1 SMB1Session session = state.GetSession(header.UID); bool isExtended = (request.Flags & NTCreateFlags.NT_CREATE_REQUEST_EXTENDED_RESPONSE) > 0; string path = request.FileName; + if (!path.StartsWith(@"\")) + { + path = @"\" + path; + } + FileAccess createAccess = NTFileStoreHelper.ToCreateFileAccess(request.DesiredAccess, request.CreateDisposition); if (share is FileSystemShare) { diff --git a/SMBLibrary/Server/SMB1/OpenAndXHelper.cs b/SMBLibrary/Server/SMB1/OpenAndXHelper.cs index 9d8a95f..fdfa4b3 100644 --- a/SMBLibrary/Server/SMB1/OpenAndXHelper.cs +++ b/SMBLibrary/Server/SMB1/OpenAndXHelper.cs @@ -21,6 +21,11 @@ namespace SMBLibrary.Server.SMB1 SMB1Session session = state.GetSession(header.UID); bool isExtended = (request.Flags & OpenFlags.SMB_OPEN_EXTENDED_RESPONSE) > 0; string path = request.FileName; + if (!path.StartsWith(@"\")) + { + path = @"\" + path; + } + AccessMask desiredAccess; ShareAccess shareAccess; CreateDisposition createDisposition; diff --git a/SMBLibrary/Server/SMB1/Transaction2SubcommandHelper.cs b/SMBLibrary/Server/SMB1/Transaction2SubcommandHelper.cs index c3d1f78..f372000 100644 --- a/SMBLibrary/Server/SMB1/Transaction2SubcommandHelper.cs +++ b/SMBLibrary/Server/SMB1/Transaction2SubcommandHelper.cs @@ -19,6 +19,10 @@ namespace SMBLibrary.Server.SMB1 { SMB1Session session = state.GetSession(header.UID); string fileNamePattern = subcommand.FileName; + if (!fileNamePattern.StartsWith(@"\")) + { + fileNamePattern = @"\" + fileNamePattern; + } List entries; FileInformationClass informationClass; @@ -155,6 +159,11 @@ namespace SMBLibrary.Server.SMB1 { SMB1Session session = state.GetSession(header.UID); string path = subcommand.FileName; + if (!path.StartsWith(@"\")) + { + path = @"\" + path; + } + if (share is FileSystemShare) { if (!((FileSystemShare)share).HasReadAccess(session.SecurityContext, path))