Ejemplo n.º 1
0
        public NTStatus GetSecurityInformation(out SecurityDescriptor result, object handle, SecurityInformation securityInformation)
        {
            result = null;
            int maxOutputLength = 4096;
            NTTransactQuerySecurityDescriptorRequest subcommand = new NTTransactQuerySecurityDescriptorRequest();

            subcommand.FID = (ushort)handle;
            subcommand.SecurityInfoFields = securityInformation;

            NTTransactRequest request = new NTTransactRequest();

            request.Function            = subcommand.SubcommandName;
            request.Setup               = subcommand.GetSetup();
            request.TransParameters     = subcommand.GetParameters(m_client.Unicode);
            request.TransData           = subcommand.GetData();
            request.TotalDataCount      = (uint)request.TransData.Length;
            request.TotalParameterCount = (uint)request.TransParameters.Length;
            request.MaxParameterCount   = NTTransactQuerySecurityDescriptorResponse.ParametersLength;
            request.MaxDataCount        = (uint)maxOutputLength;

            TrySendMessage(request);
            SMB1Message reply = m_client.WaitForMessage(CommandName.SMB_COM_NT_TRANSACT);

            if (reply != null)
            {
                if (reply.Header.Status == NTStatus.STATUS_SUCCESS && reply.Commands[0] is NTTransactResponse)
                {
                    NTTransactResponse response = (NTTransactResponse)reply.Commands[0];
                    NTTransactQuerySecurityDescriptorResponse subcommandResponse = new NTTransactQuerySecurityDescriptorResponse(response.TransParameters, response.TransData);
                    result = subcommandResponse.SecurityDescriptor;
                }
                return(reply.Header.Status);
            }
            return(NTStatus.STATUS_INVALID_SMB);
        }
Ejemplo n.º 2
0
        internal static List <SMB1Command> GetNTTransactResponse(byte[] responseSetup, byte[] responseParameters, byte[] responseData, int maxBufferSize)
        {
            List <SMB1Command> result   = new List <SMB1Command>();
            NTTransactResponse response = new NTTransactResponse();

            result.Add(response);
            int responseSize = NTTransactResponse.CalculateMessageSize(responseSetup.Length, responseParameters.Length, responseData.Length);

            if (responseSize <= maxBufferSize)
            {
                response.Setup = responseSetup;
                response.TotalParameterCount = (ushort)responseParameters.Length;
                response.TotalDataCount      = (ushort)responseData.Length;
                response.TransParameters     = responseParameters;
                response.TransData           = responseData;
            }
            else
            {
                int    currentDataLength = maxBufferSize - (responseSize - responseData.Length);
                byte[] buffer            = new byte[currentDataLength];
                Array.Copy(responseData, 0, buffer, 0, currentDataLength);
                response.Setup = responseSetup;
                response.TotalParameterCount = (ushort)responseParameters.Length;
                response.TotalDataCount      = (ushort)responseData.Length;
                response.TransParameters     = responseParameters;
                response.TransData           = buffer;

                int dataBytesLeftToSend = responseData.Length - currentDataLength;
                while (dataBytesLeftToSend > 0)
                {
                    NTTransactResponse additionalResponse = new NTTransactResponse();
                    currentDataLength = dataBytesLeftToSend;
                    responseSize      = TransactionResponse.CalculateMessageSize(0, 0, dataBytesLeftToSend);
                    if (responseSize > maxBufferSize)
                    {
                        currentDataLength = maxBufferSize - (responseSize - dataBytesLeftToSend);
                    }
                    buffer = new byte[currentDataLength];
                    int dataBytesSent = responseData.Length - dataBytesLeftToSend;
                    Array.Copy(responseData, dataBytesSent, buffer, 0, currentDataLength);
                    additionalResponse.TotalParameterCount   = (ushort)responseParameters.Length;
                    additionalResponse.TotalDataCount        = (ushort)responseData.Length;
                    additionalResponse.TransData             = buffer;
                    additionalResponse.ParameterDisplacement = (ushort)response.TransParameters.Length;
                    additionalResponse.DataDisplacement      = (ushort)dataBytesSent;
                    result.Add(additionalResponse);

                    dataBytesLeftToSend -= currentDataLength;
                }
            }
            return(result);
        }
Ejemplo n.º 3
0
 private static void PrepareResponse(NTTransactResponse response, byte[] responseSetup, byte[] responseParameters, byte[] responseData, int maxBufferSize, List <SMBCommand> sendQueue)
 {
     if (NTTransactResponse.CalculateMessageSize(responseSetup.Length, responseParameters.Length, responseData.Length) <= maxBufferSize)
     {
         response.Setup = responseSetup;
         response.TotalParameterCount = (ushort)responseParameters.Length;
         response.TotalDataCount      = (ushort)responseData.Length;
         response.TransParameters     = responseParameters;
         response.TransData           = responseData;
     }
     else
     {
         throw new NotImplementedException();
     }
 }
