检测隐藏在证书文件中的恶意代码(一)

SoftNight 系统安全 2018年8月7日发布

导语:借助NVISO分析师开发的YARA工具,这是一款识别和分类恶意软件样本的开源工具,利用其精妙的匹配规则,我们发现很多证书文件中并没有包含有效的证书,而是一个PowerShell脚本。本篇文章,我们将解释如何构造精妙的YARA规则。

借助NVISO分析师开发的YARA工具,这是一款识别和分类恶意软件样本的开源工具,利用其精妙的匹配规则,我们发现很多证书文件中并没有包含有效的证书,而是一个PowerShell脚本。本篇文章,我们将解释如何构造精妙的YARA规则。

证书

Windows中的证书扩展名有好几种,比如.cer和.crt。通常而言,.cer文件是二进制数据,而.crt文件包含的是ASCII数据。但是随着微软程序和工具的不断发展,这些扩展名可以修改转换,并且程序依然能够正确处理证书文件(程序会读取文件内容并进行解析)。 

出于本文目的,我们还是使用标准扩展名格式,cer文件包含二进制数据,crt文件包含ASCII数据。

cer文件包含依据DER(Distinguished Encoding Rules)规则编码的证书数据,这是x.690标准中指定的编码格式。

以下是Microsoft office安装目录中的cer文件示例:

1.png

crt文件包含的是ASCII数据,是对cer文件的base64编码。根据RFC7468,这些文件开头是“—BEGIN CERTIFICATE”,结尾是“—END CERTIFICATE”,中间是base64编码的数据。以下是使用certutil工具将cer文件转换生成的crt文件示例:

2.png

使用certutil

certutil是一个多功能的Windows可执行程序,用来执行各种各样的证书和服务操作。由于Casey Smith发了推文讲解certutilbase64解码和编码,红队成员和犯罪分子便使用这种编码技术来生成各种各样的文件绕过IDS和AV。

certutil并不验证要进行编码的二进制数据,它会对任意文件进行编码。使用certutil工具,可以很容易的对Windows executeable文件(PE文件)进行编码,编码之后的格式,很多IDS系统和杀软程序都无法识别PE文件。以下是Windows可执行文件编码成crt文件的例子:

3.png

请注意,base64编码数据的第一个字母是T。使用certutil工具进行编码的PE文件通常都是这种情况:PE文件的第一个字节是大写字母M(来自“MZ”,MZ”是Mark Zbikowski的缩写,Mark ZbikowskiMS-DOS的主要开发者之一。),以二进制表示也就是01001101.而base64编码是以6个bit位进行编码的,所以010011是第一个进行编码的块,010011以十进制表示就是19。在base64编码中,0编码成A,1编码成B,以此类推,19编码成T。如图所示:

4.png

这就是为什么base64编码总是以T开头。

检测的规则多种多样:如果检测到文件以“—BEGIN CERTIFICATE–”开头,然后是一个大写字母T,规则就会触发。

这种检测规则也就是所谓的“已知恶意文件”黑名单检测。一个可执行文件经过certutil工具编码后的格式是怎样的,这是众所周知的,所以检测引擎就会针对性的查找。

这种规则非常有效,我们已经利用它检测到很多经过编码的PE文件。

检测

然而,在NVISO实验室,我们尝试比“已知恶意文件”做得更好。这就是我们着手制定规则来检测不包含证书内容的证书文件的原因。所以,不仅能检测出包含Windows可执行文件的证书文件,也能检测出任何不包含特定证书数据的证书文件。

证书(X.509标准)数据始终以RFC5280定义的序列元素ASN.1开头,序列元素的标记号是0x30,所以,以0x30开头的数据是经过DER编码的二进制数据。

5.png

正如我们解释PE文件那样,我们可以确定字节值0x30(即ASCII数字0)在base64中是如何表示的:是以大写字母M开头。

结论:依据RFC7468,任何X.509标准的证书文件编码后都是以“—BEGIN CERTIFICATE–”开头,然后紧跟着大写字母M。

推论:每个证书文件包含“—BEGIN CERTIFICATE–”,但是紧跟着的字母不是M的都不是有效的X.509标准证书文件。

基于此,我们创建了一条YARA规则,并且在VirusTotal Intelligence运行了几个月。

rule certificate_payload
{
    strings:
        $re1 = /-----BEGIN CERTIFICATE-----\r\n[^M]/

    condition:
        $re1 at 0
}

通过这条规则,我们检测到很多伪装成证书文件的可执行文件和一些非常有意思的文件。有效证书没有出现误报。

其中我们检测到的一个有意思的文件包含了MD5 hash值0082aed588f76b517946a824fba43994。

6.png

在VirusTotal的60次检测中,一次都没有检测到,但是当我们用base64dump.py进行分析时,发现了一些异常的东西:

7.png

8.png

这个文件竟然包含了经过编码的PowerShell脚本,这可不是一个好兆头。对此脚本的检测需要分几个步骤,我们将在第2部分中讲到。

总结

通过开发和使用这种“非良性文件”的白名单检测方法,而不是使用“已知恶意文件”的黑名单检测方法,我们不仅能够检测到已知恶意文件,也能检测出来未知恶意文件。除了YARA规则,我们还创建了Suricata和ClamAV规则,这些规则我将在本系列第三篇文章发布出来,敬请期待。

本文翻译自:https://blog.nviso.be/2018/07/31/powershell-inside-a-certificate-part-1/如若转载,请注明原文地址: http://www.4hou.com/system/12907.html
点赞 5
  • 分享至
取消

感谢您的支持,我会继续努力的!

扫码支持

打开微信扫一扫后点击右上角即可分享哟

发表评论