SMB1: Added support for paths without leading backslash

This commit is contained in:
Tal Aloni 2017-05-18 10:32:15 +03:00
parent 210f522b29
commit ae8a3d77d3
4 changed files with 37 additions and 6 deletions

View file

@ -110,17 +110,23 @@ namespace SMBLibrary.Server.SMB1
internal static SMB1Command GetCheckDirectoryResponse(SMB1Header header, CheckDirectoryRequest request, ISMBShare share, SMB1ConnectionState state) internal static SMB1Command GetCheckDirectoryResponse(SMB1Header header, CheckDirectoryRequest request, ISMBShare share, SMB1ConnectionState state)
{ {
SMB1Session session = state.GetSession(header.UID); SMB1Session session = state.GetSession(header.UID);
string path = request.DirectoryName;
if (!path.StartsWith(@"\"))
{
path = @"\" + path;
}
if (share is FileSystemShare) 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; header.Status = NTStatus.STATUS_ACCESS_DENIED;
return new ErrorResponse(request.CommandName); 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) if (header.Status != NTStatus.STATUS_SUCCESS)
{ {
return new ErrorResponse(request.CommandName); 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) internal static SMB1Command GetQueryInformationResponse(SMB1Header header, QueryInformationRequest request, ISMBShare share, SMB1ConnectionState state)
{ {
SMB1Session session = state.GetSession(header.UID); SMB1Session session = state.GetSession(header.UID);
string path = request.FileName;
if (!path.StartsWith(@"\"))
{
path = @"\" + path;
}
if (share is FileSystemShare) 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; header.Status = NTStatus.STATUS_ACCESS_DENIED;
return new ErrorResponse(request.CommandName); return new ErrorResponse(request.CommandName);
} }
} }
FileNetworkOpenInformation fileInfo; 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) if (header.Status != NTStatus.STATUS_SUCCESS)
{ {
return new ErrorResponse(request.CommandName); return new ErrorResponse(request.CommandName);

View file

@ -21,6 +21,11 @@ namespace SMBLibrary.Server.SMB1
SMB1Session session = state.GetSession(header.UID); SMB1Session session = state.GetSession(header.UID);
bool isExtended = (request.Flags & NTCreateFlags.NT_CREATE_REQUEST_EXTENDED_RESPONSE) > 0; bool isExtended = (request.Flags & NTCreateFlags.NT_CREATE_REQUEST_EXTENDED_RESPONSE) > 0;
string path = request.FileName; string path = request.FileName;
if (!path.StartsWith(@"\"))
{
path = @"\" + path;
}
FileAccess createAccess = NTFileStoreHelper.ToCreateFileAccess(request.DesiredAccess, request.CreateDisposition); FileAccess createAccess = NTFileStoreHelper.ToCreateFileAccess(request.DesiredAccess, request.CreateDisposition);
if (share is FileSystemShare) if (share is FileSystemShare)
{ {

View file

@ -21,6 +21,11 @@ namespace SMBLibrary.Server.SMB1
SMB1Session session = state.GetSession(header.UID); SMB1Session session = state.GetSession(header.UID);
bool isExtended = (request.Flags & OpenFlags.SMB_OPEN_EXTENDED_RESPONSE) > 0; bool isExtended = (request.Flags & OpenFlags.SMB_OPEN_EXTENDED_RESPONSE) > 0;
string path = request.FileName; string path = request.FileName;
if (!path.StartsWith(@"\"))
{
path = @"\" + path;
}
AccessMask desiredAccess; AccessMask desiredAccess;
ShareAccess shareAccess; ShareAccess shareAccess;
CreateDisposition createDisposition; CreateDisposition createDisposition;

View file

@ -19,6 +19,10 @@ namespace SMBLibrary.Server.SMB1
{ {
SMB1Session session = state.GetSession(header.UID); SMB1Session session = state.GetSession(header.UID);
string fileNamePattern = subcommand.FileName; string fileNamePattern = subcommand.FileName;
if (!fileNamePattern.StartsWith(@"\"))
{
fileNamePattern = @"\" + fileNamePattern;
}
List<QueryDirectoryFileInformation> entries; List<QueryDirectoryFileInformation> entries;
FileInformationClass informationClass; FileInformationClass informationClass;
@ -155,6 +159,11 @@ namespace SMBLibrary.Server.SMB1
{ {
SMB1Session session = state.GetSession(header.UID); SMB1Session session = state.GetSession(header.UID);
string path = subcommand.FileName; string path = subcommand.FileName;
if (!path.StartsWith(@"\"))
{
path = @"\" + path;
}
if (share is FileSystemShare) if (share is FileSystemShare)
{ {
if (!((FileSystemShare)share).HasReadAccess(session.SecurityContext, path)) if (!((FileSystemShare)share).HasReadAccess(session.SecurityContext, path))