【译】SolarWinds Orion供应链攻击:Solorigate分析

  • A+
所属分类:安全新闻

背景

近日,我们与安全行业的合作伙伴一起,继续调查Solorigate(或SUNBURST)攻击的情况。目的是希望为安全社区提供情报,以了解其范围和影响,以及实现基于产品的检测和防护。


我们分享了对导致这一复杂攻击的SolarWinds Orion Platform DLL的分析。攻击者在SolarWindsIT管理软件(被广泛用于各个行业,包括政府和安全行业)产品的DLL文件中添加恶意代码,也就是后门,它由近4000行代码组成,攻击者能够利用此后门在受感染的网络中不受限制的运行和操作。

有证据表明,早在201910月,这些攻击者就一直通过添加empty classes来测试他们插入代码的能力。因此,攻击者访问公司的软件开发或分发管道,将恶意代码插入SolarWinds.Orion.Core.BusinessLayer.dll的时间可能在早期阶段,即软件编译之前,包括对编译后的代码进行数字签名。最后,包含恶意代码的DLL也被数字签名,这增强了它的运行权限和潜伏性。

攻击者在其多个活动中都采取保护措施来隐藏自己,如插入轻量级恶意代码,只在并行线程中运行添加恶意软件的方法,这样DLL的正常操作就不会被更改或中断。此方法是类的一部分,攻击者将其命名为OrionImprovementBusinessLayer以便与其它代码混合。该类包含了所有后门功能,包括13个子类和16个方法,并对字符串进行模糊处理以进一步隐藏恶意代码。

加载后,后门程序会进行一系列的检查,以确保它在真实的企业网络中运行,而不是在分析人员的机器上。然后,它使用从受影响设备收集的信息生成的子域与命令与控制(C2)服务器联系,这意味着每个受影响的域都有一个唯一的子域。这是攻击者试图绕过检测的另一种方式。

这个后门有着丰富的功能,允许攻击者执行各种各样的操作。正如我们在过去的攻击中所看到的,一旦在网络中运行,攻击者可以在网络上侦察、提升权限并横向移动,直到他们能够实现他们的目标,无论是网络间谍还是经济利益。

下图为Solorigate恶意软件的攻击链:

若想检测此类攻击,除了较为完善的预防和保护措施之外,组织还应专注于从网络运营的各个方面着手的解决方案,以检测网络内部已经存在的攻击和威胁。

以下,我们将分享对后门行为和功能的深入分析,并说明为什么后门会对业务环境造成高风险。

 

起源:受感染的DLL文件

SolarWinds供应链攻击中的受感染文件为SolarWinds.Orion.Core.BusinessLayer.dll,该文件属于SolarWindsOrion平台。攻击者通过将恶意代码插入到该dell中来实现目的,因此攻击者必须在其中找一个合适的位置。理想情况下,他们会在定期调用的方法中选择一个位置,以确保执行和持久性,从而使恶意代码始终处于运行状态。这个合适的位置即原名为RefreshInternal的方法。

原始方法如下:


被后门引导程序感染的方法:


对这个函数的修改非常轻量,很容易被忽略,它所做的只是在并行线程中执行OrionImprovementBusinessLayer.Initialize方法,因此不会更改RefreshInternal的常规执行流程。

至于攻击者为什么选择这个方法而不是其它方法,快速浏览DLL的体系结构就会发现RefreshInternalSolarWinds.Orion.Core.Business.Layer.BackgroundInventory.InventoryManager类的一部分,并由一系列方法调用,这些方法可以追溯到CoreBusinessLayerPlugin类。

此类的目的是通过名为Start的方法(可能在加载DLL的早期阶段)来启动执行,以初始化其它组件并计划多个任务的执行。这些任务包括“Background Inventory”,它最终会启动恶意代码。

下图显示了插入的恶意代码在并行线程中运行:


