利用SolarWinds供应链后门的全球入侵行动

xiannv  1469天前

事件概要

我们发现了一个全球入侵行动。我们正在追踪这次UNC2452运动背后的参与者。

FireEye 发现了一个供应链攻击木马,该木马伪装为SolarWinds Orion商务软件更新程序,以分发我们称之为SUNBURST的恶意软件。

SolarWinds网络安全管理软件产品,SolarWinds正在改变各类规模的企业监控和管理其企业网络的方式。我们努力为大家提供经济,易于使用,实施快速和高度有效的软件产品。这就是为什么全球有超过45,000用户,不论是小公司还是全球500强企业,都信任和使用我们的解决方案来探索,配置,监控和管理日趋复杂的系统和构建网络基础构架的流程。

——百度百科

攻击者的攻击行动利用多种技术来逃避检测并掩盖他们的活动,但是这些行为也提供了一些检测机会。

这项行动非常广泛,影响了世界各地的公共和私人组织。

FireEye正在发布特征码来检测这一威胁行为体和野外供应链攻击。这些都可以在我们的GitHub页面上找到。FireEye的产品和服务可以帮助客户检测和阻止这种攻击。

总结

FireEye发现了一个大规模的行动,我们用UNC2452进行追踪。这个行动的幕后推动者入侵了世界各地许多公共和私人组织。他们通过安装了木马的SolarWinds Orion信息系统监控和管理软件来入侵受害者。这项行动可能早在2020年春天就开始了,目前正在进行中。供应链入侵后的活动包括横向移动和数据盗窃。这次行动是一位技术精湛的伪装者主导的,而且这次行动是在高度安全的情况下进行的。

SUNBURST 后门

SolarWinds.Orion.Core.BusinessLayer.dll是Orion软件框架的一个SolarWinds数字签名组件,它包含一个后门,通过HTTP通信到第三方服务器。我们正在追踪这个SolarWinds Orion插件的特洛伊版本的SUNBURST。

经过长达两周的初始休眠期后,它将检索并执行称为“Jobs”的命令,其中包括传输文件、执行文件、分析系统、重启机器和禁用系统服务的能力。该恶意软件将其网络流量伪装成Orion改进计划(OIP)协议,并将侦察结果存储在合法的插件配置文件中,使其能够与合法的SolarWinds活动相融合。该后门使用多个模糊的黑名单,通过流程、服务和驱动程序识别取证和反病毒工具。

fig1.png

图1:SolarWinds数字签名软件与后门

从2020年3月到5月,多个特洛伊木马更新程序被数字签名并发布到SolarWinds更新网站上,包括:

hxxps://downloads.solarwinds[.]com/solarwinds/CatalogResources/Core/2019.4/2019.4.5220.20574/SolarWinds-Core-v2019.4.5220-Hotfix5.msp

特洛伊木马程序更新文件是一个标准的Windows Installer程序补丁文件,包括与更新相关的压缩资源,包括特洛伊木马程序SolarWinds.Orion.Core.BusinessLayer.dll组件。一旦更新被安装,恶意的DLL将被合法的SolarWinds.BusinessLayerHost.exe或SolarWinds.BusinessLayerHostx64.exe(取决于系统配置)加载。在长达两周的休眠期后,该恶意软件将试图解析avsvmcloud[.]com的一个子域。DNS响应将返回指向命令和控制(C2)域的CNAME记录。到恶意域的C2通信被设计成模拟正常的SolarWinds API通信。已知的恶意基础设施列表可以在FireEye的GitHub页面上找到。

世界各地的受害者横跨多个垂直领域

FireEye已经在全球多个实体检测到这种活动。受害者包括北美、欧洲、亚洲和中东的政府、咨询、技术、电信和采掘业实体。我们预计在其他国家和垂直行业也会有更多的受害者。FireEye已经通知所有我们知道受到影响的实体。

入侵后的活动和检测机会

