
最近,PT ESC专家发现了一个名为“ Invitation November 29-30,2018.pub”(1edd5b6a02ec82cec381c1a1ec74a67e)的发布者格式文档。 在本文中,我们将告诉您看起来普通的文档如何变成特洛伊木马,从而使攻击者可以从网络摄像头捕获图像,通过命令记录声音或在检测到Skype窗口时运行PowerShell脚本,截屏,从媒体设备复制文件。
因此,当您打开文档时,将出现一个窗口,其中包含模糊的文档存根和包含Microsoft Publisher脚本的请求。

用户打开它后,文档中内置的脚本将以JavaScript运行。 看起来像这样:

该脚本的结果将是从Base64中解码两个文件PDF和EXE。 这两个文件都将写入C:\ Users \ {用户名} \ AppData \ Roaming \ DBFUpdate。 因此,两个文件都将被执行,并且用户将在文档屏幕上看到这样的存根:

寻宝猎人
攻击者使用具有大量功能的多模块RAT,以提供对受感染计算机的完全访问权限。
代码特点:
- 完全用C ++编写,具有大量内部使用的STL构造。
- boost库的应用,尤其是JSON和Archive。
- 调试功能(有关stager的更多信息)。
主木马
主木马固定在受害者的计算机上,是一个从C2加载恶意模块的平台。
首先,stager初始化工作目录,该目录随后将存储模块收集的信息,模块工作所需的实用程序等。

以下是用于创建工作目录的路径的初始化:

创建必要的目录后,主木马会收集有关受感染计算机的信息,并将其发送到控制服务器。
Troyan对此类数据感兴趣:
- 运行主木马的操作系统版本的标识符;
- 默认界面语言
- Service Pack OS的主要版本号;
- 计算机名称和机器标识符(有关获取机器标识符的详细信息,请参见网络协议部分)。
这是有关受感染机器的信息的收集方式:

接下来,通过修改注册表中HKCU \ Environment \ UserInitMprLogonScript的值将主木马固定在受感染的计算机上。 在工作目录初始化期间分配的可执行文件的名称将写入此处,在这种情况下,它等于“ DCTHOST.exe”。
Hexacorn博客上介绍了此方法,APT28和Cobalt组在其ComDLLDroper中也使用了此方法。

初始化主木马的最后一步是将可执行文件从其当前位置复制到工作目录中,该文件的名称与初始化工作目录时选择的名称相同。
初始化主木马后,将准备接收命令。 核心模块已添加到正在运行的模块列表中,该列表是主要木马。 接下来,从核心模块启动一个标识符为0的命令。在主模块中没有此命令的实现,而只是存根。 核心模块对象的构造函数如下所示。

最后,两个线程启动。 其中一个线程启动一个计时器,该计时器默认情况下每秒唤醒一次,并尝试从C2请求命令。

第二个流加载其他库和标准模块。 库与模块一样,都有一个标识符,但是与模块不同,库标识符是负的,以-1开头,并朝着较小的数字增长。 以下是从C2下载的库的列表。

主木马的调试功能
在其工作的开始,即初始化后,主木马立即通过SetUnhandledExceptionFilter设置了异常处理程序,该程序包含有趣的功能。 发生异常时,它们将落入处理程序中,该处理程序将编写应用程序的小型转储,同时还保存有关异常的信息。 然后,它会自行重启。 在屏幕上-创建一个小型转储:

网络协议
软件和C2之间的交换使用自写的二进制协议进行。 每个消息都使用BinPackage(来自RTTI的名称)进行描述。 每个BinPackage本质上都是std :: vector的包装,该包装存储PackageRecord集(名称是发明的)。 PackageRecord是用于存储数据的最小单位。
struct PackageRecord { _DWORD dataId; _DWORD datatype; _DWORD szData; char[] data; };
有关此结构的字段的更多信息:
- dataId-指示记录的类型。 该条目要么是模块标识符,要么是命令标识符,或者是有效载荷。
- szData-记录中存储的数据大小。
- datatype是一种数据类型。
总共记录了三种数据类型的使用:
- 值为“ 0”意味着必须将记录中存储的数据解释为DWORD。
- 值“ 1”-记录中存储的数据必须解释为ASCIIZ字符串。
- 值“ 2”-记录中存储的数据必须解释为加密数据/原始缓冲区。
将BinPackage发送到控制服务器时,会将机器标识符添加到其中。 标识符是从中剪切所有特殊字符的部分的GUID。 在图中-获取机器标识符:

在发送之前,存储在BinPackage中的所有记录将顺序收集在单个缓冲区中并进行加密。 为了进行加密,使用了
WinAES库,特别是AES-128-CBC。
使用CryptoAPI Windows,将生成两个16字节的伪随机数组。 一个用于IV,另一个用于密钥。 执行加密,并将加密的数据添加回BinPackage,该文件包含加密的数据包,由三个条目组成:
- ID为0x777的记录-包含用于加密的密钥;
- ID为0x555的记录-包含用于加密的IV;
- ID为0x999的记录-包含加密数据(通常,具有该ID的记录表示有效负载,不仅用于存储加密数据)。
加密过程结束后,再次将生成的BinPackage收集在单个缓冲区中,并通过HTTP POST请求发送到管理服务器151.80.237.222。

以下是包含机器信息的软件包的示例:

这是带有系统信息的加密数据包的示例:

模组
每个模块(Core除外)均从控制服务器加载。 所有模块都可以分为两类-自动加载的模块和根据控制服务器的请求加载的模块。
请求模块的包的示例:

对模块请求的响应:

每个模块都有一个简单的界面,该界面包含三个功能:加载Init模块时调用,在fini完成时调用,以及更改模块配置的功能。 每个模块还具有一个名为GetModule的导出,该导出将构建一个表示该模块的对象,并将其返回给主木马。 我们发现的所有模块都是使用反射加载在内存中启动的。

此外,模块的名称以它们在RTTI中作为类名称出现的形式给出。
CCore模块
该模块代表基本功能,直接内置于主木马中。 可以在下表中看到其构造函数:
模块编号 | 团队编号 | 内容描述 |
---|
0 | 0 | 基本上,木马而不是命令是存根,无法确定其确切目的 |
1个 | 修改模块配置 |
2 | 索取计算机信息 |
3 | 从控制服务器下载实用程序 |
4 | 请求列出包含实用程序的目录 |
5 | 下载模块并执行 |
CShell模块
此模块为受感染的计算机提供远程外壳。 初始化模块后,将创建cmd.exe进程,并在该进程上附加了两个管道:一个用于标准输入,一个用于标准输出,通过该管道从控制服务器接收和传输命令,反之亦然。 同样在此刻,一个线程启动,该线程自动获取所有输出并将其发送到控制服务器。 该图显示了CShell模块的初始化。

模块编号 | 团队编号 | 内容描述 |
---|
2 | 0 | 发送命令到外壳 |
1个 | 打印文件。 读取文件,从控制服务器发送到该文件的路径,并将此文件的内容上载到控制服务器 |
2 | 获取系统中所有现有磁盘的列表。 数据以JSON格式发送到控制服务器 |
3 | 从控制服务器下载文件。 从控制服务器接收文件和数据的路径 |
CFileSystemBrowser模块
这是一个被动模块,根据要求,该模块允许您接收有关文件系统结构的信息。 这是CFileSystemBrowser模块的初始化发生的方式:

模块编号 | 团队编号 | 内容描述 |
---|
3 | 0 | 获取系统中所有现有磁盘的列表。 数据以JSON格式发送到C2 |
1个 | 获取目录列表。 列表以JSON格式生成 |
2 | 打印文件。 读取文件,将路径从C2传输到该文件,并将此文件的内容上载到C2 |
3 | 删除文件。 文件的路径是从C2传输的 |
CScreenShot模块
该模块允许您从网络摄像头拍摄屏幕截图或捕获图像。 它可以根据请求并在计时器中的特定时间段内执行此操作。