后门的功能完全位于OrionImprovementBusinessLayer类中,该类包含13个子类和16个方法。它的名称与其它合法代码融合在一起。攻击者非常聪明,避免使用“backdoor”, “keylogger”之类的关键词,而是使用了更模糊的行业术语。因此,该DLL中的代码看起来正常,不会引起怀疑,这也可能是几个月以来未检测到恶意插入代码的原因之一,特别是如果该DLL的代码不经常更新的话。

为了达到一些小的混淆效果,后门中的字符串将在Base64中进行压缩和编码,或者使用其哈希值代替:


 

初步侦查

Initialize方法是后门程序实际执行的入口点。它执行几项检查以验证它是在一个真实的受害者的环境中运行:

  • 它验证承载恶意DLL的进程是否命名为solarwinds.businesslayerhost.exe

  • 它检查恶意DLL的最后写入时间至少提前1214天。

  • 它会随机延迟执行时间。

  • 它会验证当前设备的域名是否满足以下条件:

    1.域不能包含特定的字符串,这些字符串的检查是通过散列实现的,因此此时被阻止列出的域名是未知的。

    2.域名不能包含“solarwinds”。

    3.域不能与正则表达式(?i)([^a-z]|^)(test)([^a-z]|$)匹配,或者说,它不能看起来像一个测试域。

  • 它检查是否有安全软件相关的进程(如WindbgAutorunsWireshark等)。

  • 它检查是否从相关安全软件(例如groundling32.sys)中加载驱动程序。

  • 它检查相关安全软件的某些服务的状态是否满足某些条件(如windefendsensecavp)。

  • 它检查主机“api.solarwinds.com”是否解析为预期的IP地址。

 

如果这些检查中的任何一项失败,则后门将终止执行。所有检查都是为了避免将恶意功能暴露在有害环境中(如测试网络或属于SolarWinds的计算机)。

 

后门

经过上述验证后,后门将进入主要执行阶段。从本质上讲,后门是一种非常标准的后门,它从C2服务器接收指令、执行这些指令并回送信息。可以执行的命令类型包括从操纵注册表项到创建进程以及删除文件等,有效地为攻击者提供了对设备的访问权限,尤其是因为它是从受信任的签名二进制文件中执行的。

在第一步中,后门将启动连接到预定义C2服务器,以报告受感染系统的一些基本信息并接收第一个命令。C2域由4个不同部分组成:3个部分来自于在后门中硬编码的字符串,另外一个组件是从设备中提取的一些唯一信息动态生成的。这意味着每个受影响的设备都会生成一个不同的子域以进行联系,也可能不止一个。下面是一个动态生成C2域的例子:



域的动态生成部分通过对以下数据进行散列来计算:

  • 网络接口的物理地址;

  • 设备的域名;

  • 来自注册表项HKEY_LOCAL_MACHINESOFTWAREMicrosoftCryptographyMachineGuid注册表值的内容;

 

后门还生成在C2域上请求的伪随机URI。与域相同,URI使用一组硬编码的关键字和路径组成,这些关键字和路径部分是随机选择的,部分是根据发出的HTTP请求的类型来选择的。生成的URL可能遵循以下格式:

格式

随机部分

pki/crl/ <随机部分> .crl

随机部分为其中之一:

“-root”、“-cert”、“-universal_ca”、“-ca”、“-primary_ca”、“-timestamp”、“-global”、“-secureca”

fonts/woff/<随机部分>-webfont<随机部分>.woff2 或fonts/woff/<随机部分 >.woff2

随机部分为其中一个或多个:

“Bold”、“BoldItalic”、“ExtraBold”、“ExtraBoldItalic”、“Italic”、“Light”、“LightItalic”、“Regular”、“SemiBold”、“SemiBoldItalic”、“opensans”、“noto”、“freefont”、“SourceCodePro”、“SourceSerifPro”、“SourceHanSans”、“SourceHanSerif”

swip/upd/<随机部分 >

随机部分为其中一个或多个:

