VenusEye首页 > 资讯列表 > XDSpy通过失物认领主题钓鱼邮件分发恶意XDDown

XDSpy通过失物认领主题钓鱼邮件分发恶意XDDown2020-10-12    VenusEye威胁情报中心





事件描述

在启明星辰的日常威胁情报跟踪中,发现一个极其隐蔽的多组件多阶段攻击链,该APT组织蛰伏至少九年后才被国外安全厂商发现。其中一次攻击活动通过分发钓鱼邮件,通知收件人有失物等待认领,要求其下载附件中的文件打开。附件解压后是一个ppsx文件,打开后会利用其设置的自动播放方式,运行混淆后的js脚本,脚本执行后会释放并执行恶意文件。

样本分析

投递手法 - 钓鱼邮件+恶意附件压缩包

通过钓鱼邮件投递针对俄罗斯,以失物认领为主题的武器化PPSX格式的附件,诱骗收件人下载打开,打开后会执行JS脚本“MicrosoftPowerPoint.js”,释放并执行PE文件。

执行流程

样本详细分析

钓鱼邮件恶意附件PPSX

由于PPSX格式的攻击载荷比较少见,此处简单介绍一下该格式与PPTX格式的区别:

PPTX:普通可编辑模式。打开后呈现的页面就是可编辑的页面,要播放需要单击播放按钮才能全屏播放。

PPSX:放映格式。打开后直接就是全屏放映,没法编辑。

即:PPTX全屏放映的时候就是PPSX的样子,但是PPSX是没法直接编辑的,打开就是全屏放映,放映结束后直接退出。

通过修改PPSX文件的后缀名为“PPT”进入查看格式,可以清楚的看到,在第一张幻灯片出有一“动画”效果的设置,并有一对象被缩小到极致,放在幻灯片外:

放大后发现这是一个名为“MicrosoftPowerPoint.js”的“Packager Shell Object对象”:

通过文件路径:“C:\Users\As\AppData\Local\Temp\MicrosoftPowerPoint.js”可以发现计算机使用者的用户名是“As”:

自动播放的恶意对象MicrosoftPowerPoint.js

该脚本文件是一个经过混淆的Dropper脚本:

将其还原之后主要功能如下:

脚本对象释放的恶意可执行文件WINlogon.exe

创建互斥体“winsysmcc”,保持运行的唯一性。接着获取计算机名和用户名进行拼接,为了规避检测,将该字符串进行简单的恺撒加密后处理(将(B-Y,b-y,1-8)都后移一位,如C→D),写入到文件“%AppData%\Explorer\idf.dat”中:

同样的,为了反静态编译,该程序使用的大多字符串经过简单的解密处理(-1)。然后会以读取模式尝试打开文件“%AppData%\Explorer\slp.dat”,由于本程序中无对该文件的写入模式打开的代码,以及其中数据的使用代码,和文件名,故推测为其他组件写入的控制休眠时间的配置文件(slp = Sleep):

再接着以读取模式尝试打开文件“%AppData%\Explorer\adrun.dat”,依旧推测为其他组件写入的配置文件。其中数据存放的结构为两位的字段+“ShellExecuteW需要运行的文件名”(adrun = AddRun,路径依旧为工作目录“%AppData%\Explorer\”):

执行完这些本地文件的操作后,调用“CreateThread”执行线程,线程主要功能以网络通信为主。

通信线程

运行解密出数据段中的字符串后拼凑出HTTP报文

向远程服务器的“/whowhat.php”传递受感染计算机的信息,分析环境中构建的GET方法的报文内容如下,“me”字段的信息为计算机标识,结构为[恺撒加密后的ComputerName]_[恺撒加密后的UserName][Tick_Count]V7,其中的V7结合以往历史样本分析,推测为程序的内部版本标识,下文的溯源部分再详细展开:

接着在内存中申请0x100000字节大小的空间用于存放数据,尝试连接远程服务器不同的接口获取数据:

将从远程服务器获取数据并异或解密(XOR 0x11或0x16)保存到内存中,完成后检测解密出的数据头部是否为可执行文件的MZ头:

