风尘剑心 发布于2022年11月8日 分享 发布于2022年11月8日 0x00 前言 在渗透测试中,远程桌面连接的历史是不可忽略的,根据历史往往可以定位到关键服务器。 前几天有一篇关于如何清除记录的文章,所以这篇文章将介绍如何导出历史记录。 记录的文章地址如下: http://woshub.com/how-to-clear-rdp-connections-history/#h2_3 最初的假设是可以通过枚举注册表来实现。但是深入研究发现,如果想要获取所有用户的历史记录,就需要获取用户的NTUSER。DAT文件,通过注册表加载hive,导入用户配置信息,然后枚举。 0x01 简介 本文将介绍以下内容: 关于获取史料的思考 导出已登录用户的历史记录。 导出所有用户的历史记录 两种方法的实现思路和脚本编写细节。 0x02 获得远程桌面连接历史记录的思路 1、获得当前用户的历史记录: 枚举注册表项hkcu:\ software \ Microsoft \ terminal server client \ servers 每个注册表项存储连接的服务器地址,键值UsernameHint对应于登录用户名。 如下图 2、获得已登录用户的历史记录: 登录用户的注册表信息会同步保存在HKEY _用户\SID下,SID要对应每个用户的SID。 目前,系统以两个子项目登录两个用户,如下图所示。 注: HKEY _用户只包含默认用户设置和已登录用户的信息,用户未登录时用户设置不可用。 也就是说,如果当前有两个用户登录,那么这两个用户的注册表信息都将保存在HKEY _用户\SID下。如果第三个用户没有登录,则无法直接获取该用户的注册表信息,也无法导出该用户的远程桌面连接历史。 因此,通过枚举注册表项HKEY _用户\ SID \软件\微软\终端服务器客户端\服务器,可以获得已登录用户的远程桌面连接历史。 3、获得所有用户的历史记录: 对于未注册的用户,无法直接获取注册表配置信息,可以通过加载hive来解决。 选择HKEY _用户,文件加载配置单元,如下图所示 打开用户的NTUSER。路径为C:\ Documents and Settings \ username \ \ ntuser . DAT的DAT文件。 然后在key用户下指定一个键名来读取该用户的注册表配置信息,如下图所示。 注: 删除此项需要通过卸载配置单元来清除。 因此,如果您想要获得所有用户的远程桌面连接的历史,您需要首先枚举注册表项HKEY _用户\SID。对于未登录的用户,需要加载相应的NTUSER。DAT文件,再次枚举以获取完整的记录,最后卸载相应的注册表项。 补充: 通过命令行加载配置单元的实例: reg load HKEY _用户\ S-1-5-21-1170783345-3748964848-1387080272-1003 C:\文档和设置\ c \用户。数据;数字录音带 通过命令行卸载配置单元实例: 注册卸载HKEY _用户\ S-1-5-21-1170783345-3748964848-1387080272-1003 0x03 powershell实现细节 1、获得当前用户的历史记录 位置:HKEY当前用户软件微软终端服务器客户端服务器 在注册表项下指定子项: dir 'Registry:HKEY当前用户\软件\微软\终端服务器客户端\服务器'-Name 指定查询注册表项的注册表项值: (Get-item property-Path ' Registry:HKEY _当前_用户\软件\微软\终端服务器客户端\服务器\192.168.62.137 ')。用户名提示 加入foreach循环实现枚举: $RegPath='Registry:HKEY当前用户\软件\ Microsoft \终端服务器客户端\服务器' $QueryPath=dir $RegPath -Name foreach($Name in $QueryPath) { (Get-item property-Path $ RegPath $ Name)。用户名提示 } 捕捉异常,不输出错误信息,如果找不到注册表项,就无法得到返回。 完整脚本: $RegPath='Registry:HKEY当前用户\软件\ Microsoft \终端服务器客户端\服务器' $QueryPath=dir $RegPath -Name foreach($Name in $QueryPath) { 尝试 { $ User=(Get-item property-Path $ RegPath $ Name-error action Stop)。用户名提示 “写主机”服务器:“$Name “写主机”用户:“$ User”` n” } 捕捉 { 写主机"没有RDP连接历史" } } 2、获得已登录用户的历史记录 位置:HKEY _用户\ SID \软件\微软\终端服务器客户端\服务器 注: (同突发球形扰动)电离层的突然骚扰对应每个用户的(同突发球形扰动)电离层的突然骚扰 首先需要枚举所有用户(同突发球形扰动)电离层的突然骚扰 powershell: get-wmio object-Class Win32 _ user帐户 wmi: wmic/NAMESPACE:"\ \ root \ CIM v2 "路径Win32 _用户帐户GET/all/FORMAT:list 枚举用户名及其对应的希德: $ all user=Get-wmio object-Class Win32 _ user帐户 foreach($User in $AllUser) { 写主机$用户.名称':' $用户。(同突发球形扰动)电离层的突然骚扰 } 将以上脚本结合,先枚举用户的希德,查询对应HKEY _用户下的注册表项,再次枚举注册表键值项,获得完整结果: (需要管理员权限) $ all user=Get-wmio object-Class Win32 _ user帐户 foreach($User in $AllUser) { $RegPath='Registry:HKEY用户$用户.希德\软件\微软\终端服务器客户端\服务器' "写主机"用户:" $User " .名字 写主机的SID:“$用户”.(同突发球形扰动)电离层的突然骚扰 "写入主机"状态:" $User " .状态 尝试 { $ query path=dir $ RegPath-Name-error操作停止 } 捕捉 { 写主机"没有RDP连接历史" 写主机'-' 继续 } foreach($Name in $QueryPath) { 尝试 { $ User=(Get-item property-Path $ RegPath $ Name-error action Stop).用户名提示 "写主机"服务器:" $Name "写主机"用户:" $用户 } 捕捉 { 写主机"没有RDP连接历史" } } 写主机'-' } 注: $用户。状态表示帐户状态,通过get-wmio object-Class Win32 _ user帐户无法直接查询到,可通过wmi命令获取: wmic/NAMESPACE:"\ \ root \ CIM v2 "路径Win32 _用户帐户GET/all/FORMAT:list 3、获得所有用户的历史记录 加载配置单元的文件位置: 丙:\文档和设置\用户名\ n用户。"日期" 实现思路: 获得每个用户对应的希德,拼接对应的注册表键值"注册表* HKEY用户的$用户.SID " \软件\微软\终端服务器客户端\服务器" 如果读取失败,代表此用户未登录,接着尝试加载配置单元 拼接配置单元文件位置" C:\Documents and Settings' $User .名称" \用户. DAT " 配置单元对应的注册表项以该用户的(同突发球形扰动)电离层的突然骚扰命名 枚举注册表获得历史记录 卸载注册表项 注: 需要新启动一个进程来卸载配置单元,否则提示失败 为了避免使用多个试着接住捕获异常,代码结构作了改变,使用否则作判断,完整实现代码可参考: https://github.com/3gstudent/List-RDP-Connections-History 测试结果如下图 0x04 小结 本文介绍了如何通过powershell获得Windows操作系统操作系统系统的远程桌面连接历史记录,需要注意的是无法直接获得未登录用户的注册表配置信息(可以加载配置单元解决)。根据远程桌面连接历史记录,往往能定位出关键的服务器。 留下回复 链接帖子 意见的链接 分享到其他网站 更多分享选项…
推荐的帖子