在Windows中跟踪和分析远程桌面活动日志

时间:2020-01-09 10:46:48  来源:igfitidea点击:

在本文中,请仔细考虑在Windows中审核和分析RDP连接日志的功能。通常,当调查系统在取证任务中调查RDS(终端)Windows服务器上RDP相关活动时,当系统管理员必须提供有关哪些用户登录到RDS服务器,特定RDP用户时,所描述的方法可能很有用。通过身份验证并结束了会话,用户连接了哪个设备(名称或者IP地址)。我认为此信息对于RDS服务器场的管理员和Internet上发布的单独RDP服务器的所有者都将很有用(Windows VPS仍然很流行)。

本文适用于在Windows Server 2008 R2、2012/R2、2015和台式机Windows版本(Windows 10、8.1和7)中分析RDP日志的情况。

我们可以使用Windows事件查看器(

eventvwr.msc

)。 Windows日志包含大量数据,因此很难找到所需的事件。当用户远程连接到RDS(RDP)的远程桌面时,Windows事件查看器中将显示全部事件。有几个不同的日志,我们可以其中找到有关远程桌面连接的信息。好好看一下管理员可能感兴趣的RDP连接主要阶段的日志和事件:

  • 网络连接;
  • 验证;
  • 登录;
  • 会话断开/重新连接;
  • 注销。

"网络连接"是从用户RDP客户端到服务器的网络连接的建立。这是带有EventID1149(

Remote Desktop Services: User authentication succeeded

)。如果找到此事件,则并不意味着用户身份验证已成功。该日志位于应用程序和服务日志-> Microsoft-> Windows->Terminal-Services-RemoteConnectionManager>操作中。启用此事件的日志过滤器(右键单击日志->过滤当前日志-> EventId 1149)。

然后,我们将获得一个事件列表,其中包含与此服务器的所有RDP连接的历史记录。如我们所见,日志提供了用户名,域(在这种情况下使用网络级身份验证;如果禁用了NLA,则事件文本看起来会有所不同)以及已建立RDP连接的计算机的IP地址。发起。

身份验证显示RDP用户是否已在服务器上成功通过身份验证。日志位于Windows->安全性中。因此,我们可能对EventID为" 4624"的事件感兴趣(

An account was successfully logged on

)或者4625(

An account failed to log on

)。请注意事件描述中的LogonType值。如果在登录过程中使用了远程桌面服务来创建新会话,则LogonType = 10。如果LogonType = 7,则表示用户已重新连接到现有RDP会话。

同时,我们可以在"帐户名称"字段中的事件描述中找到用户名,在"工作站名称"中找到计算机名,并在"源网络地址"中找到IP地址。

请注意" TargetLogonID" fiedl的值。它是用户RDP会话的唯一ID,有助于跟踪用户的进一步活动。但是,如果RDP会话断开连接,并且用户重新连接到它,则将为他们分配一个新的TargetLogonID(尽管RDP会话仍然相同)。

我们可以使用以下PowerShell命令获取与成功的RDP身份验证相关的事件列表(EventID 4624):

Get-EventLog security -after (Get-date -hour 0 -minute 0 -second 0) | ?{$_.eventid -eq 4624 -and $_.Message -match 'logon type:\s+(10)\s'} | Out-GridView

"登录"是指RDP登录系统,该事件在用户成功通过身份验证后出现。这是一个EventID为21的事件(

Remote Desktop Services: Session logon succeeded

)。此事件位于应用程序和服务日志-> Microsoft-> Windows->TerminalServices-LocalSessionManager->操作中。如我们所见,在这里我们可以找到用户RDP会话的ID"会话ID"。

EventID为21的事件(

Remote Desktop Services: Shell start notification received

)表示资源管理器shell程序已成功启动(桌面出现在用户的RDP会话中)。

