渗透技巧——获得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"
    }
}

技术要点

  1. 使用dir命令枚举Servers下的所有子项(即连接过的服务器地址)
  2. 通过Get-ItemProperty获取每个服务器项下的UsernameHint值
  3. 使用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
}

技术要点

  1. 需要管理员权限才能访问其他用户的注册表信息
  2. 通过枚举所有用户的SID来构建完整的注册表路径
  3. 对于每个用户SID,尝试访问其下的RDP连接记录
  4. 用户状态可通过$User.Status获取(需要WMIC查询)

0x04 获取所有用户的RDP历史记录(包括未登录用户)

关键技术:注册表配置单元加载

对于未登录用户,需要通过加载其NTUSER.DAT文件来访问注册表信息:

  1. 文件位置:C:\Documents and Settings\<用户名>\NTUSER.DAT
  2. 加载命令:Reg load HKEY_USERS\<SID> <NTUSER.DAT路径>
  3. 卸载命令:Reg unload HKEY_USERS\<SID>

PowerShell实现思路

  1. 获取所有用户的SID和用户名
  2. 尝试直接读取HKEY_USERS下的注册表信息(已登录用户)
  3. 对于无法直接读取的用户,尝试加载其NTUSER.DAT文件
  4. 读取RDP历史记录
  5. 卸载配置单元

完整实现代码

参考GitHub项目:
https://github.com/3gstudent/List-RDP-Connections-History

技术要点

  1. 需要管理员权限
  2. 加载配置单元时需要指定一个唯一的项名称(通常使用用户SID)
  3. 卸载配置单元可能需要启动新进程(否则可能提示失败)
  4. 需要处理各种异常情况(如文件不存在、权限不足等)

0x05 防御措施

  1. 清除RDP历史记录的方法:

  2. 防御建议:

    • 定期清理RDP历史记录
    • 限制对注册表的访问权限
    • 监控对NTUSER.DAT文件的异常访问

0x06 总结

本文详细介绍了获取Windows系统RDP连接历史记录的三种方法:

  1. 当前用户:直接查询HKCU下的注册表信息
  2. 已登录用户:通过HKEY_USERS<SID>路径查询
  3. 所有用户:结合注册表查询和配置单元加载技术

通过完整的RDP连接历史记录,安全人员可以更好地了解系统的连接情况,发现潜在的安全风险。同时,系统管理员也应了解这些技术,以便更好地保护系统安全。

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历史记录 注册表位置 PowerShell实现 技术要点 使用 dir 命令枚举Servers下的所有子项(即连接过的服务器地址) 通过 Get-ItemProperty 获取每个服务器项下的UsernameHint值 使用Try-Catch处理可能出现的异常(如键值不存在) 0x03 获取已登录用户的RDP历史记录 注册表位置 获取用户SID的方法 使用WMI查询: 或使用WMIC命令: PowerShell实现 技术要点 需要管理员权限才能访问其他用户的注册表信息 通过枚举所有用户的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连接历史记录,安全人员可以更好地了解系统的连接情况,发现潜在的安全风险。同时,系统管理员也应了解这些技术,以便更好地保护系统安全。