SMB2: Retrieve SessionKey from GSS mechanism and store it in SMB2Session

This commit is contained in:
Tal Aloni 2017-03-02 16:34:50 +02:00
parent 641613ae8e
commit 3e4d40b7ad
3 changed files with 16 additions and 5 deletions

View file

@ -44,9 +44,9 @@ namespace SMBLibrary.Server
return null;
}
public SMB2Session CreateSession(ulong sessionID, string userName, string machineName, object accessToken)
public SMB2Session CreateSession(ulong sessionID, string userName, string machineName, byte[] sessionKey, object accessToken)
{
SMB2Session session = new SMB2Session(this, sessionID, userName, machineName, accessToken);
SMB2Session session = new SMB2Session(this, sessionID, userName, machineName, sessionKey, accessToken);
m_sessions.Add(sessionID, session);
return session;
}

View file

@ -16,6 +16,7 @@ namespace SMBLibrary.Server
{
private SMB2ConnectionState m_connection;
private ulong m_sessionID;
private byte[] m_sessionKey;
private SecurityContext m_securityContext;
// Key is TreeID
@ -28,10 +29,11 @@ namespace SMBLibrary.Server
// Key is the persistent portion of the FileID
private Dictionary<ulong, OpenSearch> m_openSearches = new Dictionary<ulong, OpenSearch>();
public SMB2Session(SMB2ConnectionState connection, ulong sessionID, string userName, string machineName, object accessToken)
public SMB2Session(SMB2ConnectionState connection, ulong sessionID, string userName, string machineName, byte[] sessionKey, object accessToken)
{
m_connection = connection;
m_sessionID = sessionID;
m_sessionKey = sessionKey;
m_securityContext = new SecurityContext(userName, machineName, connection.ClientEndPoint, connection.AuthenticationContext, accessToken);
}
@ -138,6 +140,14 @@ namespace SMBLibrary.Server
m_openSearches.Remove(fileID);
}
public byte[] SessionKey
{
get
{
return m_sessionKey;
}
}
public SecurityContext SecurityContext
{
get

View file

@ -55,17 +55,18 @@ namespace SMBLibrary.Server.SMB2
{
string userName = securityProvider.GetContextAttribute(state.AuthenticationContext, GSSAttributeName.UserName) as string;
string machineName = securityProvider.GetContextAttribute(state.AuthenticationContext, GSSAttributeName.MachineName) as string;
byte[] sessionKey = securityProvider.GetContextAttribute(state.AuthenticationContext, GSSAttributeName.SessionKey) as byte[];
object accessToken = securityProvider.GetContextAttribute(state.AuthenticationContext, GSSAttributeName.AccessToken);
bool? isGuest = securityProvider.GetContextAttribute(state.AuthenticationContext, GSSAttributeName.IsGuest) as bool?;
if (!isGuest.HasValue || !isGuest.Value)
{
state.LogToServer(Severity.Information, "User '{0}' authenticated successfully.", userName);
state.CreateSession(request.Header.SessionID, userName, machineName, accessToken);
state.CreateSession(request.Header.SessionID, userName, machineName, sessionKey, accessToken);
}
else
{
state.LogToServer(Severity.Information, "User '{0}' failed authentication, logged in as guest.", userName);
state.CreateSession(request.Header.SessionID, "Guest", machineName, accessToken);
state.CreateSession(request.Header.SessionID, "Guest", machineName, sessionKey, accessToken);
response.SessionFlags = SessionFlags.IsGuest;
}
}