“SolarWinds”、“.CortexPlugin”、“.Orion”、“Wireless”、“UI”、“Widgets”、“NPM”、“Apollo”、“CloudMonitoring”、“Nodes”、“Volumes”、“Interfaces”、“Components”

swip/Upload.ashx

/

swip/Events

/

 

以下是后门生成的最终URL的示例:

hxxps://3mu76044hgf7shjf[.]appsync-api[.]eu-west-1[.]avsvmcloud[.]com/swip/upd/Orion[.]Wireless[.]xml

hxxps://3mu76044hgf7shjf[.]appsync-api[.]us-east-2[.]avsvmcloud[.]com/pki/crl/492-ca[.]crl

hxxps://3mu76044hgf7shjf[.]appsync-api[.]us-east-1[.]avsvmcloud[.]com/fonts/woff/6047-freefont-ExtraBold[.]woff2


最后,后门程序会生成一个JSON文档,该文档中添加了唯一用户ID、一个会话ID和一组不相关的数据字段。然后,它会将这个JSON文档发送给C2服务器:

 


如果通信成功,C2将使用编码后的压缩数据缓冲区进行响应,该缓冲区包含后门要执行的命令。C2可能还会响应其它C2地址的信息。后门接受以下命令:

  • Idle

  • Exit

  • SetTime

  • CollectSystemDescription

  • UploadSystemDescription

  • RunTask

  • GetProcessByDescription

  • KillTask

  • GetFileSystemEntries

  • WriteFile

  • FileExists

  • DeleteFile

  • GetFileHash

  • ReadRegistryValue

  • SetRegistryValue

  • DeleteRegistryValue

  • GetRegistrySubKeyAndValueNames

  • Reboot

  • None

 

通过运行这些命令,攻击者可以运行、停止和枚举进程;读取、写入和枚举文件和注册表项;收集并上传有关设备的信息;重新启动设备或退出系统。其中,CollectSystemDescription命令会检索以下信息:

  • 本地计算机域名

  • 管理员帐户SID

  • 主机名

  • 用户名

  • 操作系统版本

  • 系统目录

  • 设备正常运行时间

  • 有关网络接口的信息

 

导致hands-on-keyboard攻击

一旦后门获得访问权限,攻击者就会遵循常规流程,进行权限升级、凭据盗窃并横向移动,寻找高价值的账户和资产。为避免检测,攻击者将Windows管理工具(如adfind.exe)重命名,然后将其用于域枚举。

C:Windowssystem32cmd.exe /C csrss.exe -hbreached.contoso.com -f (name=”Domain Admins”) member -list | csrss.exe -hbreached.contoso.com -f objectcategory=* > .Modmod1.log

通过PowerShell远程任务创建观察到横向移动,如FireEyeVolexity所述:

$scheduler = New-Object -ComObject(“Schedule.Service”);$scheduler.Connect($env:COMPUTERNAME);$folder =$scheduler.GetFolder(“MicrosoftWindowsSoftwareProtectionPlatform”);$task =$folder.GetTask(“EventCacheManager”);$definition =$task.Definition;$definition.Settings.ExecutionTimeLimit =“PT0S”;$folder.RegisterTaskDefinition($task.Name,$definition,6,”System”,$null,5);echo“Done” C:Windowssystem32cmd.exe /C schtasks /create /F /tn“MicrosoftWindowsSoftwareProtectionPlatformEventCacheManager” /tr“C:WindowsSoftwareDistributionEventCacheManager.exe” /sc ONSTART /ru system/S [machine_name]

持久性是使用各种技术部署的后门实现的:

1.PowerShell:

Powershell -nop -exec bypass -EncodedCommand

EncodedCommand一旦解码,将类似于:

Invoke-WMIMethod win32_process -name create-argumentlist ‘rundll32 c:windowsidmucommonypprop.dll _XInitImageFuncPtrs’-ComputerName WORKSTATION

 

2.Rundll32:

C:WindowsSystem32rundll32.exeC:WindowsMicrosoft.NETFramework64[malicious .dll file], [various exports]

