隐藏在证书文件中的PowerShell(一)

最近,NVISO实验室分析人员开发了某种YARA规则,利用它发现了多种恶意证书文件(.crt),这些证书文件中包含的并不是真正的认证证书,而是一个恶意的PowerShell脚本。作为《隐藏在证书文件中的PowerShell》系列的第1部份,本文中我们一起来探讨如何制作这种YARA规则,去揭开攻击者的这种“潜伏“行为。

认证证书(Certificates)

Windows系统中的证书文件有多种后缀格式,如.cer 和 .crt,通常,.cer 文件包含的是二进制数据,而 .crt 文件包含的则是一些ASCII数据。但随着多种微软应用程序的出现,这两种扩展名可以互换,应用程序仍然也能正确处理这两种互换过后缀扩展名的证书文件(他们会查看证书内容并进行相应的解析)。

本文中我们还是遵守惯例,即用.cer 文件来包含二进制数据,而 .crt 文件来包含ASCII数据。.cer 文件中包含的认证数据是按照DER可辨别编码规则(Distinguished Encoding Rules)来编码的,这是x.690标准指定的编码格式。以Microsoft office程序为例,以下是其安装目录中的 .cer 文件示例:

.crt 文件中包含的是ASCII数据,说白了,它也就是对 .cer文件的base64编码。根据RFC 7468标准来看,.crt 文件格式以“—BEGIN CERTIFICATE”为开头,以“—END CERTIFICATE”为结尾,中间则是一些经base64编码过的数据。使用Certutil工具,可将 .cer文件转换生成 .crt文件,以下就是 .crt的一个示例:

对工具 Certutil 的利用

Certutil是一个Windows下的多功能程序,可用来执行各种证书和服务操作。自从Casey Smith在Twitter上发推演示了Certutil 的 base64解码编码之后,一些红队人员和网络犯罪份子就开始利用这种编码技术来生成各种可绕过入侵检测和杀毒软件的恶意文件。

Certutil不会验证要编码的二进制数据,也就是说,它能对任意文件进行编码。一些Windows 下的可执行程序(PE文件)都能用Certutil工具来轻松完成编码,编码之后的格式,很多入侵检测和杀毒软件都无法识别。以下是Windows可执行程序编码成 .crt文件的示例:

从上图可以看到,这种base64编码数据的第一个字母是T。因为使用Certutil工具进行编码的PE文件通常都是这种类型的:也就是,PE文件的第一个字节是大写字母M,这里的M来自“MZ”,即MS-DOS的主要开发者 Mark Zbikowski 的缩写,用二进制来标记,也就是01001101。而base64编码是以6个比特块来编码的,所以 010011 就是第一个被编码的块,010011 用十进制表示就是19,而在base64编码中,0编码成A,1编码成B,以此类推…,19则被编码成T,如下所示:

这也就是为什么base64编码的PE文件总是以T开头的原因。有很多种检测规则:就比如,如果文件以“—BEGIN CERTIFICATE–”开头,之后是一个大写字母T,那么这种检测规则也能触发。

这就是一种“known-bad”式的检测规则,因为PE文件经Certutil工具编码后存在固定格式,所以,按照这种格式来针对性的查找就行。这种检测规则直接有效,我们利用它已经检测到很多编码过的PE文件。

检测规则制作

然而,在NVISO实验环境中,我们尝试做出比上述“已知恶意文件”(known-bad)更好的检测规则来,所以,这就是我们着力构建检测证书文件不包含真正证书的检测环境原因了,最终,我们的检测规则,不仅能检测出包含PE文件的证书文件,还能检测出其它不包含特定证书数据的恶意证书文件。

X.509格式证书是被广泛使用的数字证书标准,是用于标志通讯各方身份信息的一系列数据。常见的X.509格式证书包含 .cer 和 .crt类证书,它们都以二进制形式存放,不含私钥。

X.509标准证书数据都是以RFC 5280 定义的ASN.1语法来编码的,也就是以ASN.1序列开始的,这个序列标记号为 0x30,所以,这个开头的0x30数据也是经DER编码的二进制数据。

如我们前述的PE文件编码说明,可以确定其在ASCII字节环境下,它是以0x30开头的,而在base64编码过程中,它首先则是以大写字母M开头的。

