

渗透技巧——获得Windows系统的远程桌面连接历史记录
source link: https://3gstudent.github.io/3gstudent.github.io/%E6%B8%97%E9%80%8F%E6%8A%80%E5%B7%A7-%E8%8E%B7%E5%BE%97Windows%E7%B3%BB%E7%BB%9F%E7%9A%84%E8%BF%9C%E7%A8%8B%E6%A1%8C%E9%9D%A2%E8%BF%9E%E6%8E%A5%E5%8E%86%E5%8F%B2%E8%AE%B0%E5%BD%95/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

0x00 前言
在渗透测试中,远程桌面连接的历史记录不可忽视,根据历史记录往往能定位出关键的服务器。
前几天有一篇文章介绍了如何清除记录,那么这篇文章就来介绍一下如何导出历史记录。
清除记录的文章地址如下:
http://woshub.com/how-to-clear-rdp-connections-history/#h2_3
最开始的设想是通过枚举注册表就能够完成,但深入研究发现,想要获得所有用户的历史记录,需要逐个获得用户的NTUSER.DAT文件,通过注册表加载配置单元,导入用户配置信息,再进行枚举才能够实现。
0x01 简介
本文将要介绍以下内容:
- 获得历史记录的思路
- 导出登录用户的历史记录
- 导出所有用户的历史记录
- 两种方法的实现思路和脚本编写细节
0x02 获得远程桌面连接历史记录的思路
1、获得当前用户的历史记录:
枚举注册表键值HKCU:\Software\Microsoft\Terminal Server Client\Servers
每个注册表项保存连接的服务器地址,其中的键值UsernameHint
对应登录用户名

2、获得已登录用户的历史记录:
已登录用户的注册表信息会同步保存在HKEY_USERS\SID
下,SID要对应每个用户的SID
当前系统登录两个用户,分别有两个子项,如下图

注:
HKEY_USERS仅包含了缺省用户设置和登录用户的信息,在用户未登录时用户的设置是不可用的
也就是说,如果当前登录了两个用户,那么这两个用户的注册表信息都会保存在HKEY_USERS\SID
下,如果第三个用户未登录,无法直接获得该用户的注册表信息,也就无法导出该用户的远程桌面连接历史记录
所以,通过枚举注册表键值HKEY_USERS\SID\Software\Microsoft\Terminal Server Client\Servers
能够获得已登录用户的远程桌面连接历史记录
3、获得所有用户的历史记录:
对于未登录用户,无法直接获得注册表配置信息,这里可以通过加载配置单元的方式来解决
选中HKEY_USERS项,文件
-加载配置单元
,如下图

打开用户的NTUSER.DAT文件,路径为C:\Documents and Settings\用户名\NTUSER.DAT
接着指定一个项名称,即可在HKEY_USERS下读取该用户的注册表配置信息,如下图

