1. 概述

  Mustang Panda又名PKPLUG,PKPLUG这个名称来自将PlugX恶意软件作为DLL侧载包的一部分在ZIP存档文件中传递的策略,ZIP文件格式在其文件头中包含”PK”字符串,因此被称为PKPLUG。
  ESET研究最近发现一次正在进行中的攻击,使用了Mustang Panda以前从未使用过的Korplug变种。他们将该变种命名为Hodur(雷神),其原因是该变种与由团队UINT42发现的KorPlug变种THOR有很大的相似性。在北欧神话中,Hodur是Thor的同父异母的兄弟。
  基于代码相似性、技术和TTP中的许多共性,可以高度信任地将此次活动归因于Mustang Panda。PlugX源码疑似国人开发并在网上已经被泄露很久,很多攻击者使用泄露源码编译生成RAT后门,很多国外安全厂商或研究人员仅根据代码相似性就果断判断PlugX恶意程序并将其背后的攻击者归因于中国APT组织是不可信的。
  Mustang Panda的攻击活动经常使用自定义加载程序来处理恶意软件。包括Cobalt Strike、PlugX,该组织以创建Korplug变种而闻名。该活动的不同之处就是在部署的每个阶段都使用了大量垃圾代码和不透明谓词来阻碍安全人员分析。

2. 样本详情

文件名 PotPlayer.exe
Md5 f16903b2ff82689404f7d0820f461e5d
文件名 PotPlayer.dll
Md5 2102d225508c1f8f488a3f1574a34759
文件名 REGULATION OF THE EUROPEAN PARLIAMENT AND OF THE COUNCIL.exe
Md5 8f17a2ec3c13bed031e99cb57af220cf
文件名 FontEDL.exe
Md5 c03bc678d28b637327a757d7a35a2bcd
文件名 DocConvDll.dll
Md5 69ab42012ddce428c73940dcf343910e
文件名 COVID-19 travel restrictions EU reviews list of third countries.exe
Md5 01d8305b91524d83ccf2c26c1b3b7f1f

3. 流程图

4. 详细分析

  在目标机器部署具有侧加载漏洞的合法可执行文件、一个具有恶意代码的dll和一个加密的Korplug文件。可执行文件加载恶意dll,在dll中解密并执行Korplug RAT。

俄乌冲突作为钓鱼主题

1.1 REGULATION OF THE EUROPEAN PARLIAMENT AND OF THE COUNCIL.exe

  文件名翻译过来就是”欧洲议会和理事会条例”,可知这次攻击活动是利用了俄乌冲突事件作为主题针对特定人群进行钓鱼。字符串以加密的方式保存在堆栈内存中,在使用时再解密。从下图可以解密算法比较复杂。但是在不同的位置可能使用不同的密钥来解密。使得使用静态自动解密字符串的方式变得困难。

  获取API地址的方式与以往的样本不一样,大部分恶意程序是提供混淆的dll名字符串和API名字符串。先获取dll模块再根据该模块获取API地址。该版本只提供混淆的API名,遍历所有的模块并尝试在该模块获取API地址。

  我们可以看到在代码中穿插着许多垃圾代码,其中变量dword_426344没有在其他地方被赋值,因此它的值默认为0,经过取反、或和与等操作数最终结果是0,对其余代码不会造成任何影响。
  注册一个类名为”Windows”的窗口,在窗口回调函数中执行恶意代码。创建该类型的窗口时,调用回调函数malicous_windows_wndProc下载后续需要的文件。

  创建窗口类名为”Windows”,窗口标题为”title”的窗口。当创建创建时窗口回调函数被执行。

  在回调函数中,参数2为消息类型。当使用setWindowsPos函数时发送WM_SIZE(5)给恶意窗口回调函数。恶意窗口收到消息时,会判断接收的消息是否是WM_SIZE,如果是则调用函数download_malious_file下载恶意文件,否则调用窗口默认回调函数。

  创建互斥量”Windows API”避免程序被重复执行。

  获取环境变量temp完整路径,用于保存下载的恶意文件。

  调用函数WinHttpCrackUrl下载诱饵文档。

  下载完诱饵PDF后打开该文件。

  文档内容是关于讨论欧盟与乌克兰边境的局势,如下图

  调用cmd命令启动”FontEDL.exe”,ping命令使用参数-n表示发送ICMP包70次,在这里的作用是延迟执行程序FontEDL,因为现在FontEDL还没从远程C&C服务器下载,需要等程序FontEDL下载完毕。

  下载恶意dll文件DocConvDll.dll、合法文件FontEDL.exe和加密的Korplug文件Fontlog.dat。

