引言
不久前,卡巴斯基MDR分析师检测到针对非洲地区政府IT服务的定向攻击。攻击者在其恶意软件中嵌入了内部服务名称、IP地址和代理服务器的硬编码信息。其中一个C2服务器是受害者基础设施内的被劫持SharePoint服务器。
在事件分析过程中,我们确定幕后威胁行为者是APT41(又称Wicked Panda、Brass Typhoon、Barium或Winnti)。这是一个讲中文的网络间谍组织,以针对多个行业的组织而闻名,包括电信和能源提供商、教育机构、医疗组织和IT能源公司,至少涉及42个国家。值得注意的是,在此事件之前,非洲是该APT组织活动最少的地区。
事件调查和工具包分析
检测
我们的MDR团队在一个组织基础设施内的多台工作站上发现了可疑活动。这些是典型的警报,表明使用了Impacket工具包中的WmiExec模块。具体来说,警报显示了以下活动迹象:
- svchost.exe → exe → cmd.exe的进程链
- 执行的命令输出被写入管理网络共享上的文件,文件名由点分隔的数字组成
攻击者还利用了Impacket工具包中的Atexec模块。
攻击者使用这些命令来检查其C2服务器的可用性,包括直接通过互联网和通过组织内的内部代理服务器。
可疑活动的源头是一台未受监控的主机,该主机已被入侵。Impacket在其上以服务账户的上下文执行。我们后来将该主机连接到我们的遥测系统以确定感染源。
在Atexec和WmiExec模块运行完成后,攻击者暂时停止了操作。
权限提升和横向移动
短暂的平静之后,攻击者重新开始行动。这次,他们探测运行中的进程和占用端口:
|
|
他们可能试图确定目标主机是否安装了任何安全解决方案,如EDR、MDR或XDR代理、主机管理工具等。
此外,攻击者使用内置的reg.exe实用程序转储SYSTEM和SAM注册表配置单元:
|
|
在连接到我们监控系统的工作站上,我们的安全解决方案阻止了该活动,导致转储文件为空。然而,组织内的一些主机未受保护。结果,攻击者成功从关键注册表配置单元中获取凭据,并在后续攻击中利用这些凭据。这强调了一个关键点:为了及时检测事件并最小化损害,安全解决方案代理必须无一例外地安装在组织内的所有工作站上。此外,遥测数据越全面,响应就越有效。密切关注分配给服务账户和用户账户的权限也很重要,确保没有人获得超过实际需要的访问权限。这对于基础设施中存在于多个主机上的账户尤其重要。
在我们描述的事件中,从注册表转储中获取的两个域账户被用于横向移动:一个在所有工作站上具有本地管理员权限的域账户,以及一个具有域管理员权限的备份解决方案账户。本地管理员权限允许攻击者使用SMB协议将用于与C2通信的工具传输到管理网络共享C$。我们将在下一节讨论这些工具——即Cobalt Strike和自定义代理。
在大多数情况下,攻击者将其恶意工具放置在目标主机的C:\WINDOWS\TASKS\目录中,但他们也使用了其他路径:
|
|
然后使用WMI工具包远程执行这些目录中的文件:
C2通信
Cobalt Strike
攻击者在受感染的主机上使用Cobalt Strike进行C2通信。他们将工具作为加密文件分发,通常具有TXT或INI扩展名。为了解密,他们通过DLL侧加载将恶意库注入合法应用程序。
以下是Cobalt Strike启动的一般概述:
攻击者将所有必需的文件——合法应用程序、恶意DLL和有效负载文件——放置在以下目录之一:
|
|
恶意库是一个经过修改的合法DLL,用于在相同目录中特定命名的文件中搜索加密的Cobalt Strike有效负载。因此,有效负载文件的名称根据恶意DLL中硬编码的内容而变化。
在攻击期间,威胁行为者使用了以下修改后的DLL版本及其对应的有效负载:
| 合法文件名 | DLL | 加密Cobalt Strike |
|---|---|---|
| TmPfw.exe | TmDbg64.dll | TmPfw.ini |
| cookie_exporter.exe | msedge.dll | Logs.txt |
| FixSfp64.exe | log.dll | Logs.txt |
| 360DeskAna64.exe | WTSAPI32.dll | config.ini |
| KcInst.exe | KcInst32.dll | kcinst.log |
| MpCmdRunq.exe | mpclient.dll | Logs.txt |
尽管使用各种合法应用程序启动Cobalt Strike,但有效负载解密过程在不同实例中相似。让我们仔细看看Cobalt Strike执行的一个例子,使用合法文件cookie_exporter.exe,它是Microsoft Edge的一部分。启动时,该应用程序加载msedge.dll,假设它在同一目录中。
攻击者将cookie_exporter.exe重命名为Edge.exe,并用同名的恶意库替换msedge.dll。
当任何动态库加载时,首先执行DllEntryPoint函数。在修改后的DLL中,此函数包括对调试环境的检查。此外,在首次执行时,库验证主机上安装的语言包。如果检测到以下任何语言包,恶意代码不会运行:
- 日语(日本)
- 韩语(韩国)
- 中文(中国大陆)
- 中文(台湾)
如果系统通过检查,加载恶意库的应用程序执行包含恶意代码的导出DLL函数。由于在不同情况下使用不同的应用程序启动库,导出的函数根据特定软件调用的内容而变化。例如,对于msedge.dll,恶意代码在ShowMessageWithString函数中实现,由cookie_exporter.exe调用。
ShowMessageWithString函数从同一目录中的Logs.txt文件获取其有效负载。这些文件名通常在我们观察到的恶意动态链接库中硬编码。
有效负载通过使用128位SSE寄存器重复执行以下指令进行解密:
一旦有效负载被解密,来自msedge.dll的恶意可执行代码使用标准方法启动它:在其自身进程内分配虚拟内存区域,然后将代码复制到那里并通过创建新线程执行它。在我们检查的类似分发的Cobalt Strike代理的其他版本中,恶意代码也可以通过创建新进程或注入到另一个运行进程的内存中来启动。
除了上述功能外,我们还在恶意库中发现了一个代码段,似乎是给分析人员的消息。如果DLL发现自己运行在调试器中,这些字符串应该被显示,但实际上这不会发生。
一旦Cobalt Strike成功启动,植入程序连接到其C2服务器。威胁行为者然后通过创建类似以下命令的服务在受感染主机上建立持久性:
|
|
攻击者经常使用以下服务名称嵌入Cobalt Strike:
|
|
代理
在调查过程中,我们发现了一个被攻击者用作C2的受感染SharePoint服务器。他们通过SMB协议分发名为agents.exe和agentx.exe的文件以与服务器通信。这些文件中的每一个实际上都是一个C#木马,其主要功能是执行从安装在SharePoint服务器上的名为CommandHandler.aspx的WebShell接收的命令。攻击者将多个版本的这些代理上传到受害者主机。所有版本具有类似的功能,并使用硬编码的URL检索命令:
代理使用cmd.exe命令shell执行来自CommandHandler.aspx的命令,使用/c标志启动。
在分析代理时,尽管攻击者不断修改文件,但我们没有发现其核心功能的显著多样性。大多数更改是微小的,主要旨在逃避检测。过时的文件版本从受感染的主机中删除。
攻击者使用部署的代理进行侦察和收集敏感数据,如浏览器历史记录、文本文件、配置文件和具有.doc、.docx和.xlsx扩展名的文档。他们通过upload.ashx WebShell将数据回传到SharePoint服务器。
值得注意的是,攻击者在实现与SharePoint服务器的通信机制时犯了一些有趣的错误。具体来说,如果服务器上的CommandHandler.aspx WebShell不可用,代理将尝试执行网页的错误消息作为命令:
获取命令shell:通过HTA文件的反向shell
如果在初始侦察后,攻击者认为受感染的主机对进一步操作有价值,他们会尝试建立替代的命令shell访问。为此,他们执行以下命令从外部资源下载包含嵌入式JavaScript脚本的恶意HTA文件并运行该文件:
|
|
该组织试图通过使用模仿合法资源的资源下载HTA文件来掩盖其恶意活动。具体来说,上述命令联系了冒充GitHub的域名github[.]githubassets[.]net。攻击者主要使用该网站托管JavaScript代码。这些脚本负责传递其恶意软件的下一阶段或进一步攻击所需的工具。
在我们调查时,从github[.]githubassets[.]net下载的是无害脚本而不是恶意脚本。这可能是为了隐藏活动并使攻击分析复杂化。
然而,我们能够获取并分析先前分发的脚本,特别是恶意文件2CD15977B72D5D74FADEDFDE2CE8934F。其主要目的是在主机上创建反向shell,为攻击者提供执行命令的shell。
一旦启动,脚本收集初始主机信息:
然后连接到C2服务器,也位于github[.]githubassets[.]net,并传输唯一的ATTACK_ID以及最初收集的数据。脚本利用各种连接方法,如WebSockets、AJAX和Flash。选择取决于浏览器或执行环境中可用的功能。
数据收集
接下来,攻击者利用自动化工具(如窃取程序和凭据收集实用程序)收集敏感数据。我们在下面详细说明这些工具。这些实用程序收集的数据也通过受感染的SharePoint服务器外泄。除了上述WebShell外,还使用SMB协议将数据上传到服务器。文件被传输到SharePoint服务器上的网络共享。
Pillager
在攻击者部署在主机上收集敏感信息的工具中,修改版的Pillager实用程序脱颖而出。该工具用于从目标计算机导出和解密数据。原始Pillager版本可在存储库中公开获取,附有中文描述。
该实用程序收集的主要数据类型包括:
- 来自浏览器、数据库和管理实用程序(如MobaXterm)的保存凭据
- 项目源代码
- 屏幕截图
- 活动聊天会话和数据
- 电子邮件消息
- 活动SSH和FTP会话
- 主机上安装的软件列表
- systeminfo和tasklist命令的输出
- 操作系统存储和使用的凭据,以及Wi-Fi网络凭据
- 来自聊天应用、电子邮件客户端和其他软件的账户信息
Pillager收集的数据示例:
该实用程序通常是一个可执行(EXE)文件。然而,攻击者重写了窃取程序代码并将其编译为名为wmicodegen.dll的DLL。然后该代码通过DLL侧加载在主机上运行。他们选择convert-moftoprovider.exe(来自Microsoft SDK工具包的可执行文件)作为其受害者应用程序。它通常用于从托管对象格式(MOF)文件生成代码。
尽管修改了代码,该组织没有更改窃取程序的默认输出文件名和路径:C:\Windows\Temp\Pillager.zip。
值得注意的是,他们使用的恶意库基于来自Xbox开发工具包的合法SimpleHD.dll HDR渲染库。该库的源代码可在GitHub上获取。修改此代码以便convert-moftoprovider.exe加载一个导出函数,该函数实现了Pillager代码。
有趣的是,PDB文件的路径虽然看起来合法,但使用了PS5而不是XBOX:
Checkout
攻击者使用的第二个窃取程序是Checkout。除了保存的凭据和浏览器历史记录外,它还窃取有关下载文件的信息和浏览器中保存的信用卡数据。
启动窃取程序时,攻击者传递一个j8参数;没有它,窃取程序不会运行。恶意软件将数据收集到CSV文件中,然后将其归档并保存为CheckOutData.zip在一个专门创建的名为CheckOut的目录中。
RawCopy
除了收集注册表转储的标准方法(如使用reg.exe)外,攻击者还利用公开可用的实用程序RawCopy(MD5哈希:0x15D52149536526CE75302897EAF74694)复制原始注册表文件。
RawCopy是一个命令行应用程序,使用低级磁盘读取方法从NTFS卷复制文件。
使用以下命令收集注册表文件:
|
|
Mimikatz
攻击者还使用Mimikatz转储账户凭据。与Pillager窃取程序一样,Mimikatz被重写并编译成DLL。然后该DLL通过DLL侧加载由合法java.exe文件(用于编译Java代码)加载。以下文件涉及启动Mimikatz:
|
|
123.bat是一个BAT脚本,包含启动合法java.exe可执行文件的命令,该文件又加载动态链接库以进行DLL侧加载。该DLL然后解密并执行Mimikatz配置文件config.ini,该文件从基础设施内先前受感染的主机分发。
|
|
回顾性威胁狩猎
如前所述,受害者组织的监控覆盖最初是不完整的。因此,在早期阶段,我们只看到初始源的外部IP地址,无法检测该主机上发生的情况。一段时间后,该主机最终连接到我们的监控系统,我们发现它是一个IIS Web服务器。此外,尽管时间丢失,它仍然包含攻击的工件。
这些包括上述位于c:\programdata\的Cobalt Strike植入程序,以及用于在系统上建立持久性的调度程序任务。此外,主机上保留了一个WebShell,我们的解决方案检测为HEUR:Backdoor.MSIL.WebShell.gen。这是在编译ASP.NET应用程序文件的标准临时目录中找到的:
|
|
这些临时文件是自动生成的,包含ASPX页面代码:
WebShell名为newfile.aspx。上面的屏幕截图显示了其函数名称。基于这些名称,我们能够确定此实例利用了Neo-reGeorg WebShell隧道。
该工具用于通过外部可访问的Web服务器将流量从外部网络代理到内部网络。因此,我们最初认为来自当时未识别主机(IIS服务器)的Impacket工具启动,实际上是通过此隧道从外部网络来的。
归因
我们以高度信心将此攻击归因于APT41,基于TTP、工具和C2基础设施与其他APT41活动的相似性。特别是:
- 攻击者使用了APT41特有的一系列工具,如Impacket、WMI和Cobalt Strike。
- 攻击者采用了DLL侧加载技术。
- 在攻击期间,各种文件被保存到C:\Windows\Temp。
- 在此事件中识别的C2域名(s3-azure.com, *.ns1.s3-azure.com, *.ns2.s3-azure.com)与先前在APT41攻击中观察到的域名相似(us2[.]s3bucket-azure[.]online, status[.]s3cloud-azure[.]com)。
经验教训
攻击者拥有大量自定义和公开可用的工具。具体来说,他们在攻击的各个阶段使用渗透测试工具如Cobalt Strike。攻击者迅速适应目标的基础设施,更新其恶意工具以考虑特定特征。他们甚至可以利用内部服务进行C2通信和数据外泄。调查过程中发现的文件表明,恶意行为者在攻击期间修改其技术以隐藏活动——例如,通过重写可执行文件并将其编译为DLL以进行DLL侧加载。
虽然这个故事结局相对较好——我们最终成功将攻击者从目标组织的系统中驱逐——但没有全面的知识库和持续监控整个基础设施,无法应对如此复杂的攻击。例如,在手头的事件中,一些资产未连接到监控系统,这阻止了我们立即看到全貌。保持基础设施最大覆盖的安全工具也至关重要,这些工具可以在初始阶段自动阻止恶意活动。最后,我们强烈建议不要授予账户过多权限,尤其不要在所有主机上使用此类账户。
附录
规则
Yara
|
|