我们目前正在跟踪软件供应链的破坏和相关的入侵后活动,如UNC2452。在获得最初的访问权限后,这个组织在横向移动时使用各种各样的技术来掩饰他们的行动。这个入侵者倾向于保持轻微的恶意软件足迹,而不是选择合法凭证和远程访问来访问受害者的环境。本节将详细介绍一些值得注意的技术,并概述潜在的检测机会。

使用TEARDROP和BEACON恶意软件

已经回收了多个SUNBURST的样本,提供了不同的payload。在至少一个实例中,攻击者部署了一个以前未见过的内存专用投放器,我们称之为TEARDROP to deploy Cobalt Strike BEACON。

TEARDROP是一个内存删除器,它作为一个服务运行,生成一个线程并从文件“gracious_truth.jpg”中读取,该文件可能有一个假的JPG头。接下来,它检查HKU\SOFTWARE\Microsoft\CTF是否存在,使用自定义滚动XOR算法对嵌入的payload进行解码,并使用自定义类pep文件格式手动将嵌入式payload加载到内存中。TEARDROP的代码与之前看到的任何恶意软件都不一样。我们认为这是用来执行一个定制的Cobalt Strike BEACON。

缓解:

FireEye提供了两个Yara规则来检测我们GitHub上可用的TEARDROP。防御者应该从FireEye HX:MalwareGuard和WindowsDefender寻找以下警告:

进程信息

file_operation_closed

文件路径*:“c:\\windows\\syswow64\\netsetupsvc.dll

actor-process:

pid: 17900

windows的defender Exploit Guard日志条目:(Microsoft-Windows-Security-Mitigations/KernelMode event ID 12)

进程“\Device\HarddiskVolume2\Windows\System32\svchost.exe” (PID XXXXX)将被阻止加载非微软签名的二进制文件‘\Windows\SysWOW64\NetSetupSvc.dll’

攻击者的主机名与受害者的环境匹配

入侵者在其命令和控制基础设施上设置主机名,以匹配在受害者环境中找到的合法主机名。这使得对手能够融入环境,避免怀疑,并逃避侦查。

检测机会

攻击者的基础设施泄漏其在RDP SSL证书中配置的主机名,该证书可在网络范围内的扫描数据中识别。这为防御者提供了一个检测机会——查询互联网范围内的组织主机名的扫描数据源可以发现可能伪装成该组织的恶意IP地址。(注意:IP扫描历史经常显示IP在默认(WIN-*)主机名和受害者主机名之间切换)交叉引用网络扫描数据中识别的IP列表和远程访问日志,可能会在一个环境中识别该入侵者的证据。每个IP地址可能只有一个帐户。

位于受害者国家的IP地址

攻击者对IP地址的选择也进行了优化,以规避检测。攻击者主要利用虚拟专用服务器,仅使用来自与受害者相同国家的IP地址。

检测机会

这也提供了一些检测机会,因为如果合法用户和来自不同IP地址的攻击者正在使用一个被破坏的帐户,用于远程访问的地理定位IP地址可能显示不可能的传输速率。攻击者对每个VPS提供商使用了多个IP地址,因此一旦识别出来自一个来自异常ASN的恶意登录,查看来自该ASN的所有登录可以帮助检测额外的恶意活动。这可以与用于合法远程访问的ASN的基线化和规范化一起完成,以帮助识别可疑活动。

使用不同凭证的横向移动

一旦攻击者获得了使用泄露的凭证访问网络的权限,他们就会使用多个不同的凭证进行横向移动。用于横向移动的凭证总是不同于用于远程访问的凭证。

检测机会

组织可以使用HX的LogonTracker模块来绘制所有登录活动,并分析显示源系统和帐户之间一对多关系的系统。这将发现任何单个系统对具有多个帐户的多个系统进行身份验证,这种情况在正常业务操作中比较少见。

临时文件替换和临时任务修改