模块编号 | 团队编号 | 内容描述 |
---|
4 | 0 | 截屏并发送到控制服务器 |
1个 | 运行计时器,然后从计算机屏幕上截取屏幕截图。 生成的屏幕截图打包在BinPackage中,并保存到logs文件夹中。 文件名是使用带有前缀“ MS_”的GetTempFileName API生成的。 |
2 | 获取受感染机器上可用设备的视频 |
3 | 从网络摄像头捕获帧并将其发送到控制服务器 |
CSender模块
该模块最初并未激活。 它将日志文件夹的内容上载到控制服务器。 当请求更改配置(包含验证时间)时,将激活该功能。

CKeylogger模块
该模块最初也未激活。 当对配置更改的请求到达时,该请求被激活,其中包含存储日志的缓冲区的大小。 输入的拦截是通过
rawinput进行的 。 另外,键盘记录器监视用户在其中进行输入的窗口并记录其标题。

CDictaphone模块
该模块通过命令或在检测到Skype窗口时记录声音。 启动后,它将启动一个线程,该线程列出系统中的所有窗口及其子窗口,并在类名称为TLiveConversation或TCallMonitorControl的类中查找该窗口。 如果找到这样的窗口,则记录开始。 下面是CDictaphone模块的初始化:

和Skype窗口搜索

通过发送特殊命令通过MCI完成记录。 这是CDictaphone模块写周期的样子:

关闭窗口或接收命令以完成录制后,接收到的数据将保存在一个临时文件夹中,然后由me脚的MP3编码器对其进行编码(它被视为实用程序,应该已经加载了,无法从控制服务器获取它)。 编码文件保存在日志文件夹中。 生成文件夹名称类似于为屏幕截图生成名称。
模块编号 | 团队编号 | 内容描述 |
---|
7 | 0 | 开始录制并在15分钟后完成 |
1个 | 停止录音 |
2 | 检查状态:正在录制 |
CProcessesManager模块
这是一个被动模块,能够根据请求返回进程列表或由传递给它的PID终止。

模块编号 | 团队编号 | 内容描述 |
---|
8 | 0 | 返回进程列表:它们的名称,PID和拥有该进程的用户的名称。 |
1个 | PID过程完成 |
CDownloader模块
该模块旨在将大文件上传到控制服务器。 按块进行数据传输,其大小由其配置确定。 该模块从文件读取数据,从控制服务器接收到该文件的路径,并将块打包在BinPackage中。 对于每个包含块的BinPackage,将添加一个标识符为0x888的条目,包括文件的路径。 通过每个块后,睡眠执行5秒钟。

模块编号 | 团队编号 | 内容描述 |
---|
9 | 0 | 存根,无法设置确切值 |
1个 | 进行大量数据的传输(0x500000字节),然后它测量传输所花费的时间,并将该值发送给C2 |
2 | 从机器下载文件 |
CPS模块
该模块允许您运行PowerShell脚本。

模块编号 | 团队编号 | 内容描述 |
---|
10 | 0 | 从C2接收PowerShell脚本并执行它 |
CDeviceMonitor模块
被动模块,用于监视连接的媒体设备并从中复制文件。 它使用WM_DEVICECHANGE广播消息来检测设备连接。 将设备连接到控制服务器后,将发送有关设备连接时间,其卷标和设备路径的信息。 用于获取设备路径的代码与此非常相似。 所有文件都将复制到日志文件夹。 名称的生成方式与屏幕截图相同。 fsIndex.dat文件是单独创建的,使用boost :: archive序列化的字典位于其中。 该词典存储复制文件的原始路径及其MD5哈希值。 以下是DevicePath的收据:

作为结尾,有以下几点建议:
- 无需打开来自未知收件人的信件中的附件,更不用说包含Microsoft Publisher脚本了。
- 单击未知发件人的信件中的链接也同样危险。 您所访问的站点可以托管可自动下载到PC的恶意软件。
- 您必须定期更新该软件,尤其是Microsoft Windows和Microsoft Office,它们将关闭对各种恶意软件的访问。