所以,基于此种原因,根据 RFC 7468标准,任何X.509标准的有效证书文件编码后都是以“—BEGIN CERTIFICATE–”开头,之后紧跟大写字母M。

也就是说,那些包含“—BEGIN CERTIFICATE–”,但之后紧跟的字母不是M的证书文件,它们都不是有效的X.509标准证书文件。

最后,我们以此为方法创建了一条YARA规则,放到了 VirusTotal Intelligence跑了几个月:

发现目标

应用这条YARA规则,我们检测到很多伪装成证书文件的PE文件和一些有意思的其它文件,而且也没对有效证书发出误报。

其中我们检测到比较有意思的一个证书文件是,它的MD5 哈希值为0082aed588f76b517946a824fba43994,大概样子如下:

一开始,在VirusTotal的60个杀毒软件检测引擎中,它的被检测率为0,也就是全部通过,但当我们用base64dump.py对它进行base64解码之后,看到了一些有意思的发现:

这个证书文件竟然包含了经过编码的PowerShell脚本程序,吓得我们….。这个脚本的检测需要几个步骤,在《隐藏在证书文件中的PowerShell》系列的第2部份,我们会继续讨论。

总结

这种使用“非良性文件”(not known-good)而非使用“已知恶意文件”(known-bad)的检测方法,我们不仅能够检测到已知的恶意文件,还能检测出一些未知的恶意文件。除了YARA规则,我们还在Suricata和ClamAV杀毒引擎中创建内置规则,这些规则将在该系列的第3部份公布,未完待续,敬请期待。

*参考来源:nviso,clouds编译,转载请注明来自FreeBuf.COM

原文发布于微信公众号 - FreeBuf(freebuf)

原文发表时间:2018-08-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Seebug漏洞平台

Mirai源码分析

1. 背景概述 最近的德国断网事件让Mirai恶意程序再次跃入公众的视线,相对而言,目前的IoT领域对于恶意程序还是一片蓝海,因此吸引了越来越多的人开始涉足这趟...

51370
来自专栏cs

linux 学习笔记七

来自实验楼的学习笔记,文字基本复制,粘贴。 ? 下载了一个录制gif图的软件,还不错 参考与:在Linux(Ubuntu)下超好用的录屏gif软件!!...

35850
来自专栏YG小书屋

ES5.6 Bulk源码解析

43930
来自专栏程序员Gank

【译】使用RxJava从多个数据源获取数据

试想,需要一些动态数据的时候,只要每次都请求网络就可以了。但是,更有效率的做法是,把联网得到的数据,缓存到磁盘或内存。

16220
来自专栏JackieZheng

RabbitMQ入门-从HelloWorld开始

从读者的反馈谈RabbitMQ 昨天发完《RabbitMQ入门-初识RabbitMQ》,我陆陆续续收到一些反馈。鉴于部分读者希望结合实例来讲 期待下篇详细,最好...

23750
来自专栏FreeBuf

浅谈拒绝服务攻击的原理与防御(3)| 反射DDOS攻击利用代码

0×01 前言 之前发了一篇关于反射DDOS攻击原理以及反射资源扫描的文章,本来今天的这个应该并到那篇文章里,共称为反射DDOS攻击扫描与利用,但是我怕这样做会...

30390
来自专栏用户画像

5.4.3微程序控制器

微程序控制器采用存储逻辑实现,也就是把微操作信号代码化,使每条机器指令转化成为一段微程序并存入一个专门的存储器(控制存储器)中。微操作控制信号由微指令产生。

11110
来自专栏编程札记

深入golang之---goroutine并发控制与通信

本文章通过goroutine同步与通信的一个典型场景-通知子goroutine退出运行,来深入讲解下golang的控制并发。

1.3K70
来自专栏JackieZheng

RabbitMQ入门-从HelloWorld开始

从读者的反馈谈RabbitMQ 昨天发完《RabbitMQ入门-初识RabbitMQ》,我陆陆续续收到一些反馈。鉴于部分读者希望结合实例来讲 期待下篇详细,最好...

21390
来自专栏everhad

App开发:模拟服务器数据接口 - MockApi

为了方便app开发过程中,不受服务器接口的限制,便于客户端功能的快速测试,可以在客户端实现一个模拟服务器数据接口的MockApi模块。本篇文章就尝试为使用gra...

58480

扫码关注云+社区

领取腾讯云代金券