渗透技巧——获得Windows系统的远程桌面连接历史记录
字数 1560 2025-08-29 08:32:09
Windows系统远程桌面连接历史记录获取技术详解
0x00 前言
在渗透测试和安全审计中,远程桌面连接(RDP)的历史记录是重要的信息来源,通过这些记录往往能定位出关键服务器。本文详细介绍如何完整获取Windows系统中的RDP连接历史记录,包括当前用户、已登录用户和所有用户(包括未登录用户)的历史记录。
0x01 技术背景
Windows系统将RDP连接历史记录存储在注册表中,主要涉及以下注册表路径:
- 当前用户:
HKCU:\Software\Microsoft\Terminal Server Client\Servers - 其他用户:
HKEY_USERS\<SID>\Software\Microsoft\Terminal Server Client\Servers
每个连接记录包含服务器地址和可能的用户名提示(UsernameHint)。
0x02 获取当前用户的RDP历史记录
注册表位置
HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Servers
PowerShell实现
$RegPath = "Registry::HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Servers\"
$QueryPath = dir $RegPath -Name
foreach($Name in $QueryPath){
Try {
$User = (Get-ItemProperty -Path $RegPath$Name -ErrorAction Stop | Out-Null).UsernameHint
Write-Host "Server:"$Name
Write-Host "User:"$User"`n"
}
Catch {
Write-Host "No RDP Connections History"
}
}
技术要点
- 使用
dir命令枚举Servers下的所有子项(即连接过的服务器地址) - 通过
Get-ItemProperty获取每个服务器项下的UsernameHint值 - 使用Try-Catch处理可能出现的异常(如键值不存在)
0x03 获取已登录用户的RDP历史记录
注册表位置
HKEY_USERS\<SID>\Software\Microsoft\Terminal Server Client\Servers
获取用户SID的方法
使用WMI查询:
Get-WmiObject -Class Win32_UserAccount
或使用WMIC命令:
wmic /NAMESPACE:"\\root\CIMV2" PATH Win32_UserAccount GET /all /FORMAT:list
PowerShell实现
$AllUser = Get-WmiObject -Class Win32_UserAccount
foreach($User in $AllUser){
$RegPath = "Registry::HKEY_USERS\"+$User.SID+"\Software\Microsoft\Terminal Server Client\Servers\"
Write-Host "User:"$User.Name
Write-Host "SID:"$User.SID
Write-Host "Status:"$User.Status
Try {
$QueryPath = dir $RegPath -Name -ErrorAction Stop
}
Catch {
Write-Host "No RDP Connections History"
Write-Host
continue
}
foreach($Name in $QueryPath) {
Try {
$User = (Get-ItemProperty -Path $RegPath$Name -ErrorAction Stop).UsernameHint
Write-Host "Server:"$Name
Write-Host "User:"$User
}
Catch {
Write-Host "No RDP Connections History"
}
}
Write-Host
}
技术要点
- 需要管理员权限才能访问其他用户的注册表信息
- 通过枚举所有用户的SID来构建完整的注册表路径
- 对于每个用户SID,尝试访问其下的RDP连接记录
- 用户状态可通过
$User.Status获取(需要WMIC查询)
0x04 获取所有用户的RDP历史记录(包括未登录用户)
关键技术:注册表配置单元加载
对于未登录用户,需要通过加载其NTUSER.DAT文件来访问注册表信息:
- 文件位置:
C:\Documents and Settings\<用户名>\NTUSER.DAT - 加载命令:
Reg load HKEY_USERS\<SID> <NTUSER.DAT路径> - 卸载命令:
Reg unload HKEY_USERS\<SID>
PowerShell实现思路
- 获取所有用户的SID和用户名
- 尝试直接读取HKEY_USERS下的注册表信息(已登录用户)
- 对于无法直接读取的用户,尝试加载其NTUSER.DAT文件
- 读取RDP历史记录
- 卸载配置单元
完整实现代码
参考GitHub项目:
https://github.com/3gstudent/List-RDP-Connections-History
技术要点
- 需要管理员权限
- 加载配置单元时需要指定一个唯一的项名称(通常使用用户SID)
- 卸载配置单元可能需要启动新进程(否则可能提示失败)
- 需要处理各种异常情况(如文件不存在、权限不足等)
0x05 防御措施
-
清除RDP历史记录的方法:
- 手动删除注册表项
- 使用工具如woshub提供的清除方法:
http://woshub.com/how-to-clear-rdp-connections-history/#h2_3
-
防御建议:
- 定期清理RDP历史记录
- 限制对注册表的访问权限
- 监控对NTUSER.DAT文件的异常访问
0x06 总结
本文详细介绍了获取Windows系统RDP连接历史记录的三种方法:
- 当前用户:直接查询HKCU下的注册表信息
- 已登录用户:通过HKEY_USERS<SID>路径查询
- 所有用户:结合注册表查询和配置单元加载技术
通过完整的RDP连接历史记录,安全人员可以更好地了解系统的连接情况,发现潜在的安全风险。同时,系统管理员也应了解这些技术,以便更好地保护系统安全。