如果是PE文件的话,以当前程序文件路径创建傀儡进程,通过设置线程环境,执行写入到内存中的恶意代码:

这是一种“Living off the land Binaries(LotL)”技术,利用内存的易失性,让恶意的数据只在运行时存在,一旦进程结束或者关机,注入的代码被全部清除。

至此,本攻击链主要的逻辑已完整,释放的主要载荷为负责下载可PE文件执行,并上传计算机信息的后门程序,其他组件部分结合溯源到的早前样本,进行功能推测。

溯源/关联分析

通过URL中特殊的字符串“/whowhat.php?me=”,关联到下载器的古老版本XDDown和其他XDSpy的恶意组件,多个字符串相同并且代码逻辑相似度也极高,本报告不再赘述:

V1版本XDDown

逆向分析溯源部分找到的样本时发现的URL中包含字符串“V1”,推测该文件为XDDown的初始版本。程序执行起来后首先会创建一个名为“winsysms”的互斥体(V7版本中为“winsyscc”),并调用“GetLastError”检测返回值是否为“ERROR_ALREADY_EXISTS”,如果已存在该互斥体则退出程序,以确保程序唯一运行的状态。

接着和V7版本一样,将会获取计算机名和用户名,将其简单的位移处理后,拼接上“V1”,构成“[恺撒加密后的ComputerName][恺撒加密后的UserName]V1”:

解密方式还是简单的位移处理,不过V7版本中已多增加了对数字的处理:

然后创造一个目录用于存放程序工作中需要使用的文件。先获取环境变量“APPDATA”的路径与字符串“Explorer”拼凑出路径:“C:\Users\Administrator\AppData\Roaming\Explorer”,调用“CreateDirectoryW”创建该目录,该工作路径和V7版本一致:

接着会对比当前文件的路径是否包含“\Explorer”,检测程序是否在工作目录中。如果不在,则将当前程序文件复制到指定的路径:“C:\Users\Administrator\AppData\Roaming\Explorer\browsms.exe”:

将可执行文件复制到指定的工作目录路径下之后,为了该文件的建立持久性,会在Run键下新建一个子项“msprotect”,将“%APPDATA%\Explorer\browsms.exe”写入

Explorer键也是同样写入“%APPDATA%\Explorer\browsms.exe”:

调用“RegisterClassEx”注册一个窗口类“winsysms”,随后调用“CreateWindowExW”使用该窗口类创建窗口。接着通过“CreateThread”创建线程执行主要的功能。

线程

线程中会构建不同的GET方法的HTTP报文,与远程服务器不同的接口完成数据的传输。比较特殊的是,其中“Accept-Language”字段的值为“ru”:

1.whowhat.php

构建GET方法的HTTP报文,以“me”字段传输“[恺撒加密后的ComputerName][恺撒加密后的UserName]V1”,将计算机信息和用户信息发送给远程服务器“omgtech.000space.com”:

下载数据解密为可执行文件并启用:

1.1拼接出“%APPDATA%\Explorer\dwn.dat”字符串,会尝试删除该文件,作为上次工作后的环境清理。接下来将储存解密出的可执行文件。

1.2拼接出“%APPDATA%\Explorer\fin.dat”字符串,以写入方式打开该文件,写入用“InternetReadFile”读取到的远程服务器“http://omgtech.000space.com/[ComputerName字母+1][UserName字母+1]V1.xd”中的数据。

1.3读取“fin.dat”的数据后进行简单的异或解密处理(XOR 0x16),然后保存为文件“dwn.dat”,完成后删除“fin.dat”,调用“CreateProcessW”执行:

2.delfi.php

构建GET方法的HTTP报文发送到远程服务器的“delfi.php”接口:

拼接出“%APPDATA%\Explorer\toup.dat”字符串,读取该文件,但是该文件在此程序中并没有创建以及写入的操作,故推测认为是上一步中解密出的可执行文件所创建的。

构建POST方法的HTTP报文,具体如下:

“part”传输的值为变量,由于读取文件之前会以“$”发送一次数据,传输文件全部读取结束后会以“#”发送一次。故认为“$”是文件边界(boundary)的开始字符串,“#”为文件边界结束字符串。

