獲得Windows系統的遠程桌面連接歷史記錄


轉載: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對應登錄用戶名

如下圖

 

滲透技巧—獲得Windows系統的遠程桌面連接歷史記錄
 

 

2、獲得已登錄用戶的歷史記錄:

已登錄用戶的注冊表信息會同步保存在HKEY_USERS\SID下,SID要對應每個用戶的SID

當前系統登錄兩個用戶,分別有兩個子項,如下圖

 

滲透技巧—獲得Windows系統的遠程桌面連接歷史記錄
 

 

注:

HKEY_USERS僅包含了缺省用戶設置和登錄用戶的信息,在用戶未登錄時用戶的設置是不可用的

也就是說,如果當前登錄了兩個用戶,那么這兩個用戶的注冊表信息都會保存在HKEY_USERS\SID下,如果第三個用戶未登錄,無法直接獲得該用戶的注冊表信息,也就無法導出該用戶的遠程桌面連接歷史記錄

所以,通過枚舉注冊表鍵值HKEY_USERS\SID\Software\Microsoft\Terminal Server Client\Servers能夠獲得已登錄用戶的遠程桌面連接歷史記錄

3、獲得所有用戶的歷史記錄:

對於未登錄用戶,無法直接獲得注冊表配置信息,這里可以通過加載配置單元的方式來解決

選中HKEY_USERS項,文件加載配置單元,如下圖

 

滲透技巧—獲得Windows系統的遠程桌面連接歷史記錄
 

 

打開用戶的NTUSER.DAT文件,路徑為C:\Documents and Settings\用戶名\NTUSER.DAT

接着指定一個項名稱,即可在HKEY_USERS下讀取該用戶的注冊表配置信息,如下圖

 

滲透技巧—獲得Windows系統的遠程桌面連接歷史記錄
 

 

注:

刪除該項需要通過卸載配置單元來清除

所以,想要獲得所有用戶的遠程桌面連接歷史記錄,首先需要枚舉注冊表鍵值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

測試結果如下圖

 

滲透技巧—獲得Windows系統的遠程桌面連接歷史記錄
 

 

0x04 小結

本文介紹了如何通過powershell獲得Windows系統的遠程桌面連接歷史記錄,需要注意的是無法直接獲得未登錄用戶的注冊表配置信息(可以加載配置單元解決)。根據遠程桌面連接歷史記錄,往往能定位出關鍵的服務器


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM