前天fireeye出了一份最新的关于APT28的报告,提到了最新的0day组合攻击。其中,包括微软Office的两个EPS图形文件的远程代码执行漏洞 ( CVE-2017-0261, CVE-2017-0262 ),和一个本地提权漏洞(CVE-2017-0263 ). 具体细节已经公开. 2015年火眼曾经公开了一个关于EPS的高危漏洞(CVE-2015-2545),让人记忆深刻。
CVE-2017-0262这个流行样本是名为【Trump’s_Attack_on_Syria_English.docx 】的docx文档,里面嵌入了恶意的eps文件. 个人认为这名字诱惑力很大,在中国的话可以起名为”2017年上海国际车展车模联系名单”,”震撼!女大学生夜跑被..”的头条体。 扯远了,回头。
这个EPS恶意文件通过XOR加密算法做了简单的混淆。解密用的key是0xc45d6491.
$ cat word/media/image1.eps
%!PS-Adobe-3.0
%%BoundingBox: 36 36 576 756
%%Page: 1 1
/A3{ token pop exch pop } def
/A2 def
/A4{
/A1 exch def
0 1 A1 length 1 sub
{ /A5 exch def A1 A5 2 copy get A2 A5 4 mod get xor put } for A1 } def
A4 A3 exec quit
简单的方法是安装postscript程序执行这段代码,即可得到解密结果。
问题来了-什么是PostScript?
PostScript是一种用于描述矢量图形的页面描述语言。简单的说,用PostScript语言写成的文件就是PS格式的图片,一般文件后缀用 ps ,简称为PS文件。作为语言,该文件是可以用编辑器打开查看的。
看到“页面描述语言”这个词,可能会联想到HTML等网页标记语言。没错, PostScript的主要作用就是记载需要打印出的各种文字和图形,但它还是 一种简单的编程语言,支持分支、循环等控制结构,以及数组、字典等简单 的数据结构。
运行PostScript
查看PostScript文件需要使用PostScript解释器。最常见的解释器就是 GhostScript。Windows版只需下载 gs871w32.exe安装即可。Linux下一般都包含在发行版中,使用相应的 管理程序自动安装即可,例如Ubuntu下可以这样安装
$ sudo apt-get install ghostscript
安装完成后即可从开始菜单中启动GhostScript(Linux下直接使用 gs 命令启动)。 启动后出现提示符:
GS>
随后,可以直接在提示符下输入命令,也可以先把命令写成*.ps文件, 再用GhostScript运行。也可以在window下运行,安装包请自行search。
笔者这里手贱,用python解混淆,下面祭献出源码:
#!/usr/bin/env python
#-*- coding: utf-8 -*-
#coding=utf-8
import binascii
b = "c45d6491"
a = "bf7d4bd9a13112f4b03407f0e43b0dffa03b0bffb07d55a1f47d17f2a53101f7ab3310b1b73810f7ab3310b1a3310bf3a53100f8a72944f3a13a0dffe47225a0f77d50a1f46d54a1e43901f7e47225a0f67d25a0f77d55a7e43400f8b27d55b1a53900b1a03802b1eb1c5cb1bf7d4bd0f16944f4bc3e0cb1a03802b1eb1c56a7e4381cf2ac7d00f4a27d4bd0f76a44d0f66b44fda13303e5ac7d00f4a27d4bd0f16a44d0f16944fda13303e5ac7d00f4a27d4bd0f06c44a3f16b44f5a13b44be856c55b1856e53b1856955b1ad390de7e43901f7e42644be856c55b1856c55b1f57d17e4a67d00f4a27d25a0f57d54b1a8291fb1a1250de5e42044f8a27d25a3f27d25a0f57d25a5f57d09e4a87d25a4f07d14e4b0340ae5a12f12f0a87d19b1a8320be1e41c56a7e42044f3"
def fuckit(decrypt_key, data):
length = len(data)
m_data = []
for i in range(length):
m_index = i % len(decrypt_key)
m_key = decrypt_key[m_index]
m_data += chr(ord(data[i])^ ord(m_key))
data = "".join(m_data)
return data
if __name__ == '__main__':
#with open("postscript.txt", 'r') as fp:
# a = fp.read()
m_b = list(binascii.unhexlify(b) )
m_a = list(binascii.unhexlify(a) )
print fuckit(m_b,m_a)
被解密文本如下:
PostScript入门(1)-基本知识 charlee.li
警惕利用CVE-2015-2545漏洞进行的攻击
GMT参考手册
/* 代码不写include的不是好代码,文章不写参考的不是好文章。*/