通过感知哈希算法跟踪视觉相似图像的恶意软件活动
介绍
恶意文档中通常会带有攻击者伪造的一些常见应用程序的图像,其目的是诱使用户执行某些操作,例如禁用Microsoft Office的只读模式(受保护的视图),或是启用宏等。在执行恶意活动时,攻击者往往会重复使用或稍微修改这些图像,借以逃避通过哈希值对其活动的跟踪。本文将描述如何通过感知哈希算法跟踪及检测在涉及视觉相似的恶意文档的活动中分布的恶意软件家族,同时我们还发布了一个名为graph_similar_document_images.py的脚本来应用此技术。
常见应用程序图像
我们从2019年检测到的250个恶意文档样本中,识别出了32个不同的常见应用程序图像,如下表所示。
表1 –应用程序或公司图标检测数量
攻击者最常见的诱骗手段是声称文档“受保护”(13个变体),其次是声称文档与查看的软件版本不兼容(10个变体)。
加密哈希函数
哈希值常用于文件校验或签名,也是威胁情报中常见的一类指示类型。通过一定的哈希算法(典型的有MD5,SHA-1等),能将一段较长的数据映射为较短的哈希值,它的一个特点是唯一性,只要输入的数据发生了微小变化,哈希值也会跟着改变,此属性能用于创建已知恶意文件的指示符(即哈希值),但对跟踪恶意文件中携带的图像来说却不太好使,因为攻击者只要对图像做细微修改就能产生完全不同的哈希(这被称为雪崩效应),这也意味着使用从文件内容中得出的哈希值来跟踪图像的重用并不是一个可靠的解决方案。
示例– 2019年QAKBOT系列活动
2019年10月起,有攻击者展开了Qakbot威胁活动,QakBot是一种能窃取用户凭证的银行木马。图1-3显示了攻击者通过编码的方式随机生成蓝色小圆圈(红圈中所示)、进而阻止通过哈希函数进行跟踪的过程。
图4 –同一批次行动中,由于图像差异而产生的唯一MD5值。
尽管图像之间的视觉差异很小,但由于JPEG文件的编码方式,这些改动也能极大改变文件的组成,如图5所示。
图5 –图1和图2的字节可视化,由binvis.io生成。
感知哈希算法
我们可以通过使用可比较的感知哈希算法代替原本的算法,最简单的感知哈希算法之一是“平均哈希”(Average Hash),它产生的是一个8字节的哈希值。为了演示其工作原理,我们使用Johannes Buchner的Python库ImageHash,来计算QakBot活动中其中一幅图像的平均哈希值。
>>> from PIL import Image
>>> import imagehash
>>> a = imagehash.average_hash(Image.open('sample (1).jpg'))
>>> print(a)
0000c0d3dedc4000
要计算平均哈希,首先需要将图像的大小调整为8×8像素,然后将其转换为灰度来减少颜色的数量,之后是计算图像的平均颜色值。最后,对于每个像素的颜色值,如果高于平均值,则设置为1,如果低于平均值,则设置为0。我们可以打印出一个网格来显示其工作原理。
>>> print(a.hash)
[[False False False False False False False False]
[False False False False False False False False]
[ True True False False False False False False]
[ True True False True False False True True]
[ True True False True True True True False]
[ True True False True True True False False]
[False True False False False False False False]
[False False False False False False False False]]
哈希值0000c0d3dedc4000是从上到下每行的位的十六进制表示,这意味着可以使用汉明距离之类的字符串度量来计算两个哈希之间的距离,从而确定一对平均哈希的相似程度。让我们计算来自QakBot活动中另一个样本的哈希值,然后计算它们的距离。
>>> b = imagehash.average_hash(Image.open('sample (2).jpg'))
>>> print(b)
0000c0d3dedc4000
>>> a-b
0
尽管MD5值不同,但两个图像的“平均哈希值”却匹配。
通过GRAPH_SIMILAR_DOCUMENT_IMAGES.PY脚本的应用实例
我们可以使用感知哈希算法和字符串度量来识别视觉上相似的恶意文档。我们编写了一个名为graph_similar_document_images.py的脚本,将这种方法应用于社会工程图像的检测和识别中。
该脚本首先使用LibreOffice将文档转换成Office Open XML (OOXML)格式,以便可靠地提取嵌入的图像。这一步是必要的,因为大多数恶意文档都使用旧的复合文件二进制文件格式(CFBF)。该脚本提取任何嵌入图像后,会计算它们的平均哈希值,然后计算每个图像哈希之间的距离。最后,如果距离满足相似阈值(默认为87.5%),脚本将图像绘制成图像哈希相似图,如图6和图7所示。
图6 -由graph_similar_document_images.py在恶意文档样本集上生成的图像哈希相似图。
图7 - QakBot活动中使用的视觉相似的社会工程图像的图像哈希相似图。
该脚本还具有一种检测模式,该模式可以识别在视觉上类似于哈希黑名单上的已知不良图像(图8)。
图8 -在检测模式下,graph_similar_document_images.py输出的CSV结果显示的图像签名匹配。
如果在恶意文档的分发活动中出现一个或多个恶意软件家族,也可以将这些家族与图像哈希关联,图像哈希能成为跟踪恶意软件家族活动的有用指标(表2)。
表2 –与根据恶意文档计算出的图像哈希值相关联的恶意软件家族。
本文参考自:https://www.bromium.com/spot-the-difference-tracking-malware-campaigns-using-visually-similar-images/