攻击者使用临时文件替换技术来远程执行实用程序:他们用自己的工具替换合法的实用程序,执行它们的payload,然后恢复合法的原始文件。他们同样通过更新一个现有的合法任务来执行他们的工具,然后将计划任务返回到它的原始配置来操纵计划任务。他们通常会删除他们的工具,包括在实现合法远程访问后删除后门。

检测机会

防御者可以检查SMB会话的日志,这些会话显示对合法目录的访问,并在很短的时间内遵循删除-创建-执行-删除-创建模式。此外,防御者可以监视现有的计划任务进行临时更新,使用频率分析来识别任务的异常修改。还可以监视任务,以监视是否有合法的Windows任务执行新的或未知的二进制文件。

这次行动的入侵后活动是在高度重视操作安全的情况下进行的,在许多情况下,每次入侵都利用专用的基础设施。这是FireEye在网络攻击中观察到的最好的安全操作之一,重点在于规避和利用固有的信任。但是,可以通过持久防御检测到它。

深入的恶意软件分析

SolarWinds.Orion.Core.BusinessLayer.dll (b91ce2fa41029f6955bff20079468448)是Orion软件框架的一个SolarWinds签名插件组件,它包含一个模糊后门,通过HTTP与第三方服务器通信。在长达两周的初始休眠期之后,它检索并执行称为“Jobs”的命令,包括传输和执行文件、分析系统和禁用系统服务的能力。后门的行为和网络协议与合法的SolarWinds活动相融合,比如伪装成Orion改进计划(OIP)协议,并在插件配置文件中存储侦察结果。该后门使用多个黑名单,通过流程、服务和驱动程序识别取证和反病毒工具。

并将侦察结果存储在合法的插件配置文件中,使其能够与合法的SolarWinds活动相融合。后门使用多个模糊的黑名单来识别作为进程、服务和驱动程序运行的取证和杀毒工具。

独特的功能

执行子域域名生成算法(DGA)来改变DNS请求

CNAME响应指向恶意软件要连接的C2域。

记录响应的IP块控制恶意软件行为

指挥和控制交通伪装成合法的Orion改进计划

代码通过使用假的变量名和合法的组件隐藏在普通站点中

传输和安装

授权系统管理员通过SolarWinds网站分发的软件包获取并安装SolarWinds Orion的更新。更新包CORE-2019.4.5220.20574-SolarWinds-Core-v2019.4.5220-Hotfix5.msp (02af7cec58b9a5da1c542b5a32151ba1) 包含此报告中描述的SolarWinds.Orion.Core.BusinessLayer.dll 。安装完成后,Orion软件框架执行.NET程序SolarWinds.BusinessLayerHost.exe来加载插件,包括SolarWinds.Orion.Core.BusinessLayer.dll。这个插件包含许多合法的命名空间、类和例程,它们在Orion框架中实现功能。隐藏在显而易见的地方,类SolarWinds.Orion.Core.BusinessLayer.OrionImprovementB实现了一个基于http的后门。在逻辑上不相关的程序中的代码SolarWinds.Orion.Core.BusinessLayer.BackgroundInventory.InventoryManager.RefreshInternal在加载库存管理插件时调用后门代码。

SolarWinds.Orion.Core.BusinessLayer.dll由solarwind签名,使用序列号为0f:e9:73:75:20:22:a6:06:ad:f2:a3:6e:34:5d:c0:ed的证书。该文件签署于2020年3月24日。

初始化

在执行恶意SolarWinds.Orion.Core.BusinessLayer.OrionImprovementBusinessLayer.Initialize方法时,样本验证其小写进程名哈希值为17291806236368054941。在计算FNV-1A之后,这个散列值作为标准FNV-1A 64位散列计算,并附加一个异或660581333939102567来计算businesslayerhost.exe。

只有当程序集的文件系统写时间比当前时间至少早12到14天时,才会执行该样本;确切的阈值是从一个间隔中随机选择的。样本将继续检查这个时间阈值,因为它是由一个合法的循环后台任务运行的。一旦达到阈值,样本将创建命名管道583da945-62af-10e8-4902-a8f205c72b2e,以作为在读取SolarWinds.Orion.Core.BusinessLayer.dll.config之前只有一个实例在运行的保护并检索XML字段appSettings。appSettings字段的键是合法的值,恶意逻辑将其重新用作持久配置。要继续执行样本,键ReportWatcherRetry必须是除3以外的任何值。

样本检查机器是否进行了域联接,并在继续执行之前检索域名。用户ID是通过计算所有网络接口MAC地址的MD5(非环回设备)、域名和注册表值HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\MachineGuid来生成的。计算完MD5后,通过自定义XOR方案对用户ID进行编码。然后从SolarWinds.Orion.Core.BusinessLayer.dll.config中读取appSettings的reportwatcherdeferred键,来检索初始的、合法的值。执行此操作时,后面的样本位包标志将被放入该字段,并且必须知道初始值,以便读出位标志。然后,样本调用方法Update,该方法是样本的核心事件循环。

DGA和黑名单

后门使用域生成算法(DGA)确定其C2服务器,来构造和解析avsvmcloud[.]com的子域。Update方法负责初始化加密帮助程序,该程序用来生成这些随机C2子域。这些子域与以下内容之一串联,以创建要解析的主机名:

.appsync-api.eu-west-1[.]avsvmcloud[.]com
.appsync-api.us-west-2[.]avsvmcloud[.]com
.appsync-api.us-east-1[.]avsvmcloud[.]com
.appsync-api.us-east-2[.]avsvmcloud[.]com

获取进程名、服务名和驱动程序路径列表,并通过前面描述的FNV-1a+XOR算法对每个值进行散列,并根据硬编码的块列表进行检查。作为分析的一部分,这些散列中的一些已经被强力逆转,这表明这些进程正在扫描分析工具和防病毒引擎组件。如果发现一个被阻止的进程,则Update进程将退出,并且样本将继续尝试执行该进程,直到被阻止列表通过。被阻止的服务通过将其HKLM\SYSTEM\CurrentControlSet\services\<service_name>\Start注册表项设置为值4(禁用)来停止。如果在系统上发现服务列表中的一些条目,可能会影响DGA算法的生成值的行为。然后,停止的服务列表被位打包到样本配置文件的appSettings项的ReportWatcherPostpone键中。如果任何服务被转换为禁用,则更新方法将退出并稍后重试。样本通过WMI查询Select *从Win32_SystemDriver检索驱动程序清单。如果看到任何被阻止的驱动程序,更新方法退出并重试。如果所有黑名单测试都通过了,该样本将尝试解析api.solarwinds.com以测试网络的连接性。

网络指挥与控制(C2)

如果所有的黑名单和连接性检查都通过了,样本将通过其DGA在while循环中开始生成域。样本将延迟生成域之间的随机间隔;这个时间间隔可以是1到3分钟、30到120分钟之间的任意随机值,或者在错误情况下可以是420到540分钟(9小时)。生成域名的DNS A记录将与控制恶意软件行为的硬编码的IP地址块列表进行核对。以下范围内的记录将终止恶意软件,并更新配置密钥ReportWatcherRetry到一个阻止进一步执行的值:

  • 10.0.0.0/8
  • 172.16.0.0/12
  • 192.168.0.0/16
  • 224.0.0.0/3
  • fc00:: - fe00::
  • fec0:: - ffc0::
  • ff00:: - ff00::
  • 20.140.0.0/15
  • 96.31.172.0/24
  • 131.228.12.0/22
  • 144.86.226.0/24

一旦在CNAME DNS响应中成功地检索到一个域,样本将产生一个调用HttpHelper.Initialize方法的新执行线程,负责所有C2通信和调度。HTTP线程首先延迟一段可配置的时间,该时间由SetTime命令控制。HTTP线程将在调用之间延迟至少1分钟。该恶意软件在数据被请求时使用HTTP GET或HEAD请求,在C2输出数据被发送到服务器时使用HTTP PUT或HTTP POST请求。当负载小于10000字节时使用PUT方法;否则使用POST方法。If-None-Match HTTP头包含先前计算的userID的XOR编码表示,并附加了一个具有相同长度的随机字节数组。

所有HTTP POST和PUT请求都有一个JSON payload,其中包含关键字“userId”、“sessionId”和“steps”。“steps”字段包含一个对象列表,其键如下:“Timestamp”、“Index”、“EventType”、“EventName”、“DurationMs”、“succeed”和“Message”。JSON键“EventType”被硬编码为值“Orion”,“EventName”被硬编码为“EventManager”。要发送到服务器的恶意软件响应消息经过压缩和单字节XOR编码,然后在“steps”数组中的“Message”字段之间进行分割。每个“Message”值都是Base64分别编码的。并不是“steps”数组中的所有对象都与恶意软件消息有关——“Timestamp”字段中的整数必须设置为0x2位,以表明“message”字段的内容在恶意软件消息中使用。在时间戳字段中位0x2为空的Step对象包含随机数据,在组装恶意软件响应时被丢弃。

隐形技术

在观察到的流量中,这些HTTP响应体试图表现为与.NET程序集相关的良性XML,但命令数据实际上分布在许多GUID和十六进制字符串中。通过使用以下正则表达式搜索十六进制字符串,从HTTP响应体中提取命令:"\{[0-9a-f-]{36}\}"|"[0-9a-f]{32}"|"[0-9a-f]{16}"。命令数据分布在多个字符串中,这些字符串伪装成GUID和十六进制字符串。响应中的所有匹配子字符串都将过滤非十六进制字符、连接在一起并进行十六进制解码。第一个DWORD值显示了消息的实际大小,紧跟着消息,后面是可选的额外垃圾字节。所提取的消息是使用消息的第一个字节进行单字节异或解码的,然后进行DEFLATE解压。第一个字符是一个映射到JobEngine枚举的ASCII整数,带有由空格字符分隔的可选附加命令参数。

然后根据命令值将命令发送到JobExecutionEngine,如下所述。

支持的命令

Command(命令)
Value(值)
Operation(操作)
Idle0No operation
Exit1Terminate the current thread.
SetTime2Sets the delay time between main event loop executions Delay is in seconds, and varies random between [.9 * <delay>, 1.1 * <delay>].          If the delay is < 300 it is doubled on the next execution through the loop, this means it should settle onto an interval of around [5, 10] minutes.         There is a second, unrelated delay routine that delays for a random interval between [16hrs, 83hrs]
CollectSystemDescription3Profile the local system including hostname, username, OS version, MAC addresses, IP address, DHCP configuration, and domain information.
UploadSystemDescription4Perform a HTTP request to the specified URL, parse the results and compare components against unknown hashed values. Format a report and send to the C2 server.
RunTask5Starts a new process with the given file path and arguments
GetProcessByDescription6Returns a process listing. If no arguments are provided returns just the PID and process name.        If an argument is provided it also returns the parent PID and username and domain for the process owner. 
KillTask7Terminate the given process, by PID.
GetFileSystemEntries8Given a path and an optional match pattern recursively list files and directories
WriteFile9Given a file path and a Base64 encoded string write the contents of the Base64 decoded string to the given file path. Write using append mode. Delay for [1s, 2s] after writing is done.
FileExists10Tests whether the given file path exists.
DeleteFile11Deletes the specified file path.
GetFileHash12Compute the MD5 of a file at a given path and return result as a HEX string. If an argument is provided, it is the expected MD5 hash of the file and returns an error if the calculated MD5 differs. 
ReadRegistryValue13Arbitrary registry read from one of the supported hives
SetRegistryValue14Arbitrary registry write from one of the supported hives.
DeleteRegistryValue15Arbitrary registry delete from one of the supported hives
GetRegistrySubKeyAndValueNames 16Returns listing of subkeys and value names beneath the given registry path
Reboot17Attempts to immediately trigger a system reboot.

