溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎樣從Windows 10 SSH-Agent中提取SSH私鑰

發(fā)布時(shí)間:2021-11-11 11:49:14 來(lái)源:億速云 閱讀:329 作者:柒染 欄目:編程語(yǔ)言

這篇文章將為大家詳細(xì)講解有關(guān)怎樣從Windows 10 SSH-Agent中提取SSH私鑰,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。

背景

在這個(gè)周末我安裝了Windows 10 Spring Update,最令我期待的就是它的內(nèi)置OpenSSH工具,這意味著Windows管理員不再需要使用Putty和PPK格式的密鑰了。隨后,我花了些時(shí)間來(lái)探索并了解該版本所支持的特性。最終沒(méi)有令我失望,我驚喜地看到ssh-agent.exe也被包含在內(nèi)。在MSDN的一篇關(guān)于使用新Windows ssh-agent文章的以下部分,引起了我的注意:

怎樣從Windows 10 SSH-Agent中提取SSH私鑰

過(guò)去我曾有過(guò)劫持ssh-agent.的相關(guān)經(jīng)驗(yàn),并嘗試過(guò)一些有趣的測(cè)試,所以我決定開(kāi)始查看Windows是如何“安全地”用這個(gè)新的服務(wù)來(lái)存儲(chǔ)您的私鑰的。我將在這篇文章中概述我的方法和步驟,這是一個(gè)非常有趣的過(guò)程。好了,話不多說(shuō)讓我們開(kāi)始我們的旅程吧!

私鑰由DPAPI保護(hù)并存儲(chǔ)在HKCU注冊(cè)表hive中。我在這里發(fā)布了一些PoC代碼,從注冊(cè)表中提取并重構(gòu)RSA私鑰。

在Windows 10中使用OpenSSH

測(cè)試要做的第一件事就是使用OpenSSH生成幾個(gè)密鑰對(duì)并將它們添加到ssh-agent中。

首先,我使用ssh-keygen.exe生成了一些受密碼保護(hù)的測(cè)試密鑰對(duì):

怎樣從Windows 10 SSH-Agent中提取SSH私鑰

然后確保新的ssh-agent服務(wù)正在運(yùn)行,并使用ssh-add將私鑰對(duì)添加到正在運(yùn)行的agent中:

怎樣從Windows 10 SSH-Agent中提取SSH私鑰

運(yùn)行ssh-add.exe -L顯示當(dāng)前由SSH agent管理的密鑰。

最后,在將公鑰添加到Ubuntu box之后,我驗(yàn)證了我可以從Windows 10進(jìn)入SSH,而不需要解密我的私鑰(因?yàn)閟sh-agent正在為我處理):

怎樣從Windows 10 SSH-Agent中提取SSH私鑰

監(jiān)控SSH Agent

為了了解SSH代理是如何存儲(chǔ)和讀取我的私鑰,我開(kāi)始靜態(tài)檢查ssh-agent.exe。然而,我的靜態(tài)分析技能很弱,所以我放棄了,并最終決定采用動(dòng)態(tài)跟蹤這個(gè)過(guò)程的方式,看看它在做什么。

我使用了Sysinternals的procmon.exe,并為包含“ssh”的任意進(jìn)程名稱添加了一個(gè)過(guò)濾器。

隨著procmon捕獲事件,我再次進(jìn)入我的Ubuntu機(jī)器。查看所有的事件,我看到ssh.exe打開(kāi)了一個(gè)TCP連接到Ubuntu,以及ssh-agent.exe進(jìn)入并從Registry中讀取了一些值:

怎樣從Windows 10 SSH-Agent中提取SSH私鑰

這里有兩個(gè)非常重要的點(diǎn):

進(jìn)程ssh-agent.exe讀取來(lái)自HKCU\Software\OpenSSH\Agent\Keys的鍵值

讀取這些值后,立即打開(kāi)了dpapi.dll。

正因?yàn)槿绱?,我現(xiàn)在知道某種受保護(hù)的數(shù)據(jù)被存儲(chǔ)在注冊(cè)表中并從注冊(cè)表中被讀取,ssh-agent正在使用微軟的數(shù)據(jù)保護(hù)API。

測(cè)試注冊(cè)表值

果然,在注冊(cè)表中,可以看到我使用ssh-add添加的兩個(gè)鍵項(xiàng)。密鑰名稱是公開(kāi)密鑰的指紋,并且存在一些二進(jìn)制blobs:

怎樣從Windows 10 SSH-Agent中提取SSH私鑰

怎樣從Windows 10 SSH-Agent中提取SSH私鑰

我能夠pull注冊(cè)表值并操作它們?!白⑨尅弊侄沃皇茿SCII編碼文本,是我添加的密鑰的名稱:

怎樣從Windows 10 SSH-Agent中提取SSH私鑰

