在Windows中跟踪和分析远程桌面活动日志
在本文中,请仔细考虑在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连接的历史记录。