最近,ESET分析人员发现了多起针对亚洲知名公司和地方政府的针对性攻击。这些攻击是由一个以前未知的间谍组织——Worok实施的,该组织自2020年以来一直处于活跃状态。Worok的工具集包括一个C++加载程序CLRLoad、一个PowerShell后门PowHeartBeat和一个C#加载程序PNGLoad,它采用隐写技术从PNG文件中提取隐藏的恶意负载。
1. 概述
在2021年初的ProxyShell(CVE-2021-34523)漏洞披露期间,ESET分析人员观察到了一个新的威胁组织,并将其命名为Worok,这一名称来自于加载程序中的互斥锁。根据ESET的遥测数据,Worok自2020年底以来一直处于活跃状态,在撰写本文时仍然活跃。
早在2020年底,Worok就瞄准了多个国家的政府和公司,包括:
东亚某电信公司
中亚的一家银行
东南亚某海运业公司
中东的一个政府实体
南部非洲的一家私营公司
2021年5月到2022年1月,Worok的攻击活动暂时停止,随后在2022年2月恢复,其攻击目标是:
中亚的一家能源公司
东南亚公共部门实体
图1显示了目标区域的可视化热图。
图1:目标区域的可视化热图
根据攻击目标以及受害主机上部署的工具推测,Worok的主要目标是窃取信息。
2. 技术分析
虽然大多数的初始访问未被发现,但在到2021年和2022年间,分析人员看到了针对ProxyShell漏洞的利用。在这种情况下,通常会在利用这些漏洞后上传webshell,以便在受害者的网络中实现持久驻留。然后攻击者使用各种植入来获得进一步的能力。
获得访问权限后,攻击者部署了多个公开可用的侦察工具,包括Mimikatz、EarthWorm、ReGeorg和NBTscan。接下来是自定义植入程序,包括第一阶段加载程序,以及第二阶段的.NET加载程序(PNGLoad)。但是分析人员没有检索到任何有效载荷。在2021年,第一阶段的加载程序是一个CLR(CLRLoad)程序集。而在2022年,它在大多数情况下已被一个功能齐全的PowerShell后门(PowHeartBeat)所取代,这两种攻击链如图2所示。
图2:攻击链对比
3.CLRLoad:CLR 程序集
CLRLoad是32位和64位通用的WindowsPE。它是一个用C++编写的加载器,是公共语言运行时(CLR)程序集形式的DLL文件,用于加载下一阶段的PNGLoad。其代码是从位于磁盘上的合法目录中的文件加载的,目的是为了误导受害者或事件响应机制。
首先,一些CLRLoad样本会解密文件的完整路径,这些文件路径使用单字节XOR加密,每个样本中都有不同的密钥。解密后的内容或者说明文表明,这些文件路径是绝对的,比如:
C:\\ProgramFiles\\VMware\\VMwareTools\\VMwareVGAuth\\xsec_1_5.dll
C:\\ProgramFiles\\UltraViewer\\msvbvm80.dll
C:\\ProgramFiles\\InternetExplorer\\Jsprofile.dll
C:\\ProgramFiles\\WinRar\\RarExtMgt.dll
C:\\ProgramFiles(x86)\\FoxitSoftware\\FoxitReader\\lucenelib.dll
然后,不同的样本会创建不同的互斥量。加载器会检查这个互斥锁,如果找到,则退出。在其中一个示例中,遇到了互斥量Wo0r0KGWhYGO,这也是Worok的名称由来。
CLRLoad通过32位变体中的CorBindToRuntimeExWindowsAPI调用或64位变体中的CLRCreateInstance调用,实现从解密出的文件路径加载CLR汇编。
4.PowHeartBeat
PowHeartBeat是一个用PowerShell编写的多功能后门,使用各种技术(如压缩、编码和加密)进行混淆处理。基于ESET遥测,分析人员认为PowHeartBeat在最近的Worok活动中取代了CLRLoad,用以启动PNGLoad。
后门代码的第一层由base64编码的PowerShell代码组成。一旦有效载荷被重建,它就会被IEX执行。解码后,将执行如图3所示的另一层混淆代码。
图3:PowHeartBeat的第二层解码主函数
第二层首先使用base64解码下一层代码,然后使用3DES_CBC解密。解密后,再使用gzip算法解压,从而得到第三层的PowerShell代码,也就是真正的后门。它分为两个主要部分:配置和处理后门命令。
后门代码也是用PowerShell编写的,并使用HTTP或ICMP与C&C服务器进行通信。它的通信过程如图4所示。
图4:PowHeartBeat的功能
(1)配置
配置包含多个字段,包括版本号、可选代理配置和C&C地址。表1描述了不同版本中配置字段的含义。
表1:配置字段含义
字段名称 | 描述 |
nouse/ikuyrtydyfg(其他样本) | 未使用 |
ClientId | 客户端标识符,用于以下目的: ·作为构造C&C通信的Cookie标头时的值;·与加密数据有关的密码构成要素。 |
Version | PowHeartBeat的版本号。 |
ExecTimes | 发出RunCmd(命令运行)命令时允许的执行尝试次数。 |
UserAgent | 用于C&C通信的Useragent。 |
Referer | 用于C&C通信的referer标头。 |
接受编码 | 未使用 |
CookieClientId CookieTaskIdCookieTerminalId | 用于构造C&C通信的Cookie标头的值。 |
UrlHttps | 用于C&C通信的协议。 |
UrlDomain IPAddressDomains | 用作C&C服务器的URL、域名或IP地址。 |
UrlSendHeartBeat | 后门向C&C服务器请求命令时使用的URL路径。 |
UrlSendResult | 后门将结果发送回C&C服务器时使用的URL路径。 |
GetUrl | 完整的URL,是上面URL元素的连接,用于向C&C服务器发送请求命令。 |
PutUrl | 与GetUrl相同,但用于将结果发送回C&C服务器。 |
currentPath | 未使用 |
ProxyEnableFlag | 后门是否使用代理的标志。 |
Proxymsg | ProxyEnableFlag设置为true时使用的代理地址。 |
Interval | GET请求之间休眠的时间(以秒为单位)。 |
BasicConfigPath | 包含UpTime、DownTime、DefaultInterval和Domains的可选配置文件的路径。若文件存在,这些值将被覆盖。 |
UpTime | 后门开始运行的时间,这意味着它开始向C&C服务器发出GET请求。 |
DownTime | 后门停止向C&C服务器发出请求的时间。 |
DomainIndex | 用于与C&C服务器通信的当前域名索引。如果响应的是不同于304的错误信息,则DomainIndex会增加。 |
SecretKey | 用于解密/加密配置的密钥。 |
IfLog | 未使用 |
IfLogFilePath | 指示是否启用日志记录的标志。 |
logpath | 日志文件的路径。 |
ProxyFile | 可选代理配置的文件路径。如果为空或无法在文件系统中找到,则从注册表值HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\InternetSettings\\ProxyServer中检索用户的代理设置。 |
IfConfig | 指示是否使用配置文件的标志。 |
图5显示了从PowHeartBeat样本中提取的配置示例(SHA-:757ABA12D04FD1167528FDD107A441D11CD8C427)
图5:配置示例
(2)数据加密
PowHeartBeat对日志和其他配置文件的内容进行加密。日志文件内容通过多字节XOR与示例中以明文形式出现的密钥进行加密。其中,clientId被用作密钥数组索引的盐。密钥是一个256字节的数组,每个样本中都是相同的。其他配置文件内容通过多字节XOR加密,并将SecretKey中的值作为其密钥。
(3)C&C通讯
PowHeartBeat在2.4版本之前使用HTTP进行C&C通信,之后切换到ICMP。在这两种情况下,通信都没有加密。
HTTP
后门向C&C服务器发送GET请求,请求下一步指令。返回的加密信息由后门解密,并将命令的执行结果写入文件,然后通过POST请求将其发送到C&C服务器。
GET请求的格式如下
图6:GET请求格式
在C&C服务器的响应中,内容的第三个字节是命令标识,表示后门要处理的命令,称之为command_id。响应的剩余内容将作为参数传递给正在处理的命令,此内容使用图6中所示的算法进行加密,其中taskId是配置中的CookieTaskId的值。
图7:请求内容数据加密算法
来自C&C服务器的响应还包含另一个cookie,其名称由后门的CookieTerminalId指定。该cookie的值在后门的POST请求中重复出现,不能为空。执行后门命令后,PowHeartBeat将结果保存成文件,命名为
ICMP
从PowHeartBeat的2.4版本开始,HTTP被ICMP取代,发送数据包的时间限制为6秒,且未做分片处理。通过ICMP进行通信很可能是逃避检测的一种方式。
2.4及更高版本没有大的变化,但代码中有一些修改:
在请求命令之前,PowHeartBeat会发送一个包含字符串abcdefghijklmnopqrstuvwxyz的心跳,这是通知C&C服务器后门已准备好接收命令。
后门执行命令包含字符串abcdefghijklmnop。
心跳的格式如图8所示。
图8:心跳格式
clientID和clientflag区别在于,clientID在每个样本中都不同,而clientflag在每个使用ICMP的样本中都是相同的。heartbeatflag表示后门是否在发送心跳。来自C&C服务器的响应具有图9描述的格式。
图9:C&C服务器响应格式
这里的flag表示是否有命令发给后门。获取命令的请求格式如图10所示。
图10:请求命令格式
后门的ICMP模式允许接收无限量的数据,这些数据被划分为块。datalength,currentposition以及totallength用于跟踪传输的数据。对这一请求的响应格式如图11所示。
图11:命令请求的响应格式
与HTTP响应一样,命令标识符是data的第三个字节。
如果ICMP的回复连续7次都为空或格式不一致时,则认为后门和C&C服务完成了传输。
关于将结果发送到C&C服务器的请求,服务器更改为post模式,字符串abcdefghijklmnop更改为结果数据。
5. 后门命令
PowHeartBeat具有多种功能,包括命令/进程执行和文件操作。表2列出了样本支持的各种命令。
表2:PowHeartBeat命令说明
字段名称 | 命令标识符 | 描述 |
Cmd | 0x02 | 执行PowerShell命令 |
Exe | 0x04 | 执行进程 |
FileUpload | 0x06 | 将文件上传到受害者主机,使用gzip压缩 |
FileDownLoad | 0x08 | 从受害主机下载文件,并将文件路径、文件长度、创建时间、访问时间和文件内容返回给C&C服务器 |
FileView | 0x0A | 获取特定目录的文件信息: ·文件名 ·文件属性 ·最后写入时间 ·文件内容 |
FileDelete | 0x0C | 删除文件 |
FileRename | 0x0E | 重命名或移动文件 |
ChangeDir | 0x10 | 更改后门的当前工作路径 |
Info | 0x12 | 根据指定参数获取信息: ·“基本信息”:ClientId、Version、主机名、IP地址、explorer.exe版本和大小信息、OS、Interval、当前目录、驱动器信息(名称、类型、可用空间和总大小)、当前时间 ·“时间间隔信息”:Interval和当前时间 ·“域名信息”:解密的配置文件内容 |
Config | 0x14 | 更新配置文件内容并重新加载配置 |
N/A | 0x63 | 后门退出 |
如果后门发生错误,会向C&C服务器的POST请求中加入特定的命令标识符0x00,来表明发生了错误。在将信息发送回C&C服务器之前,数据需要经过gzip压缩。
6. PNGLoad:隐写加载器
PNGLoad是Worok在受感染系统上部署的第二阶段有效载荷,由CLRLoad或PowHeartBeat加载。虽然在PowHeartBeat中没有找到任何直接加载PNGLoad的代码,但后门能够从C&C服务器下载和执行其他的有效载荷,这很可能是攻击者在被攻击系统上部署PNGLoad的方式。PNGLoad是一个加载器,它使用PNG文件中的字节来创建要执行的有效负载。它是一个64位的.NET可执行文件,使用.NETReactor进行了混淆,伪装成合法软件。例如,图12显示了伪装成WinRARDLL的CLR标头。
图12:伪造WinRARDLL示例
一旦解除混淆,能在这个类中找到MainPath属性,其指明了后门搜索的目录路径,包括其子目录,以及扩展名为.png的文件,如图13所示。
图13:.png文件
接下来检查MainPath目录所包含的每个.png文件中的隐写内容。首先,获取每个像素的R(红色)、G(绿色)、B(蓝色)和A(alpha)值的最低有效位并将其组装到缓冲区中。如果该缓冲区的前8个字节与图14中看到的magic数匹配,并且下一个8字节值control不为空,则文件通过PNGLoad的隐写内容检查。对于此类文件,使用存储在PNGLoad的SecretKeyBytes属性中的密钥,对缓冲区的其余部分进行多字节XOR解密,然后对解密的缓冲区进行gzip解压缩。最后生成一个PowerShell脚本,并立即运行。
图14:PNGLoad处理.png文件的缓冲区格式
PNGLoad的操作记录在一个文件中,该文件的路径存储在变量LogFilePath中。仅当文件是由内部变量IfLogFilePath指定时,才会记录操作。
分析人员没有获得与PNGLoad一起使用的.png样本文件,但PNGLoad的操作方式表明它应该与有效的PNG文件一起使用。为了隐藏恶意负载,Worok使用C#中的位图对象,只从文件中获取像素信息,而不是文件元数据。这意味着Worok可以将其恶意负载隐藏在有效的、看起来无害的PNG图像中,从而隐蔽自身。
7. 结论
Worok是一个网络间谍组织,它既开发工具,又利用现有工具来攻陷目标。该组织专注于亚洲和非洲的知名组织,针对私营和公共部门的各个部门,尤其偏爱政府部门。他们的自定义工具集包括C++与C#的两个加载器,以及PowerShell后门。
附录 攻击指标
(1)样本
SHA-1 | 文件名 | 检测名称 | 备注 |
3A47185D0735CDECF4C7C2299EB18401BFB328D5 | script | PowerShell/PowHeartBeat.B | PowHeartBeat2.4.3.0003. |
27ABB54A858AD1C1FF2863913BDA698D184E180D | script | PowerShell/PowHeartBeat.A | PowHeartBeat2.4.3.0003. |
678A131A9E932B9436241402D9727AA7D06A87E3 | script | PowerShell/PowHeartBeat.B | PowHeartBeat2.4.3.0003. |
757ABA12D04FD1167528FDD107A441D11CD8C427 | script | PowerShell/PowHeartBeat.B | PowHeartBeat2.1.3.0003. |
54700A48D934676FC698675B4CA5F712C0373188 | script | PowerShell/PowHeartBeat.A | PowHeartBeat1.1.3.0002. |
C2F53C138CB1B87D8FC9253A7088DB30B25389AF | script | PowerShell/PowHeartBeat.A | PowHeartBeat1.1.3.0002. |
C2F1954DE11F72A46A4E823DE767210A3743B205 | tmp.ps1 | PowerShell/PowHeartBeat.B | PowHeartBeat2.4.3.0004. |
CE430A27DF87A6952D732B4562A7C23BEF4602D1 | tmp.ps1 | PowerShell/PowHeartBeat.A | PowHeartBeat2.1.3.0004. |
EDE5AB2B94BA85F28D5EE22656958E4ECD77B6FF | script | PowerShell/PowHeartBeat.A | PowHeartBeat2.4.3.0003. |
4721EEBA13535D1EE98654EFCE6B43B778F13126 | vix64.dll | MSIL/PNGLoader.A | PNGLoader |
728A6CB7A150141B4250659CF853F39BFDB7A46C | RarExtMgt.dll | MSIL/PNGLoader.A | PNGLoader |
864E55749D28036704B6EA66555A86527E02AF4A | jsprofile.dll | MSIL/PNGLoader.A | PNGLoader |
8DA6387F30C584B5FD3694A99EC066784209CA4C | vssxml.dll | MSIL/PNGLoader.A | PNGLoader |
AA60FB4293530FBFF00D200C0D44EEB1A17B1C76 | xsec_1_5.dll | MSIL/PNGLoader.A | PNGLoader |
B2EAEC695DD8BB518C7E24C4F37A08344D6975BE | msvbvm80.dll | MSIL/PNGLoader.A | PNGLoader |
CDB6B1CAFEE098615508F107814179DEAED1EBCF | lucenelib.dll | MSIL/PNGLoader.A | PNGLoader |
4F9A43E6CF37FF20AE96E564C93898FDA6787F7D | vsstrace.dll | Win64/CLRLoad.C | CLRLoad |
F181E87B0CD6AA4575FD51B9F868CA7B27240610 | ncrypt.dll | Win32/CLRLoad.A | CLRLoad |
4CCF0386BDE80C339EFE0CC734CB497E0B08049C | ncrypt.dll | Win32/CLRLoad.A | CLRLoad |
5CFC0D776AF023DCFE8EDED5CADA03C6D7F9C244 | wlbsctrl.dll | Win64/CLRLoad.E | CLRLoad |
05F19EBF6D46576144276090CC113C6AB8CCEC08 | wlbsctrl.dll | Win32/CLRLoad.A | CLRLoad |
A5D548543D3C3037DA67DC0DA47214B2C2B15864 | 安全32.dll | Win64/CLRLoad.H | CLRLoad |
CBF42DCAF579AF7E6055237E524C0F30507090F3 | dbghelp.dll | Win64/CLRLoad.C | CLRLoad |
(2)文件路径
MainPath | LogFilePath | IfLogFilePath |
C:\\ProgramFiles\\VMware\\VMwareTools\\ | C:\\ProgramFiles\\VMware\\VMwareTools\\VMwareVGAuth\\readme.txt | C:\\ProgramFiles\\VMware\\VMwareTools\\VMwareVGAuth\\VMWSU_V1_1.dll |
C:\\ProgramFiles\\WinRar\\ | C:\\ProgramFiles\\WinRar\\rarinstall.log | C:\\ProgramFiles\\WinRar\\des.dat |
C:\\ProgramFiles\\UltraViewer\\ | C:\\ProgramFiles\\UltraViewer\\CopyRights.dat | C:\\ProgramFiles\\UltraViewer\\uvcr.dll |
(3)网络
Domain | IP |
None | 118.193.78[.]22 |
None | 118.193.78[.]57 |
airplane.travel-commercials[.]agency | 5.183.101[.]9 |
central.suhypercloud[.]org | 45.77.36[.]243 |
(4)互斥量
CLRLoad中所包含的互斥锁名称:
aB82UduGX0EX
ad8TbUIZl5Ga
Mr2PJVxbIBD4
oERiQtKLgPgK
U37uxsCsA4Xm
Wo0r0KGWhYGO
xBUjQR2vxYTz
zYCLBWekRX3t
3c3401ad-e77d-4142-8db5-8eb5483d7e41
9xvzMsaWqxMy
(5)MITRE ATT&CK
该表是使用MITREATT&CK框架的11版本构建的。
战术 | ID | 名称 | 描述 |
侦察 | T1592.002 | 收集受害者主机信息:软件 | PowHeartBeat收集explorer.exe的信息。 |
T1592.001 | 收集受害者主机信息:硬件 | PowHeartBeat收集有关驱动器的信息。 | |
T1590.005 | 收集受害者网络信息:IP地址 | PowHeartBeat收集受感染计算机的IP地址。 | |
资源开发 | T1583.004 | 获取基础设施:服务器 | Worok使用自己的C&C服务器。 |
T1588.002 | 获得能力:工具 | Workok在受感染的机器上部署了多个公开可用的工具。 | |
T1583.001 | 获取基础设施:域名 | Worok注册域名以促进C&C通信。 | |
T1588.005 | 获得能力:漏洞利用 | Workok使用了ProxyShell漏洞。 | |
T1587.001 | 开发能力:恶意软件 | Worok开发了自己的恶意软件:CLRLoad、PNGLoad、PowHeartBeat。 | |
T1587.003 | 开发能力:数字证书 | Worok创建了Let"sEncryptSSL证书,以便为恶意软件启用双向TLS身份验证。 | |
执行 | T1059.001 | 命令和脚本解释器:PowerShell | PowHeartBeat是用PowerShell编写的。 |
持久性 | T1505.003 | 服务器软件组件:WebShell | Worok使用webshell ReGeorg。 |
防御规避 | T1140 | 去混淆/解码文件或信息 | Worok使用各种基于XOR的自定义方案来加密PowHeartBeat、PNGLoad和CLRLoad中的字符串和日志。 |
T1036.005 | 伪装:匹配合法名称或位置 | PNGLoad样本部署在看起来合法的VMWare目录中。 | |
凭证访问 | T1003.001 | 操作系统凭证转储:LSASS内存 | Worok使用Mimikatz从LSASS内存中转储凭据。 |
发现 | T1082 | 系统信息发现 | PowHeartBeat收集操作系统信息。 |
T1083 | 文件和目录发现 | PowHeartBeat可以列出文件和目录。 | |
T1046 | 网络服务发现 | Worok使用NbtScan获取受感染机器的网络信息。 | |
T1124 | 系统时间发现 | PowHeartBeat收集受害者的时间信息。 | |
收集 | T1005 | 来自本地系统的数据 | PowHeartBeat从本地系统收集数据。 |
T1560.002 | 压缩收集的数据 | PowHeartBeat gzip压缩数据,然后将其发送到C&C服务器。 | |
命令与控制 | T1071.001 | 应用层协议:Web协议 | 一些PowHeartBeat变体使用HTTP作为与C&C服务器的通信协议。 |
T1090.001 | 代理:内部代理 | PowHeartBeat处理受害者机器上的代理配置。 | |
T1001.002 | 数据混淆:隐写术 | PNGLoad从.png文件中提取像素值以重建有效负载。 | |
T1573.002 | 加密通道:非对称加密 | PowHeartBeat与C&C服务器使用HTTPS通信。 | |
T1095 | 非应用层协议 | 一些PowHeartBeat变体使用ICMP作为与C&C服务器的通信协议。 | |
T1132.001 | 数据编码:标准编码 | Worok在PowHeartBeat和PNGLoad中使用XOR编码。 | |
T1132.002 | 数据编码:非标准编码 | Worok使用其他盐的XOR编码算法。 | |
泄密 | T1041 | 通过C2信道泄密 | PowHeartBeat使用其C&C通信渠道来泄露信息。 |
参考链接:https://www.welivesecurity.com/2022/09/06/worok-big-picture/
编辑|延俊杰
审校|邓铁洪、何双泽
本文为CNTIC编译整理,不代表本公众号观点,转载请保留出处与链接。
声明:本文来自国家网络威胁情报共享开放平台,版权归作者所有。文章内容仅代表作者独立观点,不代表安全内参立场,转载目的在于传递更多信息。如有侵权,请联系 anquanneican@163.com。