读取“toup.dat”中的内容以“%.2x”的格式打印,传入包含“send”的函数,与“&part=[%.2x]”拼接后发送:

上传后返回删除“toup.dat”。

至此,完成了上传计算机信息,下载执行可执行文件,上传指定文件后删除。通过代码逻辑可以推测,该可执行程序是一个由后门下载器为主要载荷的多组件攻击链,具体内容将在总结中展开。

关键技术点

T1001.001(数据混淆.垃圾数据):攻击者利用混淆后的JS脚本释放和执行PE文件

T1041(C2通道):攻击者以通过C2通道窃取数据

T1059.007(JavaScript/JScript):攻击者通过JS文件执行恶意代码

T1132.001(数据编码.标准编码):攻击者使用Base64对数据进行解码

T1140(去模糊/解码文件或信息):攻击者最终将通过Base64解密,释放可执行文件

T1204.002(用户执行.恶意文件):依靠用户打开钓鱼邮件中的附件(武器化的XLS)来获得执行

T1547.001(启动或登录自动启动执行.注册表运行键/启动文件夹):攻击者通过在Run键设置指向可执行文件建立持久化

T1566.001(网络钓鱼.附件):攻击者通过伪装为失物认领的信息发送钓鱼邮件,诱骗收件人下载附件打开

IOCS

样本中特殊字符串

文件路径

%APPDATA%\Temp.NET\archset.dat

%APPDATA%\Temp.NET\hdir.dat

%APPDATA%\Temp.NET\list.dat

%TEMP%\tmp%YEAR%%MONTH%%DAY%_%TICK_COUNT%.s

%TEMP%\fl637136486220077590.data

wgl.dat

Windows Broker Manager.dat

%TEMP%\Usermode COM Manager.dat

%TEMP%\Usermode COM Manager.exe

%APPDATA%\WINinit\WINlogon.exe

%APPDATA%\msprotectexp\mswinexp.exe

%APPDATA%\msvdemo\msbrowsmc.exe

%APPDATA%\Explorer\msdmcm6.exe

%APPDATA%\Explorer\browsms.exe

总结

通过代码逻辑可以推测释放的可执行程序是一个由后门下载器为主体多组件攻击链。

V1版本中,可执行的组件“dwn.dat”(Down缩写),通过连接远程服务器获取数据(“fin.dat”)后解密得来,并作为“CreateProcessW”的参数,那么可以推断出该文件实际为可执行程序。根据后续代码推测,应该是“toup.dat”的父文件。

再利用被窃数据文件“toup.dat”(ToUpload缩写)的全路径(%APPDATA%\Explorer\toup.dat)搜索,并未发现样本,故认为该文件的父文件为没有联网功能的数据收集器,并会在执行完成后删除。

而升级到V7版本时,功能拆分的更加精细,除了可执行的文件和保存需要窃取的信息文件外,还新增了配置文件。反调试和反静态分析能力加强,不过由于组件文件名的缩写具有可推测性,故该攻击链比较清晰,是通过多组件和自删除的组合模式进行数据的窃取。将包含网络传输功能的代码汇集到一个可执行文件中,由该程序进行上传下载,其他组件负责单独的功能,如数据收集,睡眠配置文件等。但由于组件包含完成后自删除代码,并且没有联网行为,故至今尚未有样本存档。

V1至V7版本升级过程中,其他组件的运行方式也从下载文件到本地后执行再删除,变为了下载数据保存到内存中以傀儡进程的方式运行代码。V7这种无(新增)文件落地的方式可以更好的避免被安全软件发现和电子取证,极具隐蔽性。

具国外安全厂商报告,该组织已活动从2011年活动至今才被披露,这9年期间的历史攻击却无法将其分类到任何已知的APT组织,且与目前已知的APT组织代码无相似性,网络资产也无重叠,可以发现这是一个独立性很高的隐蔽的APT组织。但通过其钓鱼邮件的语言和HTTP报文中的“Accept-Language”字段,可以确定攻击者可能来自俄语地区。

·

end

·

数据运营·情报赋能