Ejemplo n.º 1
0
        internal static SMB2Command GetTreeConnectResponse(TreeConnectRequest request, SMB2ConnectionState state, NamedPipeShare services, SMBShareCollection shares)
        {
            SMB2Session         session  = state.GetSession(request.Header.SessionID);
            TreeConnectResponse response = new TreeConnectResponse();
            string     shareName         = ServerPathUtils.GetShareName(request.Path);
            ISMBShare  share;
            ShareType  shareType;
            ShareFlags shareFlags;

            if (String.Equals(shareName, NamedPipeShare.NamedPipeShareName, StringComparison.OrdinalIgnoreCase))
            {
                share      = services;
                shareType  = ShareType.Pipe;
                shareFlags = ShareFlags.NoCaching;
            }
            else
            {
                share = shares.GetShareFromName(shareName);
                if (share == null)
                {
                    return(new ErrorResponse(request.CommandName, NTStatus.STATUS_OBJECT_PATH_NOT_FOUND));
                }

                shareType  = ShareType.Disk;
                shareFlags = GetShareCachingFlags(((FileSystemShare)share).CachingPolicy);
                if (!((FileSystemShare)share).HasReadAccess(session.SecurityContext, @"\"))
                {
                    state.LogToServer(Severity.Verbose, "Tree Connect to '{0}' failed. User '{1}' was denied access.", share.Name, session.UserName);
                    return(new ErrorResponse(request.CommandName, NTStatus.STATUS_ACCESS_DENIED));
                }
            }

            uint?treeID = session.AddConnectedTree(share);

            if (!treeID.HasValue)
            {
                return(new ErrorResponse(request.CommandName, NTStatus.STATUS_INSUFF_SERVER_RESOURCES));
            }
            state.LogToServer(Severity.Information, "Tree Connect: User '{0}' connected to '{1}' (SessionID: {2}, TreeID: {3})", session.UserName, share.Name, request.Header.SessionID, treeID.Value);
            response.Header.TreeID = treeID.Value;
            response.ShareType     = shareType;
            response.ShareFlags    = shareFlags;
            response.MaximalAccess = (AccessMask)(FileAccessMask.FILE_READ_DATA | FileAccessMask.FILE_WRITE_DATA | FileAccessMask.FILE_APPEND_DATA |
                                                  FileAccessMask.FILE_READ_EA | FileAccessMask.FILE_WRITE_EA |
                                                  FileAccessMask.FILE_EXECUTE |
                                                  FileAccessMask.FILE_READ_ATTRIBUTES | FileAccessMask.FILE_WRITE_ATTRIBUTES) |
                                     AccessMask.DELETE | AccessMask.READ_CONTROL | AccessMask.WRITE_DAC | AccessMask.WRITE_OWNER | AccessMask.SYNCHRONIZE;
            return(response);
        }
Ejemplo n.º 2
0
        public static SMB2Body CreateSMB2Body(byte[] vs, int offset, ESMB2Command eSMB2Command, SMB2HeaderFlags smb2HeaderFlags, NTStateType ntState)
        {
            SMB2Body sMB2Body = null;

            if (smb2HeaderFlags.HasFlag(SMB2HeaderFlags.ServerToRedir))
            {
                if (ntState == NTStateType.Success || ntState == NTStateType.MoreProcessingRequired || ntState == NTStateType.LogonFailure)
                {
                    switch (eSMB2Command)
                    {
                    case ESMB2Command.NEGOTIATE: sMB2Body = NegotiateResponse.Parser(vs, offset); break;

                    case ESMB2Command.SESSION_SETUP: sMB2Body = SessionSetupResponse.Parser(vs, offset); break;

                    case ESMB2Command.TREE_CONNECT: sMB2Body = TreeConnectResponse.Parser(vs, offset); break;

                    case ESMB2Command.LOGOFF:
                    case ESMB2Command.TREE_DISCONNECT: sMB2Body = LogoffAndTreeDisconnect.Parser(vs, offset); break;

                    case ESMB2Command.CREATE: sMB2Body = CreateResponse.Parser(vs, offset); break;

                    case ESMB2Command.CLOSE: sMB2Body = CloseResponse.Parser(vs, offset); break;

                    case ESMB2Command.WRITE: sMB2Body = WriteResponse.Parser(vs, offset); break;

                    case ESMB2Command.READ: sMB2Body = ReadResponse.Parser(vs, offset); break;

                    case ESMB2Command.IOCTL: sMB2Body = IOCTLResponse.Parser(vs, offset); break;

                    default: throw new Exception("UnKnow SMB2 Command");
                    }
                }
                else
                {
                    sMB2Body = ErrorResponse.Parser(vs, offset);
                }
            }
            else
            {
                throw new NotImplementedException();
            }
            return(sMB2Body);
        }