使用Rundll32,每个受感染的设备都可以接收唯一的二进制哈希、唯一的本地文件系统路径、伪唯一的导出和唯一的C2域。

 

后门还允许攻击者提供第二阶段的Payload,这是Cobalt Strike软件套件的一部分。随着事态的发展,我们将继续调查这些Payload,这些Payload被检测为Trojan:Win32/Solorigate.A!dha

 

防御

供应链攻击仍然是安全行业日益关注的问题。Solorigate/SUNBURST后门提醒我们,这些攻击可以对网络造成广泛且严重的影响。因此,我们建议:

  • 隔离并调查检测到这些恶意二进制文件的设备。

  • 识别在受影响的设备上使用过的帐户,并认为它们已被盗用。

  • 调查这些终端可能是如何被感染的。

  • 调查设备感染的时间线以确定横向移动的特征。

通过减少攻击面来强化网络并建立强大的预防性保护是防御的基本要求。最重要的是,对系统和网络活动的全面检测能够较早的发现和识别异常行为和潜在威胁。

 

针对受影响产品,建议尽快升级到SolarWinds Orion Platform版本2020.2.1 HF 22019.4 HF 62020.2.1 HF2版本既可以替换受感染的组件,又可以提供一些其它安全增强功能。Orion Platform 2019.4 HF 4及之前版本则不受影响。

此外,Microsoft Defender for EndpointSolorigate攻击链中具有全面的检测作用,Microsoft 365 Defender通过整合跨域(身份、数据、云应用和终端)的威胁数据,提供了终端以外的可见性,从而针对此威胁提供了协调的防御。下图显示了在Solorigate攻击链中用于终端检测的Microsoft Defender


 


高级狩猎

Microsoft 365 DefenderMicrosoftDefender for Endpoint客户可以运行高级搜索查询,以搜索此攻击中使用的类似TTP

恶意DLL加载到内存中

查找存在或分发到内存中的恶意DLL

DeviceImageLoadEvents | where SHA1 in (“d130bd75645c2433f88ac03e73395fba172ef676″,”1acf3108bf1e376c8848fbb25dc87424f2c2a39c”,”e257236206e99f5a5c62035c9c59c57206728b28″,”6fdd82b7ca1c1f0ec67c05b36d14c9517065353b”,”2f1a5a7411d015d01aaee4535835400191645023″,”bcb5a4dcbc60d26a5f619518f2cfc1b4bb4e4387″,”16505d0b929d80ad1680f993c02954cfd3772207″,”d8938528d68aabe1e31df485eb3f75c8a925b5d9″,”395da6d4f3c890295f7584132ea73d759bd9d094″,”c8b7f28230ea8fbf441c64fdd3feeba88607069e”,”2841391dfbffa02341333dd34f5298071730366a”,”2546b0e82aecfe987c318c7ad1d00f9fa11cd305″,”e2152737bed988c0939c900037890d1244d9a30e”)or SHA256 in (“ce77d116a074dab7a22a0fd4f2c1ab475f16eec42e1ded3c0b0aa8211fe858d6″,”dab758bf98d9b36fa057a66cd0284737abf89857b73ca89280267ee7caf62f3b”,”eb6fab5a2964c5817fb239a7a5079cabca0a00464fb3e07155f28b0a57a2c0ed”,”ac1b2b89e60707a20e9eb1ca480bc3410ead40643b386d624c5d21b47c02917c”,”019085a76ba7126fff22770d71bd901c325fc68ac55aa743327984e89f4b0134″,”c09040d35630d75dfef0f804f320f8b3d16a481071076918e9b236a321c1ea77″,”0f5d7e6dfdd62c83eb096ba193b5ae394001bac036745495674156ead6557589″,”e0b9eda35f01c1540134aba9195e7e6393286dde3e001fce36fb661cc346b91d”,”20e35055113dac104d2bb02d4e7e33413fae0e5a426e0eea0dfd2c1dce692fd9″,”2b3445e42d64c85a5475bdbc88a50ba8c013febb53ea97119a11604b7595e53d”,”a3efbc07068606ba1c19a7ef21f4de15d15b41ef680832d7bcba485143668f2d”,”92bd1c3d2a11fc4aba2735d9547bd0261560fb20f36a0e7ca2f2d451f1b62690″,”a58d02465e26bdd3a839fd90e4b317eece431d28cab203bbdde569e11247d9e2″,”cc082d21b9e880ceb6c96db1c48a0375aaf06a5f444cb0144b70e01dc69048e6″)

 