(默認(rèn)值)只是一個(gè)字節(jié)數(shù)組,沒(méi)有解碼出任何有意義的東西。我有一個(gè)預(yù)感,這是“加密”私鑰,那么我是否能pull并解密它呢。我把字節(jié)pull到了一個(gè)Powershell變量:

怎樣從Windows 10 SSH-Agent中提取SSH私鑰

解除密鑰保護(hù)

雖然我知道很多后利用工具可以濫用它來(lái)取出憑據(jù),但我對(duì)DPAPI并不太熟悉,因此我也知道其他人可能已經(jīng)實(shí)現(xiàn)了一個(gè)wrapper。通過(guò)Google搜索,我找到了一個(gè)簡(jiǎn)單的單線程wrapper。

我仍然不知道這是否可行,但我試圖使用DPAPI去解除字節(jié)數(shù)組的保護(hù)。Base64編碼結(jié)果如下:

Add-Type -AssemblyName System.Security  
$unprotectedbytes = [Security.Cryptography.ProtectedData]::Unprotect($keybytes, $null, 'CurrentUser')

[System.Convert]::ToBase64String($unprotectedbytes)

返回的Base64看起來(lái)不像是私鑰,但我只是為了好玩而解碼它,然而對(duì)于里面出現(xiàn)的“ssh-rsa”字符串我感到非常的驚喜。

怎樣從Windows 10 SSH-Agent中提取SSH私鑰

找出二進(jìn)制格式

這部分是我花時(shí)間最長(zhǎng)的一部分。我知道我有某種鍵的二進(jìn)制表示,但我無(wú)法找出格式或如何使用它。

我用openssl,puttygen和ssh-keygen來(lái)生成各種RSA密鑰,但從來(lái)沒(méi)有得到類(lèi)似于我擁有的二進(jìn)制文件的任何東西。

最后,在大量的Google之后,我從NetSPI找到了一篇關(guān)于從Linux上的ssh-agent的內(nèi)存轉(zhuǎn)儲(chǔ)中取出OpenSSH私鑰的文章:https://blog.netspi.com/stealing-unencrypted-ssh-agent-keys-from-memory/

難道是二進(jìn)制格式相同嗎?我從博客中獲取了Python腳本,并為它提供了我從Windows注冊(cè)表中獲得的不受保護(hù)的base64 blob:

怎樣從Windows 10 SSH-Agent中提取SSH私鑰

可以正常工作了!我不知道原作者soleblaze是如何找出二進(jìn)制數(shù)據(jù)的正確格式的,但在這里我要特別感謝他所做的以及他的分享!

在證明可以從注冊(cè)表中提取私鑰后,我將PoC分享到了GitHub。

GitHub Repo

第一個(gè)是Powershell腳本(extract_ssh_keys.ps1),用于查詢注冊(cè)表中被ssh-agent保存的任何密鑰。然后使用DPAPI與當(dāng)前用戶上下文來(lái)解除二進(jìn)制保護(hù),并將其保存在Base64中。由于我不知道如何在Powershell中解析二進(jìn)制數(shù)據(jù),所以我把所有的密鑰保存到了一個(gè)JSON文件中,然后我可以在Python中導(dǎo)入。Powershell腳本只有幾行:

$path = "HKCU:\Software\OpenSSH\Agent\Keys\"

$regkeys = Get-ChildItem $path | Get-ItemProperty

if ($regkeys.Length -eq 0) {  
    Write-Host "No keys in registry"
    exit
}

$keys = @()

Add-Type -AssemblyName System.Security;

$regkeys | ForEach-Object {
    $key = @{}
    $comment = [System.Text.Encoding]::ASCII.GetString($_.comment)
    Write-Host "Pulling key: " $comment
    $encdata = $_.'(default)'
    $decdata = [Security.Cryptography.ProtectedData]::Unprotect($encdata, $null, 'CurrentUser')
    $b64key = [System.Convert]::ToBase64String($decdata)
    $key[$comment] = $b64key
    $keys += $key
}

ConvertTo-Json -InputObject $keys | Out-File -FilePath './extracted_keyblobs.json' -Encoding ascii  
Write-Host "extracted_keyblobs.json written. Use Python script to reconstruct private keys: python extractPrivateKeys.py extracted_keyblobs.json"

我大量借用了parse_mem_python.py中的代碼,并將其更新為Python 3,用于下一個(gè)腳本:extractPrivateKeys.py。從Powershell腳本生成的JSON將輸出所有的RSA私鑰:

怎樣從Windows 10 SSH-Agent中提取SSH私鑰

這些RSA私鑰是未加密的。雖然我創(chuàng)建它們時(shí),添加了一個(gè)密碼,但它們使用ssh-agent未加密存儲(chǔ),所以我不再需要密碼。

為了驗(yàn)證,我將密鑰復(fù)制回了Kali linux box中驗(yàn)證了指紋,并將其應(yīng)用到了SSH中!怎樣從Windows 10 SSH-Agent中提取SSH私鑰

關(guān)于怎樣從Windows 10 SSH-Agent中提取SSH私鑰就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI