NegotiateHelper.cs 4.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. /* Copyright (C) 2014-2017 Tal Aloni <tal.aloni.il@gmail.com>. All rights reserved.
  2. *
  3. * You can redistribute this program and/or modify it under the terms of
  4. * the GNU Lesser Public License as published by the Free Software Foundation,
  5. * either version 3 of the License, or (at your option) any later version.
  6. */
  7. using System;
  8. using System.Collections.Generic;
  9. using System.Text;
  10. using SMBLibrary.Authentication.GSSAPI;
  11. using SMBLibrary.Authentication.NTLM;
  12. using SMBLibrary.SMB1;
  13. using Utilities;
  14. namespace SMBLibrary.Server.SMB1
  15. {
  16. /// <summary>
  17. /// Negotiate helper
  18. /// </summary>
  19. internal class NegotiateHelper
  20. {
  21. internal static NegotiateResponse GetNegotiateResponse(SMB1Header header, NegotiateRequest request, GSSProvider securityProvider, ConnectionState state)
  22. {
  23. NegotiateResponse response = new NegotiateResponse();
  24. response.DialectIndex = (ushort)request.Dialects.IndexOf(SMBServer.NTLanManagerDialect);
  25. response.SecurityMode = SecurityMode.UserSecurityMode | SecurityMode.EncryptPasswords;
  26. response.MaxMpxCount = 50;
  27. response.MaxNumberVcs = 1;
  28. response.MaxBufferSize = 16644;
  29. response.MaxRawSize = 65536;
  30. response.Capabilities = Capabilities.Unicode |
  31. Capabilities.LargeFiles |
  32. Capabilities.NTSMB |
  33. Capabilities.RpcRemoteApi |
  34. Capabilities.NTStatusCode |
  35. Capabilities.NTFind |
  36. Capabilities.InfoLevelPassthrough |
  37. Capabilities.LargeRead |
  38. Capabilities.LargeWrite;
  39. response.SystemTime = DateTime.UtcNow;
  40. response.ServerTimeZone = (short)-TimeZone.CurrentTimeZone.GetUtcOffset(DateTime.Now).TotalMinutes;
  41. NegotiateMessage negotiateMessage = CreateNegotiateMessage();
  42. ChallengeMessage challengeMessage;
  43. NTStatus status = securityProvider.GetNTLMChallengeMessage(out state.AuthenticationContext, negotiateMessage, out challengeMessage);
  44. if (status == NTStatus.SEC_I_CONTINUE_NEEDED)
  45. {
  46. response.Challenge = challengeMessage.ServerChallenge;
  47. }
  48. response.DomainName = String.Empty;
  49. response.ServerName = String.Empty;
  50. return response;
  51. }
  52. internal static NegotiateResponseExtended GetNegotiateResponseExtended(NegotiateRequest request, Guid serverGuid)
  53. {
  54. NegotiateResponseExtended response = new NegotiateResponseExtended();
  55. response.DialectIndex = (ushort)request.Dialects.IndexOf(SMBServer.NTLanManagerDialect);
  56. response.SecurityMode = SecurityMode.UserSecurityMode | SecurityMode.EncryptPasswords;
  57. response.MaxMpxCount = 50;
  58. response.MaxNumberVcs = 1;
  59. response.MaxBufferSize = 16644;
  60. response.MaxRawSize = 65536;
  61. response.Capabilities = Capabilities.Unicode |
  62. Capabilities.LargeFiles |
  63. Capabilities.NTSMB |
  64. Capabilities.RpcRemoteApi |
  65. Capabilities.NTStatusCode |
  66. Capabilities.NTFind |
  67. Capabilities.InfoLevelPassthrough |
  68. Capabilities.LargeRead |
  69. Capabilities.LargeWrite |
  70. Capabilities.ExtendedSecurity;
  71. response.SystemTime = DateTime.UtcNow;
  72. response.ServerTimeZone = (short)-TimeZone.CurrentTimeZone.GetUtcOffset(DateTime.Now).TotalMinutes;
  73. response.ServerGuid = serverGuid;
  74. return response;
  75. }
  76. private static NegotiateMessage CreateNegotiateMessage()
  77. {
  78. NegotiateMessage negotiateMessage = new NegotiateMessage();
  79. negotiateMessage.NegotiateFlags = NegotiateFlags.UnicodeEncoding |
  80. NegotiateFlags.OEMEncoding |
  81. NegotiateFlags.Sign |
  82. NegotiateFlags.LanManagerSessionKey |
  83. NegotiateFlags.NTLMSessionSecurity |
  84. NegotiateFlags.AlwaysSign |
  85. NegotiateFlags.Version |
  86. NegotiateFlags.Use128BitEncryption |
  87. NegotiateFlags.Use56BitEncryption;
  88. negotiateMessage.Version = NTLMVersion.Server2003;
  89. return negotiateMessage;
  90. }
  91. }
  92. }