public static void TrySendCommand(Socket socket, SMB2Command request, byte[] encryptionKey) { SessionMessagePacket packet = new SessionMessagePacket(); if (encryptionKey != null) { byte[] requestBytes = request.GetBytes(); packet.Trailer = SMB2Cryptography.TransformMessage(encryptionKey, requestBytes, request.Header.SessionID); } else { packet.Trailer = request.GetBytes(); } TrySendPacket(socket, packet); }
public static void TrySendCommand(Socket socket, SMB2Command request) { SessionMessagePacket packet = new SessionMessagePacket(); packet.Trailer = request.GetBytes(); TrySendPacket(socket, packet); }
public static Task TrySendCommandAsync(Socket socket, SMB2Command request, CancellationToken cancellationToken = default) { SessionMessagePacket packet = new SessionMessagePacket(); packet.Trailer = request.GetBytes(); return(TrySendPacketAsync(socket, packet, cancellationToken)); }
private static void EnqueueResponse(ConnectionState state, SMB2Command response) { SessionMessagePacket packet = new SessionMessagePacket(); packet.Trailer = response.GetBytes(); state.SendQueue.Enqueue(packet); state.LogToServer(Severity.Verbose, "SMB2 response queued: {0}, Packet length: {1}", response.CommandName.ToString(), packet.Length); }
internal void TrySendCommand(SMB2Command request) { if (m_dialect == SMB2Dialect.SMB202 || m_transport == SMBTransportType.NetBiosOverTCP) { request.Header.CreditCharge = 0; request.Header.Credits = 1; m_availableCredits -= 1; } else { if (request.Header.CreditCharge == 0) { request.Header.CreditCharge = 1; } //NOTE: This is not a legitimate fix. This is a band-aid for an off by one that occurs due to the check for request.Header.CreditCharge == 0 above. if ((m_availableCredits == 0 && request.Header.CreditCharge == 1) || (m_availableCredits == 15 && request.Header.CreditCharge == 16)) { m_availableCredits += 1; } if (m_availableCredits < request.Header.CreditCharge) { throw new Exception("Not enough credits"); } m_availableCredits -= request.Header.CreditCharge; if (m_availableCredits < DesiredCredits) { request.Header.Credits += (ushort)(DesiredCredits - m_availableCredits); } } request.Header.MessageID = m_messageID; request.Header.SessionID = m_sessionID; if (m_signingRequired) { request.Header.IsSigned = (m_sessionID != 0 && (request.CommandName == SMB2CommandName.TreeConnect || request.Header.TreeID != 0)); if (request.Header.IsSigned) { request.Header.Signature = new byte[16]; // Request could be reused byte[] buffer = request.GetBytes(); byte[] signature = new HMACSHA256(m_sessionKey).ComputeHash(buffer, 0, buffer.Length); // [MS-SMB2] The first 16 bytes of the hash MUST be copied into the 16-byte signature field of the SMB2 Header. request.Header.Signature = ByteReader.ReadBytes(signature, 0, 16); } } TrySendCommand(m_clientSocket, request); if (m_dialect == SMB2Dialect.SMB202 || m_transport == SMBTransportType.NetBiosOverTCP) { m_messageID++; } else { m_messageID += request.Header.CreditCharge; } }
internal void TrySendCommand(SMB2Command request, bool encryptData) { if (m_dialect == SMB2Dialect.SMB202 || m_transport == SMBTransportType.NetBiosOverTCP) { request.Header.CreditCharge = 0; request.Header.Credits = 1; m_availableCredits -= 1; } else { if (request.Header.CreditCharge == 0) { request.Header.CreditCharge = 1; } if (m_availableCredits < request.Header.CreditCharge) { throw new Exception("Not enough credits"); } m_availableCredits -= request.Header.CreditCharge; if (m_availableCredits < DesiredCredits) { request.Header.Credits += (ushort)(DesiredCredits - m_availableCredits); } } request.Header.MessageID = m_messageID; request.Header.SessionID = m_sessionID; // [MS-SMB2] If the client encrypts the message [..] then the client MUST set the Signature field of the SMB2 header to zero if (m_signingRequired && !encryptData) { request.Header.IsSigned = (m_sessionID != 0 && ((request.CommandName == SMB2CommandName.TreeConnect || request.Header.TreeID != 0) || (m_dialect == SMB2Dialect.SMB300 && request.CommandName == SMB2CommandName.Logoff))); if (request.Header.IsSigned) { request.Header.Signature = new byte[16]; // Request could be reused byte[] buffer = request.GetBytes(); byte[] signature = SMB2Cryptography.CalculateSignature(m_signingKey, m_dialect, buffer, 0, buffer.Length); // [MS-SMB2] The first 16 bytes of the hash MUST be copied into the 16-byte signature field of the SMB2 Header. request.Header.Signature = ByteReader.ReadBytes(signature, 0, 16); } } TrySendCommand(m_clientSocket, request, encryptData ? m_encryptionKey : null); if (m_dialect == SMB2Dialect.SMB202 || m_transport == SMBTransportType.NetBiosOverTCP) { m_messageID++; } else { m_messageID += request.Header.CreditCharge; } }
internal async Task TrySendCommandAsync(SMB2Command request, CancellationToken cancellationToken) { if (m_dialect == SMB2Dialect.SMB202 || m_transport == SMBTransportType.NetBiosOverTCP) { request.Header.CreditCharge = 0; request.Header.Credits = 1; m_availableCredits -= 1; } else { if (request.Header.CreditCharge == 0) { request.Header.CreditCharge = 1; } if (m_availableCredits < request.Header.CreditCharge) { throw new Exception("Not enough credits"); } m_availableCredits -= request.Header.CreditCharge; if (m_availableCredits < DesiredCredits) { request.Header.Credits += (ushort)(DesiredCredits - m_availableCredits); } } request.Header.MessageID = m_messageID; request.Header.SessionID = m_sessionID; if (m_signingRequired) { request.Header.IsSigned = (m_sessionID != 0 && (request.CommandName == SMB2CommandName.TreeConnect || request.Header.TreeID != 0)); if (request.Header.IsSigned) { request.Header.Signature = new byte[16]; // Request could be reused byte[] buffer = request.GetBytes(); byte[] signature = new HMACSHA256(m_sessionKey).ComputeHash(buffer, 0, buffer.Length); // [MS-SMB2] The first 16 bytes of the hash MUST be copied into the 16-byte signature field of the SMB2 Header. request.Header.Signature = ByteReader.ReadBytes(signature, 0, 16); } } await TrySendCommandAsync(m_clientSocket, request, cancellationToken); if (m_dialect == SMB2Dialect.SMB202 || m_transport == SMBTransportType.NetBiosOverTCP) { m_messageID++; } else { m_messageID += request.Header.CreditCharge; } }
public static ulong TrySendCommand(Socket socket, SMB2Command request) { ulong ret = 0; SessionMessagePacket packet = new SessionMessagePacket(); packet.Trailer = request.GetBytes(); if (TrySendPacket(socket, packet)) { ret = request.Header.MessageID; } return(ret); }
internal void TrySendCommand(SMB2Command request) { request.Header.Credits = 1; request.Header.MessageID = m_messageID; request.Header.SessionID = m_sessionID; if (m_signingRequired) { request.Header.IsSigned = (m_sessionID != 0 && (request.CommandName == SMB2CommandName.TreeConnect || request.Header.TreeID != 0)); if (request.Header.IsSigned) { request.Header.Signature = new byte[16]; // Request could be reused byte[] buffer = request.GetBytes(); byte[] signature = new HMACSHA256(m_sessionKey).ComputeHash(buffer, 0, buffer.Length); // [MS-SMB2] The first 16 bytes of the hash MUST be copied into the 16-byte signature field of the SMB2 Header. request.Header.Signature = ByteReader.ReadBytes(signature, 0, 16); } } TrySendCommand(m_clientSocket, request); m_messageID++; }