PNG隐写技术隐藏后门
我们的研究伙伴ESET发表了一篇关于先前未记录的工具渗透亚洲高端企业和地方政府的文章。这些工具自2020年以来一直活跃,旨在窃取数据。ESET将其称为Worok。ESET监测到2021年5月5日至2022年初的活动显著减少。然而,当Worok再次活跃时,新的目标受害者包括中亚的能源公司和东南亚的公共机构被感染以根据被攻击公司的类型窃取数据。
ESET的研究人员描述了两条执行链及受害者的电脑如何被入侵。初步入侵的具体情况尚不明,但后续阶段有详细描述,包括最终有效载荷如何通过隐匿术从PNG文件中加载和提取。然而,最终有效载荷仍未被恢复。关于Worok、链路和后门命令的详细信息,可以在ESET的文章Worok 大局中找到。
我们的分析旨在扩展对ESET研究的现有知识。我们在执行链的末端捕获到与Worok相关的其他文物。通过我们的遥测捕获的PNG文件确认这些文件中嵌入的最终有效载荷旨在窃取数据。值得注意的是,受害者的机器通过DropBox存储库进行数据收集,并且攻击者还使用DropBox API与最终阶段进行通信。
侵入链
我们希望保持与ESET研究所设定术语的一致性。我们的研究也没有发现恶意软件的完整初步入侵过程,但我们有一些新的观察,可能是渗透过程的一部分。
图1说明了ESET描述的原始侵入链。在某些情况下,恶意软件可能通过ProxyShell漏洞被攻击者部署。在一些特殊情况下,利用ProxyShell漏洞的攻击代码被用于在受害者的网络中保持持久性。攻击者接著使用公开可用的利用工具来部署自定义的恶意工具包。因此,最终的侵入链是直截了当的:第一阶段是CLRLoader,它实现了一个简单的代码来加载下一个阶段PNGLoader,如ESET所报导。
图1 Worok侵入链
初步攻击具体的初步攻击向量仍然未知,但我们发现四个DLL文件在受害者的机器上包含了CLRLoader的代码。我们的检测捕获到了一个如图2所示的进程树。
图2 运行CLRLoader的进程树
这个进程树是针对WLBSCTRLDLL、TSMSISrvDLL和TSVIPSrvDLL观察到的。执行这些DLL的共同进程是svchost k netsvcs。因此,初始进程是SvcHost,负责引入Windows服务。这些DLL文件帮助我们识别出两个Windows服务,分别是IKE和AuthIP IPsec Keying ModulesIKEEXT和远程桌面配置SessionEnv。这两个服务以其窃取DLL替代文件而著称,这些DLL是缺少的,默认存放在System32文件夹中,SCM和DLL劫持入门。
横向移动System32文件夹中的DLL劫持本身并不是漏洞,因为攻击者需要管理员权限才能写入其中。然而,我们假设存在一个实现了反向Shell的情况,并且具备管理员权限,这是初步侵入的后果。在这种情况下,攻击者可以通过服务控制管理器SVCCTL有效地执行横向移动。
简而言之,攻击者将劫持的DLL文件放入SYSTEMROOTSystem32,然后远程启动一个适当的服务。
被滥用的Windows服务及其DLL文件列表:
IKE和AuthIP IPsec Keying ModulesCWindowsSystem32WLBSCTRLdll远程桌面配置CWindowsSystem32TSMSISrvdllCWindowsSystem32TSVIPSrvdll第二个观察到的DLL劫持与VMware机器有关。攻击者可以利用vmGuestLibdll的劫持,该DLL由WMI性能适配器WmiApSrv服务使用,以提供性能信息。
在系统启动时,WmiApSrv载入vmStatsProviderdll,该DLL试图从ProgramFilesVMwareVMware ToolsvmStatsProviderwin32调用vmGuestLibdll作为第一个DLL。如果攻击者将vmGuestLibdll放置到ProgramFiles位置,这也会导致DLL劫持。
这两种方法都是CLRLoader执行的可能场景,并启动图1所示的侵入链。这种方法的优雅之处在于,攻击者无需创建新的服务,这可能会引起可疑的活动。攻击者仅滥用劫持DLL的导出函数,其空的重新实现不会导致错误或其他指示入侵的迹象。此外,CLRLoader的持久性是由合法的Windows服务来确保的。
CLRLoader
CLRLoader是用Microsoft Visual C编写的DLL文件。它实现了DllMain方法,负责加载下一个阶段NET版本的PNGLoader。其余导出函数对应于被劫持DLL的接口,但导出函数的实现是空的。因此,调用该函数不会导致调用进程崩溃。为了完整起见,劫持的文件还包含原始DLL文件的数字签名;由于签名无效,这是理所当然的。
CLRLoader通过被滥用的进程/服务调用LoadLibraryExW来激活。LoadLibraryExW以零的dwFlags参数被调用,因此当恶意DLL加载到虚拟地址空间时,DllMain会被调用。图3显示了CLRLoader代码的示例。
图3 被劫持的DLL的DllMain
CLRLoader检查包含PNGLoader的NET DLL文件的存在,创建一个互斥锁,并最终通过CorBindToRuntimeEx API执行PNGLoader。
我们识别出两个变种的PNGLoader,其进入点如下:
JsprofileJspfilter (Setfilter)pngpcdImageCoder (PngCoder)PNGLoader
第二阶段PNGLoader是由CLRLoader或如ESET报导的PowHeartBeat加载的。我们尚未在受感染系统上看到部署PNGLoader的代码,但我们预计它会以类似的方式出现,作为横向移动的一部分。
PNGLoader是一个加载器,从PNG文件中提取字节,并将它们重构为可执行代码。PNGLoader是一个经过NET Reactor混淆的NET DLL文件;文件描述提供了模仿合法软件的信息,例如Jscript Profiler或Transfer Service Proxy。
解混淆的PNGLoader代码包括由CLRLoader调用的进入点Setfilter。有一个硬编码的路径loaderpath,该路径在所有PNG文件中进行递归搜索。每个png文件根据特定的位图属性高度、宽度和隐藏内容进行验证DecodePng。图4显示了Setfilter方法。
图4 PNGLoader的Setfilter方法
隐藏内容的嵌入依赖于一种被称为最不重要的位LSB编码的常见隐匿术。一般而言,这种方法在每个像素的最不重要位中嵌入数据。在这个特定的实现中,一个像素编码了一个半字节每个Alpha、红色、绿色和蓝色通道各占一位,即两个像素包含一个隐藏信息的字节,如图5所示。虽然这种方法通过简单的统计分析很容易被检测到,但像素值的变化却难以被肉眼察觉。
图5 从两个像素重建字节
隐藏内容的提取分为四个步骤,如下:
首先提取PNG文件的前16字节32像素,前8字节必须匹配一个魔数。这次检查是因为提取其余像素的计算复杂性大约数十万个像素。接下来的8字节则代表嵌入有效载荷的长度。随后提取的数据是以Gzip格式加密的有效载荷。提取的有效载荷使用在PNGLoader中硬编码的多字节XOR进行解密。XOR的结果是被Gzip压缩的数据,然后被解压。这些步骤的结果是最终的有效载荷以隐秘方式嵌入到PNG文件中。
隐秘嵌入的有效载荷如果PNGLoader成功处理提取 解码 解压最终有效载荷,则该有效载荷在运行时编译并立即执行。我们的遥测捕获到两个版本的PNGLoader,其魔数记录在图6中。
图6 嵌入PNG位图的数据结构
第一个有效载荷实现是PowerShell脚本,这在图7的PNGLoader代码片段中得到了证明。就像我们的ESET同事一样,我们还没有这段有效载荷的样本,但我们预计它与下面描述的第二个有效载荷实现具有类似的功能。
图7 PNGLoader执行PowerShell有效载荷的代码片段
第二个有效载荷实现是经过NET C#编译的,通过CSharpCodeProvider类的CompileAssemblyFromSource方法执行,见图8。
图8 嵌入PNG位图的C#有效载荷的执行
NET C#有效载荷具有命名空间Mydropbox、类Program和方法Main。这一命名空间表明该有效载荷与DropBox协作。我们的遥测捕获了几个PNG文件,其中包括隐藏的C#有效载荷。
PNG文件乍一看,这些PNG图像看起来是无害的,就像一朵蓬松的云;见图9。我们的遥测捕获了三个PNG图像,其属性如下:
尺寸:1213 x 270像素位深度:8,颜色类型:6RGB Alpha图9 带有隐忧嵌入C#有效载荷的恶意PNG文件
正如我们之前提到的,恶意软件作者利用LSB编码将恶意有效载荷隐藏在PNG的像素数据中,更具体地说,隐藏在每个颜色通道红、绿、蓝、Alpha的LSB中。让我们看看它们的位平面。图10显示了每个颜色通道的较高位平面;注意每张图像与随机噪声相差甚远。如果我们查看一张没有数据嵌入其LSB的图像,通常会看到类似的模式。
图10 未隐藏数据的RGB位平面之一
现在,让我们对比LSB位平面。图11显示了PNG图像每个通道的LSB位平面,其中嵌入了加密和压缩有效载荷。请记住,加密和压缩通常应该增加图像的熵。因此,LSB位平面看起来像随机噪声也就不足为奇了。显然,LSB位平面的整个画布并未被利用。
图11 包含嵌入数据的零LSB位平面通道
有效载荷仅占据表示有效载荷大小的像素,其余则保持不变;见下面的算法。
在这个特定案例中,PNG文件位于CProgram FilesInternet Explorer,因此这幅图片不会引起注意,因为Internet Explorer拥有类似的主题,如图12所示。
图12 Internet Explorer主题的图形示例
DropBoxControl
目前,我们可以通过名为DropBoxControl的NET C#有效载荷扩展ESET的侵入链第三阶段,见图13。
图13 扩展的侵入链
DropBoxControl是一种后门,通过DropBox服务与攻击者通信。值得注意的是,CampC指挥和控制伺服器是一个DropBox帐号,整个通信,包括命令、上传和下载,都是通过特定文件夹中的常规文件完成。因此,后门命令以带有定义扩展名的文件形式表示。DropBoxControl定期检查DropBox文件夹,根据请求文件执行命令。每个命令的响应也以结果文件的形式上传到DropBox文件夹。
以下文本描述了各个DropBoxControl组件以及整个后门工作流程。
DropBox APIDropBoxControl通过HTTP/POST标准API实现DropBox通信。存在一个专门的类DropBoxOperation,对API进行封装,其方法总结在表1中。一个DropBox API密钥以HTTP标头的形式硬编码在DropBoxControl样本中,但可以远程更改。
DropBoxControl方法 APIDropBoxFileDownload https//contentdropboxapicom/2/files/downloadDropBoxDataUpload https//contentdropboxapicom/2/files/uploadDropBoxFileDelete https//apidropboxapicom/2/files/deletev2DropBoxGetFileList https//apidropboxapicom/2/files/listfolder表1 DropBoxControl实现的DropBox API
命令攻击者通过表2中记录的十个命令控制后门。
命令 描述cmd 执行cmd /c ltparamgt amp exit,参数由攻击者发送。exe 执行定义的可执行文件并带有特定参数。FileUpload 从DropBox下载数据到受害者的机器。FileDownload 将数据上传到受害者的机器至DropBox。FileDelete 从受害者的机器删除数据。FileRename 从受害者的机器重命名数据。FileView 发送有关定义目录中所有受害者文件的信息名称、大小、属性、访问时间ChangeDir 设置后门的当前目录。Info 将受害者机器的信息发送至DropBox。Config 更新后门配置文件;见配置。表2 后门命令
Info命令发送有关渗透系统的基本信息,具体如下:
在每个DropBoxControl样本中硬编码的ClientIdDropBoxControl样本的版本显示为1120001受害者机器的主机名所有受害者的IP列表explorerexe的版本和文件大小Windows架构所有硬驱动器的列表,包括总大小、可用空间和驱动器类型受害者机器的当前时间配置本研究的对象DropBoxControl使用位于CProgram FilesInternet Explorer的三个文件。这些文件名从Internet Explorer文件夹的角度看似合法。
ieproxydat
该文件包含加密的DropBoxControl配置。它配置四个变量如下:
DropboxId 用于授权的API密钥Interval DropBox磁碟检查的频率UpTime/DownTime 定义后门活动的时间间隔显示为7 23以下是配置文件内容的示例:Bearer WGG0iGTAAGkOdrimId9QfzuwMnJmR8nNhy300723
iexplorelog
iexplorelog文件是DropBoxControl的日志文件,记录大部分行动,例如联系DropBox、下载/上传文件、加载配置等。日志条目仅在sqmapidat文件存在时记录。登录引擎奇妙地实现,由于日志文件未加密,且包含了ieproxydat文件的明文数据。
加密DropBoxControl加密配置文件实际上无效和DropBox通信。配置文件是使用多字节XOR加密的,具有硬编码密钥owe01zU4。尽管API通信是通过HTTPS加密的,但存储在DropBox中的数据则用其自己的算法进行加密。
数据使用另一个硬编码字节数组hexEnc、TaskId和ClientId进行加密。此外,TaskId在每次迭代时作为索引,用ClientId进行加盐;见图14。这类似于PowHeartBeat使用的算法,如ESET报告所述。
图14 用于DropBox文件的加密算法
DropBox文件如前所述,后门与攻击者间的通信通过DropBox文件进行。一般来说,包含有价值信息的DropBox文件是加密的。每个文件除了数据本身外,还包括标记、task type (command)及其他元数据,见图15和表3。
图15 DropBox文件的文件结构
项目 长度 描述EncType 1 标记 文件中的数据是加密的GzipType 1 标记 文件中的数据是Gzip压缩的TaskType 2 命令类型DataLen 4 数据长度表3 DropBox文件标头
回到DropBox文件,我们深入探索了DropBox帐户的文件结构。根文件夹包括根据硬编码在DropBoxControl样本中的ClientId命名的文件夹,更准确地说,是在PNG文件中。
每个客户端文件夹都包含一个timetxt文件,其中包含计数,该计数是一个后门迭代的次数。一个迭代意味着联系和处理Dropbox存储库中相应的客户端文件夹。
攻击者指定任务类型和可能的参数。任务类型和参数然后使用文件标头打包并上传到适当的客户端文件夹作为请求文件req。进一步分析显示,后门处理req文件并创建结果文件res作为对每个请求文件的响应。结果文件具有与图15显示的相同文件结构,但数据、数据长度及任务类型具有不同的值,因为返回的数据包含请求的被盗信息。
比较所有DropBox文件夹图16,我们确定请求文件和结果文件的名称形式为[09][09]。文件名用于请求/响应识别,也用于数据加密。
例如,让我们使用请求文件名字311233req。IDMessage是311233,而TaskId是1233。因此,数据使用ClientId和TaskId及硬编码的hexEnc进行加密;见加密部分。
图16 DropBox文件列表
DropBoxControl工作流程我们在上述部分定义并描述了DropBoxControl的基本功能。因此,我们可以将所有这些知识总结成一个后门工作流程,概述数据收集、上传、下载的整个过程,以及与DropBox存储库的通信。
一开始,PNGLoader提取隐藏的DropBoxControl并调用C# MydropboxProgram类的Main方法。DropBoxControl然后解密并加载包含DropBox API密钥的配置文件。大多数操作记录在日志文件中。
如果当前时间在UpTime和DownTime之间,DropBoxControl是活跃的,并开始主要功能。它联系DropBox存储库并将timetxt文件上传到客户端文件夹。如果timetxt上传成功,后门将下载客户端文件夹中存储的所有文件的列表。文件列表被迭代,每个请求req文件都下载并根据命令类型进行处理。DropBoxControl执行该命令,并创建结果文件res以提供请求的信息。最后,处理的请求req文件将被删除。
受害者分析
我们看到的这次运动中的受害者类似于ESET观察到的受害者。此次运动的受害者是亚洲和北美的公司及政府机构,特别是墨西哥。越南和柬埔寨是受到DropBoxControl影响的其他国家。从与俄罗斯经济发展部相关的IP监测到一次DropBoxControl连接。
讨论
侵入链的第三阶段是通过C#实现的DropBoxControl。DropBoxControl的功能使攻击者可以控制和监视受害者的机器。此外,后门访问Program Files文件夹,因此我们预计它在管理员权限下运行。在日志文件中观察到的最常见命令是获取受害者文件的信息,随后是数据收集。
数据收集的典型命令是通过cmd命令;见以下示例:
rarexe a m5 r y ta20210204000000 hp1qazxcde32ws v2560k Asia1DptPCcrar cdoc cdocx cxls cxlsx cpdf cppt cpptx cjpg ctxt gtnul
攻击重点是收集所有感兴趣的文件,如Word、Excel、PowerPoint、PDF等。他们在C磁碟中递归搜索这些文件并将其打包成加密的rar档案,分成多个文件。
从请求文件中解密的另一条命令执行Ettercap,该命令使用中间人攻击嗅探实时网络连接;见以下命令:
ettercapexe Tq w acap M ARP /19216810099/ //
攻击者可以嗅探网络通信并拦截通过网页发送的用户凭证。
总而言之,DropBoxControl是一种拥有后门和间谍功能的恶意软件。
DropBox帐号我们的遥测捕获了这三个DropBox API:
Bearer gg706XRu43QAg1JU1DLej1xH7e Bearer ARmUaLQg02vynPASEyQadeRLu9Gx Bearer WGG0iGkOdrimIdZQfzuw6RR8nNhy
两个密钥注册在“Veronika Shabelyanova” (vershabelyanova1@gmail[]com)名下,具有中文本地化。该电子邮件仍然活跃,DropBox存储库也是如此。该电子邮件用户的名字是“ ”的斯拉夫语音译。
第三个DropBox存储库则连接至香港用户“Hartshorne Yaeko” (yaekohartshornekrq11@gmai[l]com)
DropBox文件我们正在监控DropBox存储库,并已经导出了一些显著的信息。根据在帐号创建时创建的README文件,这些DropBox帐户成立于2019年7月11日。
目前,只有一个看似活跃的DropBox存储库。它包含七个文件夹及七个timetxt文件,因此有七个活跃的DropBoxControl实例,因为timetxt文件中的整数是定期增加的;见DropBox文件。此外,整数值显示这些后门已持续运行数十天。关于后门命令,我们猜测最后一次活动发送请求文件是在2022年6月1日,对于这七个后门。最后,代表受感染计算机的文件夹总数为21。
在2022年4月,攻击者上传了一个Lua脚本,该脚本利用nmap库进行Telnet服务的搜索,使用s3270控制IBM大型主机;见下面的脚本。
DropBoxControl的代码质量虽然我们通常避免评论代码质量,但在这种情况下,它值得一提,因为代码质量至多具争议性,并非每项异议都可以归咎于混淆。
该代码包含大量冗余代码;包括重复代码和无功能的代码。对C#的不熟悉的迹象是使用自己实现的序列化/反序列化方法,而不是使用C#内建函数。线程代码不依赖常见的同步原语如信号量、互斥锁等,而是使用布尔标记和定期检查线程状态。该代码还包含一些可能从API文档中抄袭的部分。例如,DropBoxFileDownload的实现包含与DropBox文档中相同的注释;见下图。
另一个奇怪的特点是配置文件的加密方法。DropBoxControl的作者试图在ieproxydat文件中混淆配置,因为API密钥是敏感信息。然而,当配置文件被解密并应用后,配置内容以明文形式记录到iexplorelog文件中。
换言之,整个DropBoxControl项目看起来就像一个学校项目。作者不遵循通常的编码实践,依赖于自己实现的常见原语,而是重用文档示例中的代码。这使我们评估出DropBoxControl的作者与CLRLoader和PNGLoader的作者有显著不同,因为这些有效载荷的代码质量截然不同。
结论
本研究旨在确认ESET同事在有关Worok网络间谍组的文章中提出的假设。我们的研究成功扩展了他们的侵入链,因为我们找到了适合此链的文物,并伴随相关样本。
我们描述了可能的场景,说明如何通过滥用Windows服务的DLL劫持来启动初步入侵,包括横向移动。侵入链的其余部分与ESET的描述非常相似。
坚果梯子下载此次研究的关键发现是拦截PNG文件,这正如ESET所预测的那样。隐藏的C#有效载荷DropBoxControl证实了Worok作为网络间谍团体的身份。它们通过注册在活跃的Google电子邮件上的DropBox帐号来窃取数据。
Worok工具在公众中的流行程度较低,这可能表明该工具集是一个针对亚洲、非洲和北美私人及公共部门高端实体的APT项目。
附录
DropBoxControl日志[020050][]Main starts [020050][]Config exists [020050][]DecryptContent is 1Bearer gg706Xqxhy4gQ8L4OmOLdI1JU1DL1ej1xH7e#300723 [103940][]In work time [103942][UPD] UploadData /data/2019/timetxt Starts! [104008][UPD] UploadData /data/2019/timetxt Success! [104010][UPD] UploadData Ends! [104010][]Get Timetxt success [104011][] DropBoxGetFileList Success! [104011][DOWN] DownloadData /data/2019/313req Starts! [104013][DOWN] DownloadData /data/2019/313req Success! [104013][DOWN] DownloadData Ends! [104026][UPD] UploadData /data/2019/313res Starts! [104027][UPD] UploadData /data/2019/313res Success! [104027][UPD] UploadData Ends! [104027][DEL] Delete /data/2019/313req Starts! [104028][DEL] Delete /data/2019/313req Success! [104028][DEL] Delete Ends! [104028][DOWN] DownloadData /data/2019/314req Starts! [104029][DOWN] DownloadData /data/2019/314req Success! [104029][DOWN] DownloadData Ends! [104034][UPD] UploadData /data/2019/314res Starts! [104036][UPD] UploadData /data/2019/314res Success! [104036][UPD] UploadData Ends! [104036][DEL] Delete /data/2019/314req Starts! [104036][DEL] Delete /data/2019/314req Success! [104036][DEL] Delete Ends! [104036][DOWN] DownloadData /data/2019/315req Starts! [104037][DOWN] DownloadData /data/2019/315req Success! [104037][DOWN] DownloadData Ends! [104042][UPD] UploadData /data/2019/315res Starts! [104043][UPD] UploadData /data/2019/315res Success! [104043][UPD] UploadData Ends! [104043][DEL] Delete /data/2019/315req Starts! [104044][DEL] Delete /data/2019/315req Success! [104044][DEL] Delete Ends! [104044][DOWN] DownloadData /data/2019/317req Starts! [104044][DOWN] DownloadData /data/2019/317req Success! [104044][DOWN] DownloadData Ends! [104049][UPD] UploadData /data/2019/317res Starts! [104050][UPD] UploadData /data/2019/317res Success! [104050][UPD] UploadData Ends! [104050][DEL] Delete /data/2019/317req Starts! [104052][DEL] Delete /data/2019/317req Success! [104052][DEL] Delete Ends!
任务类型值命令 任务类型CmdRequest 0x01CmdResponse 0x02ExeRequest 0x03ExeResponse 0x04FileUploadRequest 0x05FileUploadResponse 0x06FileDownloadRequest 0x07FileDownloadResponse 0x08FileViewRequest 0x09FileViewResponse 0x0AFileDeleteRequest 0x0BFileDeleteResponse 0x0CFileRenameRequest 0x0DFileRenameResponse 0x0EChangeDirRequest 0x0FChangeDirResponse 0x10InfoRequest 0x11InfoResponse 0x12ConfigRequest 0x13ConfigResponse 0x14
IOC带有隐蔽C#有效载荷的PNG文件
29A195C5FF1759C010F697DC8F8876541651A77A7B5867F4E160FD8620415977 9E1C5FF23CD1B192235F79990D54E6F72ADBFE29D20797BA7A44A12C72D33B86 AF2907FC02028AC84B1AF8E65367502B5D9AF665AE32405C3311E5597C9C2774
DropBoxControl
1413090EAA0C2DAFA33C291EEB973A83DEB5CBD07D466AFAF5A7AD943197D726
参考文献[1] Worok 大局[2] 横向移动 SCM和DLL劫持入门[3] DropBox for HTTP Developers
标记为APT、后门、隐匿术
分享:XFacebook