Ejemplo n.º 4
0
 private static List <SMB1Command> GetNTTransactResponse(byte[] responseSetup, byte[] responseParameters, byte[] responseData, int maxBufferSize)
 {
     if (NTTransactResponse.CalculateMessageSize(responseSetup.Length, responseParameters.Length, responseData.Length) <= maxBufferSize)
     {
         NTTransactResponse response = new NTTransactResponse();
         response.Setup = responseSetup;
         response.TotalParameterCount = (ushort)responseParameters.Length;
         response.TotalDataCount      = (ushort)responseData.Length;
         response.TransParameters     = responseParameters;
         response.TransData           = responseData;
         return(response);
     }
     else
     {
         throw new NotImplementedException();
     }
 }
Ejemplo n.º 5
0
        internal static SMBCommand GetCompleteNTTransactResponse(SMBHeader header, NTTransactSubcommandName subcommandName, byte[] requestSetup, byte[] requestParameters, byte[] requestData, object share, StateObject state, List <SMBCommand> sendQueue)
        {
            NTTransactSubcommand subcommand         = NTTransactSubcommand.GetSubcommandRequest(subcommandName, requestSetup, requestParameters, requestData, header.UnicodeFlag);
            NTTransactSubcommand subcommandResponse = null;

            if (subcommand is NTTransactCreateRequest)
            {
                header.Status = NTStatus.STATUS_NOT_IMPLEMENTED;
            }
            else if (subcommand is NTTransactIOCTLRequest)
            {
                subcommandResponse = GetSubcommandResponse(header, (NTTransactIOCTLRequest)subcommand);
            }
            else if (subcommand is NTTransactSetSecurityDescriptor)
            {
                header.Status = NTStatus.STATUS_NOT_IMPLEMENTED;
            }
            else if (subcommand is NTTransactNotifyChangeRequest)
            {
                header.Status = NTStatus.STATUS_NOT_IMPLEMENTED;
            }
            else if (subcommand is NTTransactQuerySecurityDescriptorRequest)
            {
                header.Status = NTStatus.STATUS_NOT_IMPLEMENTED;
            }
            else
            {
                header.Status = NTStatus.STATUS_SMB_BAD_COMMAND;
            }

            if (header.Status != NTStatus.STATUS_SUCCESS)
            {
                return(new ErrorResponse(CommandName.SMB_COM_NT_TRANSACT));
            }

            byte[]             responseSetup      = subcommandResponse.GetSetup();
            byte[]             responseParameters = subcommandResponse.GetParameters(header.UnicodeFlag);
            byte[]             responseData       = subcommandResponse.GetData();
            NTTransactResponse response           = new NTTransactResponse();

            PrepareResponse(response, responseSetup, responseParameters, responseData, state.MaxBufferSize, sendQueue);
            return(response);
        }
Ejemplo n.º 6
0
        public NTStatus DeviceIOControl(object handle, uint ctlCode, byte[] input, out byte[] output, int maxOutputLength)
        {
            if ((IoControlCode)ctlCode == IoControlCode.FSCTL_PIPE_TRANSCEIVE)
            {
                return(FsCtlPipeTranscieve(handle, input, out output, maxOutputLength));
            }

            output = null;
            NTTransactIOCTLRequest subcommand = new NTTransactIOCTLRequest();

            subcommand.FID          = (ushort)handle;
            subcommand.FunctionCode = ctlCode;
            subcommand.IsFsctl      = true;
            subcommand.Data         = input;

            NTTransactRequest request = new NTTransactRequest();

            request.Function            = subcommand.SubcommandName;
            request.Setup               = subcommand.GetSetup();
            request.TransParameters     = subcommand.GetParameters(m_client.Unicode);
            request.TransData           = subcommand.GetData();
            request.TotalDataCount      = (uint)request.TransData.Length;
            request.TotalParameterCount = (uint)request.TransParameters.Length;
            request.MaxParameterCount   = NTTransactIOCTLResponse.ParametersLength;
            request.MaxDataCount        = (uint)maxOutputLength;

            TrySendMessage(request);
            SMB1Message reply = m_client.WaitForMessage(CommandName.SMB_COM_NT_TRANSACT);

            if (reply != null)
            {
                if (reply.Header.Status == NTStatus.STATUS_SUCCESS && reply.Commands[0] is NTTransactResponse)
                {
                    NTTransactResponse      response           = (NTTransactResponse)reply.Commands[0];
                    NTTransactIOCTLResponse subcommandResponse = new NTTransactIOCTLResponse(response.Setup, response.TransData);
                    output = subcommandResponse.Data;
                }
                return(reply.Header.Status);
            }
            return(NTStatus.STATUS_INVALID_SMB);
        }