帮助社区检测和指示

为了让社区能够发现这个供应链的后门,我们发布了一些指示和检测来帮助组织识别这个后门和这个威胁者。签名混合了Yara、IOC和Snort格式。

在FireEye GitHub存储库中可以找到检测和签名列表。我们正在发布检测结果,并将继续更新公共存储库,在开发新的或改进现有指标的同时,对基于主机和网络的指标进行重叠检测。我们已经发现了多个哈希与这个后门,我们将发布这些哈希更新。

MITRE ATT&CK 技术观察

IDDescription
T1012Query Registry
T1027Obfuscated Files or Information
T1057Process Discovery
T1070.004File Deletion
T1071.001Web Protocols
T1071.004Application Layer Protocol: DNS
T1083File and Directory Discovery
T1105Ingress Tool Transfer
T1132.001Standard Encoding
T1195.002Compromise Software Supply Chain
T1518Software Discovery
T1518.001Security Software Discovery
T1543.003Windows Service
T1553.002Code Signing
T1568.002Domain Generation Algorithms
T1569.002Service Execution
T1584Compromise Infrastructure

即时缓解建议

SolarWinds 建议所有客户立即升级到Orion平台2020.2.1 HF 1,目前可以通过SolarWinds 客户门户获得。此外,SolarWinds还在这里发布了额外的缓解和加固说明。

如果您无法遵循SolarWinds 的建议,则可以采用以下即时缓解技术,以解决环境中安装了特洛伊木马的SolarWinds软件的风险。如果在环境中发现了攻击者活动,我们建议进行全面的调查,并根据调查结果和受影响环境的细节设计和执行补救策略。

  • 确保SolarWinds 服务器被隔离/控制,直到进行进一步的检查和调查。这应该包括屏蔽SolarWinds服务器的所有互联网出口。
  • 如果SolarWinds基础设施不是孤立的,可以考虑采取以下步骤:
    • 限制与SolarWinds服务器端点的连接范围,特别是那些被认为是0层/重要资产的服务器
    • 限制在SolarWinds服务器上拥有本地管理员特权的帐户的范围。
    • 用SolarWinds软件阻止互联网从服务器或其他端点的出口。
  • 考虑(至少)更改访问SolarWinds服务器/基础设施的帐户的密码。根据进一步检讨/调查,可能需要采取其他补救措施。
  • 如果SolarWinds用于管理网络基础设施,可以考虑对网络设备配置进行检查,以防止意外/未经授权的修改。注意,由于solarwind功能的范围,这是一种主动措施,而不是基于调查结果。

致谢

这篇博客文章是FireEye的众多人员和团队共同努力的结果。特别感谢:

Andrew Archer, Doug Bienstock, Chris DiGiamo, Glenn Edwards, Nick Hornick, Alex Pennino, Andrew Rector, Scott Runnels, Eric Scales, Nalani Fraser, Sarah Jones, John Hultquist, Ben Read, Jon Leathery, Fred House, Dileep Jallepalli, Michael Sikorski, Stephen Eckels, William Ballenthin, Jay Smith, Alex Berry, Nick Richard, Isif Ibrahima, Dan Perez, Marcin Siedlarz, Ben Withnell, Barry Vengerik, Nicole Oppenheim, Ian Ahl, Andrew Thompson, Matt Dunwoody, Evan Reese, Steve Miller, Alyssa Rahman, John Gorman, Lennard Galang, Steve Stone, Nick Bennett, Matthew McWhirt, Mike Burns, Omer Baig.

特别感谢微软的Nick Carr, Christopher Glyer和Ramin Nafisi。

本文由白帽汇整理并翻译,不代表白帽汇任何观点和立场
来源:https://www.fireeye.com/blog/threat-research/2020/12/evasive-attacker-leverages-solarwinds-supply-chain-compromises-with-sunburst-backdoor.html?1=

最新评论

昵称
邮箱
提交评论