会话断开/重新连接会话断开/重新连接事件具有不同的ID,具体取决于导致用户断开连接的原因(断开连接到不活动状态,会话中用户选择了断开连接选项,RDP会话由另一位用户或者管理员终止等)。 。我们可以在"应用程序和服务日志-> Microsoft-> Windows-> TerminalServices-LocalSessionManager->操作"中的日志中找到这些事件。让我们考虑最有趣的RDP事件:

  • 事件ID 24(
Remote Desktop Services: Session has been disconnected

)用户已断开与RDP会话的连接;

  • 事件ID 25(
Remote Desktop Services: Session reconnection succeeded

)用户已重新连接到服务器上现有的RDP会话;

  • 事件ID 39(
Session <A> has been disconnected by session <B>

)用户已通过选择相应的菜单选项(而不是仅关闭RDP客户端窗口)而与RDP会话断开连接。如果会话ID不同,则表明该用户已被另一个用户(或者管理员)断开连接;

  • EventID 40(
Session <A> has been disconnected, reason code <B>

)。在这里,我们必须查看事件描述中的断开连接原因代码。例如:

  • 原因码0(
No additional information is available

)通常表示用户刚刚关闭了RDP客户端窗口;

  • 原因码5(
The client’s connection was replaced by another connection

)表示用户已重新连接到上一个RDP会话;

  • 原因码11(
User activity has initiated the disconnect

)表示用户已单击开始菜单中的断开连接按钮。

Windows->安全日志中的事件ID为4778的事件(会话已重新连接到Window Station)。用户已重新连接到RDP会话(为用户分配了新的LogonID)。

Windows->安全日志中带有EventID4799的事件(

A session was disconnected from a Window Station

)。用户已从RDP会话断开连接。

"注销"是指用户从系统注销。它被记录为带有EventID23的事件(

Remote Desktop Services: Session logoff succeeded

)在应用程序和服务日志-> Microsoft-> Windows-> TerminalServices-LocalSessionManager->操作中。

同时事件ID为4634的事件(

An account was logged off

)出现在安全日志中。

事件ID为9009的事件(

The Desktop Window Manager has exited with code <X>

)在系统日志中表示用户已从RDP会话发起注销,并且该用户的窗口和图形shell均已终止。

这是一个简短的PowerShell脚本,该脚本从终端RDS服务器日志中列出了当天所有RDP连接的历史记录。结果表显示连接时间,客户端IP地址和远程用户名(如果需要,我们可以在报告中包括其他LogonType)。

Get-EventLog -LogName Security -after (Get-date -hour 0 -minute 0 -second 0)| ?{(4624,4778) -contains $_.EventID -and $_.Message -match 'logon type:\s+(10)\s'}| %{
(new-object -Type PSObject -Property @{
TimeGenerated = $_.TimeGenerated
ClientIP = $_.Message -replace '(?smi).*Source Network Address:\s+([^\s]+)\s+.*',''
UserName = $_.Message -replace '(?smi).*Account Name:\s+([^\s]+)\s+.*',''
UserDomain = $_.Message -replace '(?smi).*Account Domain:\s+([^\s]+)\s+.*',''
LogonType = $_.Message -replace '(?smi).*Logon Type:\s+([^\s]+)\s+.*',''
})
} | sort TimeGenerated -Descending | Select TimeGenerated, ClientIP `
, @{N='Username';E={'{0}\{1}' -f $_.UserDomain,$_.UserName}} `
, @{N='LogType';E={
switch ($_.LogonType) {
2 {'Interactive - local logon'}
3 {'Network connection to shared folder)'}
4 {'Batch'}
5 {'Service'}
7 {'Unlock (after screensaver)'}
8 {'NetworkCleartext'}
9 {'NewCredentials (local impersonation process under existing connection)'}
10 {'RDP'}
11 {'CachedInteractive'}
default {"LogType Not Recognised: $($_.LogonType)"}
}
}}

有时,在Excel表中查看和调查RDP日志可能更方便,因此我们可以将任何Windows事件导出到文本文件中,然后将其导入Excel中。我们可以从命令查看器中从事件查看器GUI导出日志(仅在未清除事件日志的情况下):

WEVTUtil query-events Security > c:\ps\rdp_security_log.txt

或者像这样:

get-winevent -logname "Microsoft-Windows-TerminalServices-LocalSessionManager/Operational" | Export-Csv c:\ps\rdp_connection_log.txt  -Encoding UTF8

我们可以使用以下命令在RDS服务器上显示当前远程会话的列表:

qwinsta

该命令返回会话ID(ID),用户名(USERNAME)和会话状态(Active/Disconnect)。如果需要使用影子连接,则需要获取用户RDP会话的ID时,可以方便地使用此命令。

我们可以显示特定RDP会话中正在运行的进程的列表(指定了会话ID):

qprocess /id:5

RDP客户端上的日志信息不多,但是我们可以在用户注册表中检查RDP连接的历史记录。