跳到主要内容我们与安全行业以及我们的合作伙伴一起,继续调查Solorigate攻击的程度。在调查过程中,我们希望为防御者社区提供情报,以了解其范围,影响,补救指南以及我们由此建立的产品检测和保护。
尽管整个安全行业仍在调查折衷的全部范围,但在此博客中,我们将分享对导致这种复杂攻击的被折衷的SolarWinds Orion Platform DLL的见解。在单个DLL文件中添加一些看起来不错的代码行,对使用受影响产品的组织构成了严重威胁,该产品是包括政府和安全行业在内的垂直行业广泛使用的IT管理软件。插入DLL的谨慎恶意代码称为后门,该后门由近4,000行代码组成,这些代码使攻击背后的威胁行为者能够在受感染的网络中不受限制地运行。
漏洞文件经过数字签名的事实表明,攻击者能够访问公司的软件开发或分发管道。有证据表明,早在2019年10月,这些攻击者就一直在测试通过添加空类来插入代码的能力。因此,将恶意代码插入SolarWinds.Orion.Core.BusinessLayer.dll的时间可能很早,即在软件构建的最后阶段之前,其中包括对已编译的代码进行数字签名。结果,包含恶意代码的DLL也进行了数字签名,从而增强了其运行特权操作的能力,并且保持低调。
攻击者在许多行动中都采取措施保持低调。例如,插入的恶意代码是轻量级的,仅具有在并行线程中运行添加了恶意软件的方法的任务,以使DLL的正常操作不会被更改或中断。此方法是类的一部分,攻击者将其命名为OrionImprovementBusinessLayer,与其他代码混合。该类包含所有后门功能,包括13个子类和16个方法,其字符串被混淆以进一步隐藏恶意代码。
加载后,后门将通过一系列检查,以确保后门在实际的企业网络中运行,而不是在分析人员的计算机上运行。然后,它使用部分从从受影响的设备收集的信息中生成的子域联系命令与控制(C2)服务器,这意味着每个受影响的域都有一个唯一的子域。这是攻击者试图逃避检测的另一种方式。
由于后门功能和功能列表很长,因此该后门程序使手动键盘攻击者可以执行各种操作。正如我们在过去的人为攻击中所看到的那样,一旦在网络内部进行操作,对手就可以在网络上进行侦察,提升特权并横向移动。攻击者逐渐在网络上移动,直到实现目标为止,无论是网络间谍活动还是经济利益。
检测这类攻击所面临的挑战意味着,除了强大的预防性保护措施之外,组织还应专注于可从网络运营的各个方面着手的解决方案,以检测网络内部已经存在的正在进行的攻击。
以前,我们已经提供了指导和补救步骤,以帮助确保客户有能力应对这种威胁。在此博客中,我们将分享对后门行为和功能的深入分析,并说明为什么后门会对业务环境造成高风险。我们还将分享Microsoft Defender for Endpoint提供的全面的端点保护的详细信息。在即将发布的博客中,我们将讨论更广泛的Microsoft 365 Defender的保护,该保护将来自端点的信号与其他域(身份,数据,云)集成在一起,以提供协调的检测,调查和修复功能。
攻击者将恶意代码插入了SolarWinds.Orion.Core.BusinessLayer.dll,该代码库属于SolarWinds Orion平台。攻击者必须在此DLL组件中找到合适的位置来插入其代码。理想情况下,他们将在定期调用的方法中选择一个位置,以确保执行和持久性,从而确保恶意代码始终处于运行状态。如此合适的位置原来是名为RefreshInternal的方法。
对该函数的修改非常轻巧,很容易被忽略-它所做的只是在并行线程中执行OrionImprovementBusinessLayer.Initialize方法,因此不会改变RefreshInternal的常规执行流程。
为什么选择这种方法而不是其他方法?快速查看此DLL的体系结构,可以看到RefreshInternal是SolarWinds.Orion.Core.Business.Layer.BackgroundInventory.InventoryManager类的一部分,并由可追溯到CoreBusinessLayerPlugin类的一系列方法调用。此类的目的是通过名为Start的方法(可能在DLL加载时的早期)启动其执行,以初始化各种其他组件并安排执行多个任务。这些任务包括后台清单,该清单最终会启动恶意代码。
后门的功能完全位于OrionImprovementBusinessLayer类中,包括13个子类和16个方法。它的名称与其他合法代码融合在一起。威胁行为者足够聪明,可以避免使用诸如“后门”,“键盘记录程序”之类的免费术语,而是选择了更为中性的行话。乍一看,该DLL中的代码看起来正常,不会引起怀疑,这可能是几个月以来未检测到恶意代码插入的部分原因,特别是如果该DLL的代码不经常更新的话。
为了使窥探产生一些最小的混淆效果,后门中的字符串将在Base64中进行压缩和编码,或者使用其哈希值代替。
Initialize方法是后门的实际执行入口点。它会执行几项检查,以验证它是否在真实受害者的环境中运行:
它检查恶意DLL的最后写入时间至少提前12到14天
它验证当前设备的域名是否满足以下条件:域中不得包含某些字符串;这些字符串的检查是通过哈希实现的,因此此时被阻止列出的域名是未知的
域不得与正则表达式(?i)([^ a-z] | ^)(test)([^ a-z] | $)匹配,或更简单地说,它不得看起来像测试域
它检查是否没有与安全相关的软件相关的正在运行的进程(例如,Windbg,Autoruns,Wireshark)
它检查属于安全相关软件的某些服务的状态是否符合某些条件(例如,windefend,sense,cavp)
如果这些检查中的任何一个失败,则后门将终止。所有这些检查都是为了避免将恶意功能暴露在有害环境中,例如测试网络或属于SolarWinds的计算机。
经过上述广泛的验证,后门进入其主要执行阶段。从本质上讲,后门是一种非常标准的后门,它从C2服务器接收指令,执行这些指令并发送回信息。可执行的命令类型包括操纵注册表项,创建进程以及删除文件等,有效地为攻击者提供了对设备的完全访问权限,尤其是因为它是从受信任的签名二进制文件中执行的。
在第一步中,后门将启动到预定义C2服务器的连接,以报告有关受感染系统的一些基本信息并接收第一个命令。 C2域由四个不同部分组成:三个部分来自在后门中硬编码的字符串,一个组件是根据从设备中提取的一些唯一信息动态生成的。这意味着每个受影响的设备都会生成一个不同的子域以进行联系(可能不止一个)。这是生成的域的示例:
域的动态生成部分是有趣的部分。通过对以下数据进行散列来计算:
后门还生成在C2域上请求的伪随机URI。像域一样,URI是使用一组硬编码的关键字和路径组成的,这些关键字和路径部分是随机选择的,部分是基于要发送的HTTP请求的类型选择的。可以生成的可能的URI遵循以下格式:
pki / crl /<随机分量> .crl,其中< 可以是数字和以下字符串之一:
字体/ woff /<随机组件> -webfont<随机组件> .woff2或fonts / woff /<随机分量> .woff2,其中< 可以是数字以及以下一个或多个字符串:
刷卡/更新/<随机分量&gt ;,其中< 可以是以下字符串中的一个或多个:
最后,后门组成了一个JSON文档,在其中添加了前面描述的唯一用户ID,会话ID和一组其他不相关的数据字段。然后,它将此JSON文档发送到C2服务器。
如果通信成功,则C2将使用编码后的压缩数据缓冲区进行响应,该缓冲区包含后门要执行的命令。 C2可能还会回复有关要报告的其他C2地址的信息。后门接受以下命令:
简而言之,这些命令允许攻击者运行,停止和枚举进程。读取,写入和枚举文件和注册表项;收集并上传有关设备的信息;然后重新启动设备,等待或退出。命令CollectSystemDescription检索以下信息:
一旦获得了后门访问权限,攻击者将遵循特权升级探索,凭证盗窃和横向移动狩猎等标准手册,以获取高价值的帐户和资产。为了避免检测,攻击者将Windows管理工具(如adfind.exe)重命名,然后将其用于域枚举。
C:\ Windows \ system32 \ cmd.exe / C csrss.exe -h Breaked.contoso.com -f(名称=“域管理员”)成员-列表| csrss.exe -h Breaked.contoso.com -f objectcategory = *> 。\ Mod \ mod1.log
通过PowerShell远程任务创建观察到横向移动,如FireEye和Volexity所述:
$ scheduler =新对象-ComObject(“ Schedule.Service”); $ scheduler.Connect($ env:COMPUTERNAME); $ folder = $ scheduler.GetFolder(“ \ Microsoft \ Windows \ SoftwareProtectionPlatform”); $ task = $ folder .GetTask(“ EventCacheManager”); $ definition = $ task.Definition; $ definition.Settings.ExecutionTimeLimit =“ PT0S”; $ folder.RegisterTaskDefinition($ task.Name,$ definition,6,“ System”,$ null,5 );回显“完成” C:\ Windows \ system32 \ cmd.exe / C schtasks / create / F / tn“ \ Microsoft \ Windows \ SoftwareProtectionPlatform \ EventCacheManager” / tr“ C:\ Windows \ SoftwareDistribution \ EventCacheManager.exe” / sc ONSTART / ru系统/ S [machine_name]
使用Rundll32,每个受感染的设备都可以接收唯一的二进制哈希,唯一的本地文件系统路径,伪唯一的导出以及唯一的C2域。
后门还允许攻击者提供第二阶段的有效负载,这是Cobalt Strike软件套件的一部分。随着情况的继续发展,我们将继续调查这些有效载荷,这些有效载荷被检测为Trojan:Win32 / Solorigate.A!dha。
供应链折衷仍然是安全行业日益关注的问题。 Solorigate事件严重提醒人们,这些攻击可以对成功入侵的网络造成广泛影响和深远后果的有害结合。我们继续敦促客户:
通过减少攻击面来强化网络并建立强大的预防性保护是防御组织的基本要求。最重要的是,对系统和网络活动的全面可见性推动了对异常行为和潜在危害迹象的早期检测。更重要的是,通过AI关联信号的能力可能会浮出水面的攻击者活动更多。
Microsoft Defender for Endpoint在Solorigate攻击链中具有全面的检测范围。这些检测会发出警报,以通知安全操作团队有关此事件的活动和工件的存在。鉴于此攻击涉及合法软件的危害,因此无法启用自动修复功能以防止服务中断。但是,这些检测可以提供攻击活动的可见性。然后,分析师可以使用Microsoft Defender Endpoint中的调查和补救工具来进行深入调查和其他查找。
Microsoft 365 Defender通过整合来自跨域(身份,数据,云应用以及端点)的威胁数据,提供了端点以外的可见性,从而针对此威胁提供了协调的防御。这种跨域可见性使Microsoft 365 Defender可以关联信号并全面解决整个攻击链。然后,安全运营团队可以使用这些丰富的威胁数据进行搜寻,并获得洞察力,以使网络免受威胁。
Microsoft Defender防病毒软件是Windows 10上的默认反恶意软件解决方案,可检测并阻止恶意DLL及其行为。即使该进程正在运行,它也会隔离恶意软件。
检测从数据库中获取哈希值和SolarWinds密码以及机器信息的PowerShell有效负载:
Microsoft Defender安全中心和Microsoft 365安全中心中具有以下标题的警报可以指示您网络上的威胁活动:
Microsoft Defender安全中心和Microsoft 365安全中心中具有以下标题的警报可以表明此报告中的威胁活动已发生或稍后可能发生的可能性。这些警报还可以与其他恶意威胁相关联。
图10. Microsoft Defender for Endpoint检测启动的可疑LDAP查询并尝试提取ADFS私钥
图11. Microsoft Defender for Endpoint警报说明和可能尝试访问ADFS关键材料的建议措施
我们通过安全技术提供这些保护的能力得到了安全专家的支持,他们立即调查了这种攻击,并在事件发展时继续进行调查。在这种情况下,由专家进行仔细的监视非常重要,因为我们正在与一个积极进取且高度复杂的威胁参与者打交道。就像我们的产品相互集成以合并和关联信号一样,Microsoft的安全专家和威胁研究人员正在共同努力解决这种高级攻击并确保我们的客户受到保护。
我们发布了有关此事件的全面威胁分析报告。威胁分析报告提供了技术信息,检测详细信息和建议的缓解措施,旨在使防御者能够了解攻击,评估其影响并查看防御。
Microsoft 365 Defender和Microsoft Defender for Endpoint客户可以运行高级搜寻查询来搜寻此攻击中使用的类似TTP。
要查找加载到内存中的恶意DLL的存在或分布,请运行以下查询
DeviceImageLoadEvents |其中SHA1在(“d130bd75645c2433f88ac03e73395fba172ef676“,” 1acf3108bf1e376c8848fbb25dc87424f2c2a39c”,” e257236206e99f5a5c62035c9c59c57206728b28”,” 6fdd82b7ca1c1f0ec67c05b36d14c9517065353b”,” 2f1a5a7411d015d01aaee4535835400191645023“,” bcb5a4dcbc60d26a5f619518f2cfc1b4bb4e4387”,” 16505d0b929d80ad1680f993c02954cfd3772207“,” d8938528d68aabe1e31df485eb3f75c8a925b5d9”,” 395da6d4f3c890295f7584132ea73d759bd9d094“,” c8b7f28230ea8fbf441c64fdd3feeba88607069e”,” 2841391dfbffa02341333dd34f5298071730366a”,” 2546b0e82aecfe987c318c7ad1d00f9fa11cd305 “,” e2152737bed988c0939c900037890d1244d9a30e”)或在SHA256(‘ce77d116a074dab7a22a0fd4f2c1ab475f16eec42e1ded3c0b0aa8211fe858d6”,’dab758bf98d9b36fa057a66cd0284737abf89857b73ca89280267ee7caf62f3b”,” eb6fab5a2964c5817fb239a7a5079cabca0a00464fb3e07155f28b0a57a2c0ed”,” ac1b2b89e60707a20e9eb1ca480bc3410ead40643b386d624c5d21b47c02917c”,” 019085a76ba7126fff22770d71bd901c325fc68ac55aa743327984e89f4b0134“,” c09040d35630d75dfef0f804f320f8b3d16a481071076918e9b236a321c1ea77”,” 0f5d7e6d fdd62c83eb096ba193b5ae394001bac036745495674156ead6557589“,” e0b9eda35f01c1540134aba9195e7e6393286dde3e001fce36fb661cc346b91d”,” 20e35055113dac104d2bb02d4e7e33413fae0e5a426e0eea0dfd2c1dce692fd9”,” 2b3445e42d64c85a5475bdbc88a50ba8c013febb53ea97119a11604b7595e53d”,” a3efbc07068606ba1c19a7ef21f4de15d15b41ef680832d7bcba485143668f2d”,” 92bd1c3d2a11fc4aba2735d9547bd0261560fb20f36a0e7ca2f2d451f1b62690“,” a58d02465e26bdd3a839fd90e4b317eece431d28cab203bbdde569e11247d9e2”,” cc082d21b9e880ceb6c96db1c48a0375aaf06a5f444cb0144b70e01dc69048e6“)
要查找在系统中或本地创建的恶意DLL的存在或分布,请运行以下查询
DeviceFileEvents |其中SHA1在(“d130bd75645c2433f88ac03e73395fba172ef676“,” 1acf3108bf1e376c8848fbb25dc87424f2c2a39c”,” e257236206e99f5a5c62035c9c59c57206728b28”,” 6fdd82b7ca1c1f0ec67c05b36d14c9517065353b”,” 2f1a5a7411d015d01aaee4535835400191645023“,” bcb5a4dcbc60d26a5f619518f2cfc1b4bb4e4387”,” 16505d0b929d80ad1680f993c02954cfd3772207“,” d8938528d68aabe1e31df485eb3f75c8a925b5d9”,” 395da6d4f3c890295f7584132ea73d759bd9d094“,” c8b7f28230ea8fbf441c64fdd3feeba88607069e”,” 2841391dfbffa02341333dd34f5298071730366a”,” 2546b0e82aecfe987c318c7ad1d00f9fa11cd305 “,” e2152737bed988c0939c900037890d1244d9a30e”)或在SHA256(‘ce77d116a074dab7a22a0fd4f2c1ab475f16eec42e1ded3c0b0aa8211fe858d6”,’dab758bf98d9b36fa057a66cd0284737abf89857b73ca89280267ee7caf62f3b”,” eb6fab5a2964c5817fb239a7a5079cabca0a00464fb3e07155f28b0a57a2c0ed”,” ac1b2b89e60707a20e9eb1ca480bc3410ead40643b386d624c5d21b47c02917c”,” 019085a76ba7126fff22770d71bd901c325fc68ac55aa743327984e89f4b0134“,” c09040d35630d75dfef0f804f320f8b3d16a481071076918e9b236a321c1ea77”,” 0f5d7e6d fdd62c83eb096ba193b5ae394001bac036745495674156ead6557589“,” e0b9eda35f01c1540134aba9195e7e6393286dde3e001fce36fb661cc346b91d”,” 20e35055113dac104d2bb02d4e7e33413fae0e5a426e0eea0dfd2c1dce692fd9”,” 2b3445e42d64c85a5475bdbc88a50ba8c013febb53ea97119a11604b7595e53d”,” a3efbc07068606ba1c19a7ef21f4de15d15b41ef680832d7bcba485143668f2d”,” 92bd1c3d2a11fc4aba2735d9547bd0261560fb20f36a0e7ca2f2d451f1b62690“,” a58d02465e26bdd3a839fd90e4b317eece431d28cab203bbdde569e11247d9e2”,” cc082d21b9e880ceb6c96db1c48a0375aaf06a5f444cb0144b70e01dc69048e6“)
DeviceProcessEvents |其中InitiatingProcessFileName =〜“ SolarWinds.BusinessLayerHost.exe” |其中FileName =〜“ powershell.exe” //提取base64编码的字符串,确保有效的base64长度|扩展base64_extracted = extract(‘(([A-Za-z0-9 + /] {20,} [=] {0,3})’,1,ProcessCommandLine)|扩展base64_extracted = substring(base64_extracted,0,(strlen(base64_extracted)/ 4)* 4)|扩展base64_decoded = replace(@'\ 0','',make_string(base64_decode_toarray(base64_extracted)))// |其中notempty(base64_extracted)和base64_extracted匹配正则表达式“ [A-Z]”,而base64_extracted匹配正则表达式“ [0-9]”
DeviceProcessEvents |其中InitiatingProcessFileName =〜“ SolarWinds.BusinessLayerHost.exe” |其中FileName ==“ cmd.exe”,ProcessCommandLine具有“ echo”
要将DNS查找定位到恶意行为者的域,请运行以下查询
DeviceEvents | 其中ActionType ==“ DnsQueryResponse” // DNS查询响应和AdditionalFields具有“ .avsvmcloud” 要将DNS查找定位到恶意行为者的域,请运行以下查询 DeviceNetworkEvents | 哪里远程 ......