1.2 FontEDL.exe

  该程序是用于生成字体文件并有数字签名的合法程序。由于存在侧加载漏洞而被Mustang Panda利用来加载恶意程序DocConvDll.dll。

  在加载文件”DocConvDll.dll”的时候没有对其进行校验,很容易被攻击者将该dll替换成同名的恶意程序从而导致恶意程序被执行。

1.3 DocConvDll.dll

  该程序为加载程序,主要功能为解密FontLog.dat文件然后执行。导出多个函数,这些函数除了包含恶意代码的导出函数之外,大部分函数直接返回一个值或者执行一个毫无实际作用的垃圾代码。其中许多函数由随机的字母组成和指向同一地址。主要恶意代码在导出函数createSystemFontsUsingEDL中。

  文件FontLog.dat的文件名被硬编码在加载程序中。加载程序将文件的内容读入内存中被解密,并将这段内存属性设置为可执行,然后这段内存偏移0x00处开始作为代码被执行。

  Windows API函数调用与下载器使用不同的混淆技术。后者使用比较API名字符串的方式来找到对应的API地址;前者遍历所有已加载模块的导出函数并对导出函数计算哈希,然后与预先计算好的API哈希值进行比较来找到对应API地址。由于远程连接失效,无法下载FontLog.dat文件并解密出Korplug后门。

新冠病毒作为钓鱼主题

2.1 COVID-19 travel restrictions EU reviews list of third countries.exe

  该文件主要功能为下载跟该文件同名的诱饵文档、合法可执行程序PotPlayer.exe、恶意程序PotPlayer.dll和加密的Korplug文件。该文件和下载的恶意程序和前面利用俄乌冲突事件钓鱼的样本不同,虽然也使用了大量垃圾代码和不透明谓词,但是所使用的字符串都是明文而不是存在栈上的混淆字符串。获取环境变量temp完整路径,用于保存下载的恶意文件

  下载同名诱饵文档并打开用来掩人耳目。

  使用ping检测网络和延迟执行合法可执行程序。

  下载恶意dll文件PotPlayer.dll和加密文件PotPlayerDB.dat。

2.2 PotPlayer.exe

  同样是没有对加载的dll文件进行验证而导致的侧加载漏洞。

2.3 PotPlayer.dll

  该程序是加载程序,主要功能为解密PotPlayerDb.dat文件然后执行。具有多个导出函数,其中函数SetPotPlayRegKeyW执行恶意代码,其他函数则执行无意义的垃圾代码。

获取API地址

  首先从寄存器fs指向的内存的偏移0x18读取TEB结构地址。后门用来遍历所有已加载的模块信息。

  遍历链表InMemoryOrderModuleList来获取已加载的模块信息。

  根据模块的加载基址获取所有的导出并对其计算哈希,然后与要查找的API哈希进行比较,如果相等返回API地址。

  读取加密文件PotPlayerDb.dat到本地分配的缓冲区然后解密,解密方式如下图,最终解密后为PE文件,使用VirtualProtect将这段缓冲区的内存属性设置为可执行,然后将PE文件偏移0x00处的数据作为代码来执行。

2.4 Korplug后门

  加密dat文件解密后为Korplug后门,又叫PlugX,多个APT组织经常使用该RAT作为后门工具。该后门与THOR变种有多个相似之处,比如C&C服务器配置使用相同格式、使用注册表项”Software\CLASSES\ms-pu”和静态窗口类的使用等等,这也是被命名为Hodur的原因。直接从该文件导出的函数入口点启动时它不会执行主要有效负载,并且加载过程非常复杂。
  如图,在PE头部偏移0开始存在一段shellcode,寄存器ebx值加上偏移0x2079为导出函数ZfwObuncPtCZ的地址。

  这段代码这要解析内存中的PE数据,并将其作为库手动映射到分配的缓冲区。这包括映射各个部分、解析导入表。调用dllmain的时候参数fdwReason使用非标准值4(正常值为0~3)。要执行有效Playload时需要使用这个特殊值。这样可以防止Korplug被类似rundll32.dll的加载工具直接执行。

  通过解密存在堆栈上的被混淆字符串来获得被调用的API函数,如:

2.4.1 安装

  装目录用于创建注册表自启动项表项的名称。值为合法可执行程序附加三个随机字母,假设安装目录为PotPlayerACX。在%alluserprofile%目录下创建属性为隐藏和系统的安装目录。
  运行时它会检查运行的路径是否为”%userprofile%\PotPlayerACX”,如果是则执行RAT功能,否则将PotPlayer.dll、PotPlayerDB.dat和PotPlayer.exe三个文件复制到PotPlayerACX目录执行安装过程。设置注册表启动项”Software\Microsoft\Windows\CurrentVersion\Run”的值为PotPlayer.exe的路径然后退出程序,等待下一次开机时自启动。

2.4.2 RAT

  Korplug与远程C&C通信的格式使用自定义格式,使用TCP协议完成。通信时使用的通用头部格式如下,这部分时明文形式传输,

1
2
3
4
5
Struct header{
Uint32_t nonce;//用于进行RC4加密的随机数
Uint32_t command_number;//C&C指令个数
Uint32_t command_exit_staus;//返回命令执行后的结果
}

2.4.3 命令0x1001

  用于管理后门执行并对新的主机进行初始侦察命令。

ID Name 描述
0x1000 Ping
0x1001 获取系统信息
0x1002 监听线程 创建一个线程来处理0x1002组的命令
0x1004 重置连接
0x1005 卸载自身 删除自启动项,删除安装目录

  当ID为0x1001时获取的信息格式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Struct system_info{
Uint32_t magic_bytes//值为0x20190301
Uint32_t client_ip;
Uint32_t server_ip;
Uint32_t ram_size;
Uint32_t cpu_clock_rate;
Uint32_t display_width;//显示器宽度
Uint32_t display_height;//显示器高度
Uint32_t default_locale;//默认语言
Uint32_t tick_count;
Uint32_t os_major_version;
Uint32_t os_minor_version;
Uint32_t os_build_number;
Uint32_t os_platform_id;
Uint16_t service_pack_major_version;
Uint16_t service_pack_minor_version;
Uint16_t product_type;
Uint16_t isWow64;
Uint16_t time_with_year;
Uint16_t time_with_month;
Uint16_t timestamp_off;
Uint16_t service_pack_version_string_off;
Uint16_t unkonw;
Uint16_t user_name_off;
Uint16_t computer_name_off;
Uint16_t mutex_name_off;
Uint16_t unkonw1;
Uint16_t list_ip_off;
Uint16_t end_zero;//总是为0x0000
}

2.4.4 命令0x1002

ID Name
0x1002 ping
0x3000 驱动器列表
0x3001 目录列表
0x3002 由客户端在执行完0x3001命令后发送
0x3004 读取文件
0x10003005 读取文件块
0x10003006 执行完0x10003005后发送
0x3007 写文件
0x10003008 写文件
0x10003009 写文件
0x300A 创建目录
0x300B 读取文件
0x300C 在隐藏桌面执行
0x300D 文件操作
0x300E 获取环境值
0x300F 创建目录 %SYSTEM%\ProgramData
0x300E 获取环境变量
0x3102 递归搜索指定后缀的文件
0x7002 创建交互式远程shell
0x7003 上次命令执行的结果

5. IOC

f16903b2ff82689404f7d0820f461e5d
2102d225508c1f8f488a3f1574a34759
8f17a2ec3c13bed031e99cb57af220cf
c03bc678d28b637327a757d7a35a2bcd
69ab42012ddce428c73940dcf343910e

https://69.90.184.125/europa/2022.pdf
https://69.90.184.125/europa/FontLog.dat
https://69.90.184.125/europa/FontEDL.exe
https://69.90.184.125/europa/DocConvDll.dll
https://45.154.14.235/2022/COVID-19 travel restrictions EU reviews list of third countries.doc
https://45.154.14.235/2022/PotPlayer.exe
https://45.154.14.235/2022/PotPlayer.dll
https://45.154.14.235/2022/PotPlayerDB.dat

6. ATT&CK矩阵

Tactic ID Name Description
Execution T1129 Shared Modules 使用 LoadLibrary 在运行时加载其他 dll。加载器和 RAT 是 dll。
T1204 User Execution 依赖于用户执行初始下载程序。
T1574.002 Hijack Execution Flow: DLL Side-Loading 下载程序获取并启动一个易受攻击的应用程序,因此它加载并执行包含第二阶段的恶意 DLL
Persistence T1547.001 Boot or Logon Autostart Execution: Registry Run Keys / Startup Folder 注册表注册启动项
T1053.005 Scheduled Task/Job: Scheduled Task 创建计划任务自启动
Defense Evasion T1140 Deobfuscate/Decode Files or Information Korplug 文件是加密的,只在运行时解密,其配置数据是用 XOR 加密的。
T1564.001 Hide Artifacts: Hidden Files and Directories 在安装过程中创建的目录被设置为隐藏的系统目录。
T1564.003 Hide Artifacts: Hidden Window 可以在隐藏桌面上运行命令。在部署过程中使用多个隐藏窗口。
T1112 Modify Registry 能够创建、修改或删除注册表
T1027 Obfuscated Files or Information 下载加密的文件
Command and Control T1071 Application Layer Protocol: Web Protocols 使用https协议通信
T1573 Encrypted Channel: Symmetric Cryptography 通信流量使用RC4算法加密
T1105 Ingress Tool Transfer 可以下载其他文件
T1132 Data Encoding: Standard Encoding 使用LZNT1压缩传输的数据
2024-04-15

⬆︎TOP