导语:在上一篇文章中,我们解释了证书的内部结构,以及这些结构是如何帮助我们检测伪造证书的。本篇文章,我们将提供不同的规则,你们可以使用这些规则来检测证书。
在上一篇文章中,我们解释了证书的内部结构,以及这些结构是如何帮助我们检测伪造证书的。通过开发和使用这种“非良性文件”的白名单检测方法,而不是使用“已知恶意文件”的黑名单检测方法,我们不仅能够检测到已知恶意文件,也能检测出来未知恶意文件。除了YARA规则,我们还创建了Suricata和ClamAV规则,这些规则我下面会讲到。
YARA
这是开始这项研究的YARA规则:
rule certificate_payload { strings: $re1 = /-----BEGIN CERTIFICATE-----\r\n[^M]/ condition: $re1 at 0 }
此YARA规则会搜索字符串“/—–BEGIN CERTIFICATE—–\r\n[^M]/”即BEGIN CERTIFICATE后跟了一个回车符(\ r)以及一个换行符(\ n),最后是任何字符,而不必是大写字母M。它使用正则表达式($ re1 )搜索此字符串,而且必须在文件的开头找到此序列($ re1为0)。
由Microsoft的certutil生成的证书将始终以–BEGIN CERTIFICATE–开头,然后是回车符和换行符,然后是BASE64编码的内容。RFC允许额外的空格,但这不是由certutil生成的,这就是为什么我们不在此YARA规则中考虑额外空格的原因。
请注意,在一个较旧的证书文件规范中,允许在第一行和BASE64有效载荷之间使用标头。虽然我们没有在VirusTotal上观察到这些规则,但我们所提到的这些规则将触发这些旧证书的某些行为。
如果你希望使用YARA规则检测嵌入式证书(例如,另一个文件中的证书),你可以将检测条件从“$ re1 at 0”更改为“@ re1> 0”,如下所示。
rule embedded_certificate_payload { strings: $re1 = /-----BEGIN CERTIFICATE-----\r\n[^M]/ condition: @re1 > 0 }
这意味着你希望正则表达式re1(@ re1)匹配的字符串的位置大于0(> 0),即不是在文件的开头。
另一个BEGIN CERTIFICATE样本也可以在文件中的某个位置找到(即不在位置0),因为.crt文件可以包含多个证书。
由于YARA仍然是许多组织仰仗的新技术,我们还开发了Suricata和ClamAV规则。
Suricata
Suricata是一个免费的开源IDShttps://suricata-ids.org/,suricata是一款开源高性能的入侵检测系统,并支持ips(入侵防御)与nsm(网络安全监控)模式,用来替代原有的snort入侵检测系统,完全兼容snort规则语法和支持lua脚本。
使用以下Suricata规则,你可以监控网络流量,查找不符合正确标准且可能包含恶意载荷的可疑证书文件。
alert http $EXTERNAL_NET any -> $HOME_NET any (msg:"Certificate with unknown content"; flow:established,to_client; file_data; content:"-----BEGIN CERTIFICATE-----|0D 0A|"; depth:29; fast_pattern; byte_test:1,!=,0x4D,0,relative; reference:url,blog.nviso.be/2018/07/31/powershell-inside-a-certificate-part-1/; classtype:misc-activity; sid:1000019; rev:1;) alert http $EXTERNAL_NET any -> $HOME_NET any (msg:"Contains certificate with unknown content"; flow:established,to_client; file_data; content:"-----BEGIN CERTIFICATE-----|0D 0A|"; fast_pattern; byte_test:1,!=,0x4D,0,relative; reference:url,blog.nviso.be/2018/07/31/powershell-inside-a-certificate-part-1/; classtype:misc-activity; sid:1000022; rev:1;)
我们所做的匹配与YARA规则中的匹配完全相同,即搜索–BEGIN CERTIFICATE–后跟回车符和换行符,尽管编码有点不同(–BEGIN CERTIFICATE– | 0D 0A |)。在标头之后,我们使用byte_test操作查找与M(0x4D)不同的字节。
第一个规则在文件(file_data)的开头部分利用此模式查找,而第二个规则则在文件的任何位置利用此模式查找。
ClamAV
ClamAV是一个在命令行下查毒软件,因为它不将杀毒作为主要功能,默认只能查出您计算机内的病毒,但是无法清除,至多删除文件。ClamAV可以工作很多的平台上,但是有少数无法支持,这就要取决您所使用的平台的流行程度了。另外它主要是来防护一些WINDOWS病毒和木马程序。另外,这是一个面向服务端的软件,ClamAV还是免费开源的。
就像Suricata一样,ClamAV可以提供自定义检测签名,这可以帮助你检测恶意文件,例如隐藏在电子邮件附件中的有效载荷。
ClamAV.Certificate.Unknown:0:0:2D2D2D2D2D424547494E2043455254494649434154452D2D2D2D2D0D0A!(4D) ClamAV.ContainsCertificate.Unknown:0:*:??2D2D2D2D2D424547494E2043455254494649434154452D2D2D2D2D0D0A!(4D)
这些签名应存储在.ndb文件中,签名ClamAV.Certificate.Unknown负责检测包含证书数据以外的其他内容的证书文件,比如!(4D)就表示不是M,签名ClamAV.ContainsCertificate.Unknown负责检测包含除证书数据之外的其他内容的嵌入证书文件。
请注意,如果你有最新版本的ClamAV,也可以使用ClamAV的YARA规则。
总结
此研究基于我们的一个假设,即不以大写字母M开头的数据证书是不能包含有效的证书数据的。我们将继续使用我们的规则进行监控,如果有新发现,我们也会写文章及时进行报道。我们建议你利用所讲的规则检测证书的安全性,而不是嵌入证书的有效性。
当然,就像任何基于模式匹配的规则一样,黑客绕过我们的规则检测是轻而易举的事情。例如,添加额外的空格就可以避免被我们的基本规则检测到。这是由于我们搜索时检测规则设置的非常具体,如本文只针对certutil生成的文件,而这只是当前比较流行的恶意操作方式之一。