在系统或本地创建的恶意DLL

查找在系统或本地创建的恶意DLL的位置或分布:

DeviceFileEvents | where SHA1 in (“d130bd75645c2433f88ac03e73395fba172ef676″,”1acf3108bf1e376c8848fbb25dc87424f2c2a39c”,”e257236206e99f5a5c62035c9c59c57206728b28″,”6fdd82b7ca1c1f0ec67c05b36d14c9517065353b”,”2f1a5a7411d015d01aaee4535835400191645023″,”bcb5a4dcbc60d26a5f619518f2cfc1b4bb4e4387″,”16505d0b929d80ad1680f993c02954cfd3772207″,”d8938528d68aabe1e31df485eb3f75c8a925b5d9″,”395da6d4f3c890295f7584132ea73d759bd9d094″,”c8b7f28230ea8fbf441c64fdd3feeba88607069e”,”2841391dfbffa02341333dd34f5298071730366a”,”2546b0e82aecfe987c318c7ad1d00f9fa11cd305″,”e2152737bed988c0939c900037890d1244d9a30e”)or SHA256 in (“ce77d116a074dab7a22a0fd4f2c1ab475f16eec42e1ded3c0b0aa8211fe858d6″,”dab758bf98d9b36fa057a66cd0284737abf89857b73ca89280267ee7caf62f3b”,”eb6fab5a2964c5817fb239a7a5079cabca0a00464fb3e07155f28b0a57a2c0ed”,”ac1b2b89e60707a20e9eb1ca480bc3410ead40643b386d624c5d21b47c02917c”,”019085a76ba7126fff22770d71bd901c325fc68ac55aa743327984e89f4b0134″,”c09040d35630d75dfef0f804f320f8b3d16a481071076918e9b236a321c1ea77″,”0f5d7e6dfdd62c83eb096ba193b5ae394001bac036745495674156ead6557589″,”e0b9eda35f01c1540134aba9195e7e6393286dde3e001fce36fb661cc346b91d”,”20e35055113dac104d2bb02d4e7e33413fae0e5a426e0eea0dfd2c1dce692fd9″,”2b3445e42d64c85a5475bdbc88a50ba8c013febb53ea97119a11604b7595e53d”,”a3efbc07068606ba1c19a7ef21f4de15d15b41ef680832d7bcba485143668f2d”,”92bd1c3d2a11fc4aba2735d9547bd0261560fb20f36a0e7ca2f2d451f1b62690″,”a58d02465e26bdd3a839fd90e4b317eece431d28cab203bbdde569e11247d9e2″,”cc082d21b9e880ceb6c96db1c48a0375aaf06a5f444cb0144b70e01dc69048e6″)

 

SolarWinds进程使用Base64启动PowerShell

寻找产生可疑的Base64编码的PowerShell命令的SolarWinds进程:

DeviceProcessEvents| where InitiatingProcessFileName=~ “SolarWinds.BusinessLayerHost.exe”| where FileName =~ “powershell.exe”//Extract base64 encoded string, ensure valid base64 length| extendbase64_extracted = extract(‘([A-Za-z0-9+/]{20,}[=]{0,3})’, 1,ProcessCommandLine)| extend base64_extracted = substring(base64_extracted, 0,(strlen(base64_extracted) / 4) * 4)| extend base64_decoded = replace(@’