注:
删除该项需要通过卸载配置单元来清除
所以,想要获得所有用户的远程桌面连接历史记录,首先需要枚举注册表键值HKEY_USERS\SID\
,对于未登录用户,需要加载对应的NTUSER.DAT文件,再次枚举获得完整记录,最后卸载对应的注册表项
补充:
通过命令行实现加载配置单元的实例:
Reg load HKEY_USERS\S-1-5-21-1170783345-3748964848-1387080272-1003 C:\Documents and Settings\c\NTUSER.DAT
通过命令行实现卸载配置单元的实例:
Reg unload HKEY_USERS\S-1-5-21-1170783345-3748964848-1387080272-1003
0x03 powershell实现细节
1、获得当前用户的历史记录
位置:HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Servers
枚举指定注册表项下的子项:
dir "Registry::HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Servers" -Name
查询指定注册表项的注册表键值:
(Get-ItemProperty -Path "Registry::HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Servers\192.168.62.137").UsernameHint
加入foreach循环实现枚举:
$RegPath = "Registry::HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Servers\"
$QueryPath = dir $RegPath -Name
foreach($Name in $QueryPath)
{
(Get-ItemProperty -Path $RegPath$Name).UsernameHint
}
加入捕获异常,不输出错误信息,如果查不到注册表键值,返回无法获得
完整脚本:
$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"
}
}
2、获得已登录用户的历史记录
位置:HKEY_USERS\SID\Software\Microsoft\Terminal Server Client\Servers
注:
SID对应每个用户的sid
首先需要枚举所有用户sid
powershell:
Get-WmiObject -Class Win32_UserAccount
wmic /NAMESPACE:"\\root\CIMV2" PATH Win32_UserAccount GET /all /FORMAT:list
枚举用户名及其对应的SID:
$AllUser = Get-WmiObject -Class Win32_UserAccount
foreach($User in $AllUser)
{
Write-Host $User.Name":"$User.SID
}
将以上脚本结合,先枚举用户的SID,查询对应HKEY_USERS下的注册表项,再次枚举注册表键值项,获得完整结果:
(需要管理员权限)
$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 "----------------------------------"
}
注:
$User.Status表示帐户状态,通过Get-WmiObject -Class Win32_UserAccount
无法直接查询到,可通过wmi命令获取:
wmic /NAMESPACE:"\\root\CIMV2" PATH Win32_UserAccount GET /all /FORMAT:list
3、获得所有用户的历史记录
加载配置单元的文件位置:
"C:\Documents and Settings\用户名\NTUSER.DAT"
实现思路:
- 获得每个用户对应的SID,拼接对应的注册表键值”Registry::HKEY_USERS"+$User.SID+”\Software\Microsoft\Terminal Server Client\Servers"
- 如果读取失败,代表此用户未登录,接着尝试加载配置单元
- 拼接配置单元文件位置”C:\Documents and Settings"+$User.Name+”\NTUSER.DAT”
- 配置单元对应的注册表项以该用户的sid命名
- 枚举注册表获得历史记录
- 卸载注册表项
注:
需要新启动一个进程来卸载配置单元,否则提示失败
为了避免使用多个try catch捕获异常,代码结构作了改变,使用If Else作判断,完整实现代码可参考:
https://github.com/3gstudent/List-RDP-Connections-History
测试结果如下图

0x04 小结
本文介绍了如何通过powershell获得Windows系统的远程桌面连接历史记录,需要注意的是无法直接获得未登录用户的注册表配置信息(可以加载配置单元解决)。根据远程桌面连接历史记录,往往能定位出关键的服务器。
Recommend
-
7
0x00 前言 最近从@cpl3h的博客中学到了使用远程桌面协议建立通道的方法。 本文将对这个方法进行整理,结合自己的经验,添加个人理解。 学习地址: https://ijustwannared.team/2019/11/07/c2-over-rdp-virtual-channels...
-
13
渗透技巧——从远程桌面客户端提取明文凭据 0x00 前言 在之前的文章
-
18
0x00 前言 对于Windows系统,经常会用到远程桌面服务,通过界面对系统进行远程管理。 这其中存在一个不足:使用远程桌面服务进行远程登录(使用另一用户或是踢掉当前用户),无法获取到当前用户的系统状态。 如果想要查看(甚至是...
-
11
渗透技巧——利用tscon实现未授权登录远程桌面 0x00 前言 Windows系统下,tscon可被用来切换远程桌面的会话。正常情况下,切换会话时需要提供登录密码,但通过特殊的利用方法能够绕过验证,不输入密码实现未授权登录。...
-
12
0x00 前言 在渗透测试中,经常会接触Windows服务器的远程桌面服务,通过界面对服务器进行管理。而对于普通的Windows系统,在某些条件下也需要进行界面操作。 虽然我们可以通过编写程序来实现界面操作(捕获桌面信息,压缩传输,发送鼠标...
-
9
在 Windows 下建立远程桌面连接 谢益辉 / 2007-08-08 网络最大的好处在于省去了很多跑腿的时间,而不在于有 QQ 可以聊天。Windows 的远程桌面连接也算是节省跑腿功夫的一种办法,它可以通过网络让我们从自己的计算机连接到远程计算...
-
15
Jager · 7月28日 · 2014年linux远程桌面连接 · mstsc · rdesktop
-
5
【踩坑】Windows远程桌面连接失败 2022-08-01 1...
-
8
使用Windows自带的远程桌面 Linux端安装 rdesktop Windows端允许远程桌面 取消勾选网络级别验证 字样 通过命令连接
-
1
ubuntu ssh 远程ubuntu 版本可归为两类,桌面版和服务器版。桌面版(desktop)主要针对个人 pc 使用,带有 GNOME 桌面环境图形化界面,和 windows 类似,可以浏览网页,编辑文档,看视频等,占用系统资源较高,至少需要 4G...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK