轉載: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"
實現思路:
- 獲得每個用戶對應的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系統的遠程桌面連接歷史記錄,需要注意的是無法直接獲得未登錄用戶的注冊表配置信息(可以加載配置單元解決)。根據遠程桌面連接歷史記錄,往往能定位出關鍵的服務器