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; 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); m_sessions.Add(sessionID, session);
return session; return session;
} }

View file

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

View file

@ -55,17 +55,18 @@ namespace SMBLibrary.Server.SMB2
{ {
string userName = securityProvider.GetContextAttribute(state.AuthenticationContext, GSSAttributeName.UserName) as string; string userName = securityProvider.GetContextAttribute(state.AuthenticationContext, GSSAttributeName.UserName) as string;
string machineName = securityProvider.GetContextAttribute(state.AuthenticationContext, GSSAttributeName.MachineName) 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); object accessToken = securityProvider.GetContextAttribute(state.AuthenticationContext, GSSAttributeName.AccessToken);
bool? isGuest = securityProvider.GetContextAttribute(state.AuthenticationContext, GSSAttributeName.IsGuest) as bool?; bool? isGuest = securityProvider.GetContextAttribute(state.AuthenticationContext, GSSAttributeName.IsGuest) as bool?;
if (!isGuest.HasValue || !isGuest.Value) if (!isGuest.HasValue || !isGuest.Value)
{ {
state.LogToServer(Severity.Information, "User '{0}' authenticated successfully.", userName); 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 else
{ {
state.LogToServer(Severity.Information, "User '{0}' failed authentication, logged in as guest.", userName); 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; response.SessionFlags = SessionFlags.IsGuest;
} }
} }