转载:http://www.mottoin.com/tech/109219.html

渗透技巧—获得Windows系统的远程桌面连接历史记录

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

wmi:

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"

实现思路:

  1. 获得每个用户对应的SID,拼接对应的注册表键值”Registry::HKEY_USERS”+$User.SID+”\Software\Microsoft\Terminal Server Client\Servers”
  2. 如果读取失败,代表此用户未登录,接着尝试加载配置单元
  3. 拼接配置单元文件位置”C:\Documents and Settings”+$User.Name+”\NTUSER.DAT”
  4. 配置单元对应的注册表项以该用户的sid命名
  5. 枚举注册表获得历史记录
  6. 卸载注册表项

注:

需要新启动一个进程来卸载配置单元,否则提示失败

为了避免使用多个try catch捕获异常,代码结构作了改变,使用If Else作判断,完整实现代码可参考:

https://github.com/3gstudent/List-RDP-Connections-History

测试结果如下图

 

0x04 小结

本文介绍了如何通过powershell获得Windows系统的远程桌面连接历史记录,需要注意的是无法直接获得未登录用户的注册表配置信息(可以加载配置单元解决)。根据远程桌面连接历史记录,往往能定位出关键的服务器

获得Windows系统的远程桌面连接历史记录的更多相关文章

  1. windows系统如何远程桌面连接

    转至:https://jingyan.baidu.com/article/67662997adb46a54d51b84bd.html 远程桌面连接是一种通过网络技术,远程操作另一台电脑的过程,随着wi ...

  2. Win10系统进行远程桌面连接出现身份验证错误怎么办

    在win10系统中,自带有远程桌面连接功能,但是有时候会遇到一些问题,比如有不少用户反映说在进行远程桌面连接的时候,出现身份验证错误的情况,导致远程连接失败,接下来给大家分享一下Win10系统进行远程 ...

  3. Linux和Windows系统的远程桌面访问知识(转载)

    为新手讲解Linux和Windows系统的远程桌面访问知识   很多新手都是使用Linux和Windows双系统的,它们之间的远程桌面访问是如何连接的,我们就为新手讲解Linux和Windows系统的 ...

  4. 如何修改windows Server 2012 远程桌面连接默认端口

    如何修改windows Server 2012 远程桌面连接默认端口   修改windows 2012/win8.win7远程桌面连接默认端口一般需要修改注册表四个地方[HKEY_LOCAL_MACH ...

  5. Win7系统 mstsc远程桌面连接失败,提示“您的凭据不工作” 或者“无法连接到远程计算机”的问题。

    WIN7 mstsc远程桌面连接其他电脑,提示"您的凭据不工作xxxxxxx"的问题. 或者提示: 本机通过mstsc远程桌面连接服务器,我们按照下面的步骤来逐一排查: 本机配置以 ...

  6. mstsc Windows局域网内远程桌面连接

    1.检查被连接计算机的远程桌面连接功能是否开启  控制面板->系统和安全->系统->远程设置->远程桌面->勾选"仅允许运行使用网络级别身份验证的远程桌面的计算 ...

  7. 详细故障排除步骤:针对 Azure 中到 Windows VM 的远程桌面连接问题

    本文提供详细的故障排除步骤,用于为基于 Windows 的 Azure 虚拟机诊断和修复复杂的远程桌面错误. Important 若要消除更常见的远程桌面错误,请务必先阅读远程桌面的基本故障排除文章, ...

  8. Windows 10家庭版远程桌面连接错误

    由于需要操作远程服务器,经常使用“远程桌面连接”工具,一直很正常.今天突然提示 出现身份验证错误,可能是由于 CredSSP加密Oracle修正.什么情况!! 根据提示的地址https://go.mi ...

  9. 同网段下,windows自带远程桌面连接

    1.服务器关闭防火墙 2.右键点击’我的电脑‘进入’属性‘点击左侧菜单栏中的’远程设置‘: 把远程桌面选项设置成’允许运行任意版本远程桌面的计算机连接‘. 3.客户端点击“开始”在附件菜单下面找到“远 ...

随机推荐

  1. Python基础入门-列表解析式

    今天我们使用Python中的列表解析式来实现一些简单功能.好了关于列表解析式是什么?我的理解是它可以根据已有列表,高效创建新列表的方式.列表解析是Python迭代机制的一种应用,它常用于实现创建新的列 ...

  2. Linq学习<二>

    http://www.cnblogs.com/wyqlijin/archive/2011/02/25/1964934.html 这位仁兄写的比较高深,建议大家看看 一: 这一篇以一个数据类为例,操作数 ...

  3. 20145218张晓涵 PC平台逆向破解_advanced

    ---恢复内容开始--- 20145218张晓涵 PC平台逆向破解_advanced shellcode注入 基础知识 shellcode就是在利用溢出攻击溢出时要值入的代码,也就是溢出后去执行的代码 ...

  4. CentOS7-扩容挂载磁盘

    1.1查看新磁盘,可以看到/dev/sdb是新的未挂载的磁盘: [root@localhost ~]# fdisk -l 1.2硬盘分区 ,进入fdisk模式 进入fdisk模式 [root@loca ...

  5. duilib入门简明教程 -- 第一个程序 Hello World(3)

    小伙伴们有点迫不及待了么,来看一看Hello World吧: 新建一个空的win32项目,新建一个main.cpp文件,将以下代码复制进去: #include <windows.h> #i ...

  6. 第七篇 Python面向对象

    类是对一群具有相同特征或者行为的事物的一个统称,是抽象的,不能直接使用,特征被称为属性,行为被称为方法,类就相当于制造飞机时的图纸,是一个模板,是负责创建对象的. 对象是由类创建出来的一个具体存在,可 ...

  7. php代码审计4审计代码执行漏洞

    代码执行漏洞代码执行漏洞是指应用程序本身过滤不严,用户可以通过请求将代码注入到应用中执行,当应用在调用一些能将字符串转化成代码的函数(如php中的eval)时,没有考虑到用户是否能控制这个字符串,造成 ...

  8. rsync入门

    rsync是Linux/unix下一个用于远程文件(目录)同步的一个精巧的小工具程序,有很多文章讨论了其功能和实现原理,本文主要就不赘述了. 主要介绍下实践时使用的一些方法和细枝末节留作工作笔记以便日 ...

  9. Python里生成器的问题

    任何包含yield语句的函数称为生成器.

  10. python3入门之列表和元组

    获得更多资料欢迎进入我的网站或者 csdn或者博客园 前面一张主要学习了Python的安装,以及第一个程序helloword的编写,以及简单的输入和输出函数,这章主要介绍序列,列表,元组 序列  这章 ...