Solarwinds Orion是一款功能强大的网络性能监控程序,这就是目前为什么全球有超过45000用户,不论是小公司还是全球500强企业,都信任和使用Solarwinds来探索、配置、监控和管理日趋复杂的系统和构建网络基础构架的流程。
FireEye最近发现了一个名叫UNC2452 的攻击者利用Solarwinds的监控框架来发起全球性攻击,这项攻击可能早在2020年年初就开始了。
SUNBURST后门
SolarWinds.Orion.Core.BusinessLayer.dll是Solarwinds Orion程序框架的SolarWinds数字签名组件,其中包含一个后门,该后门通过HTTP与第三方服务器进行通信,此SolarWinds Orion插件的木马版本,即SUNBURST。
攻击者通过该后门会检索并执行称为“作业”的命令,这些命令包括传输文件、执行文件、分析系统、重启设备和禁用系统服务的功能。该恶意程序将其网络流量伪装成 Orion Improvement Program (OIP) 协议,并将监控结果存储在合法的插件配置文件中,允许其融入合法的Solarwinds活动。后门使用多个模糊的黑名单来识别作为进程、服务和驱动程序运行的取证和杀毒程序工具。
SolarWinds数字签名程序的后门
从2020年3月到5月,多个被木马化的更新被数字签名并发布到Solarwinds更新网站上。
被木马化的更新文件是一个标准的Windows安装程序修复文件,包括与更新相关的压缩资源,包括被木马化 的SolarWinds.Orion.Core.BusinessLayer.dll组件。一旦更新被安装,恶意的DLL将被合法的solarwind可执行文件SolarWind.BusinessLayerHost.exe或SolarWindws.BusinessLayerHostx64.exe(取决于系统配置)加载。
攻击影响
FireEye已经在全球多个企业中检测到这种活动,受害者包括北美、欧洲、亚洲和中东的政府、咨询、技术、电信等企业。
通过跟踪分析,此攻击活动是一个名为UNC2452的攻击组织发起的。在获得最初的访问权限后,攻击便会使用各种技术逃避检测。
攻击过程
(1) 使用了TEARDROP和BEACON恶意软件
在分析的样本中,攻击者使用了TEARDROP和BEACON恶意软件,TEARDROP是一个内存删除器,它作为一个服务运行,生成一个线程并从文件“gracious_truth.jpg”中读取,该文件可能有一个伪装的JPG标头文件。接下来,它检查HKU\SOFTWARE\Microsoft\CTF是否存在,使用自定义滚动XOR算法解码嵌入式有效载荷,并使用类似于PE的自定义文件格式将嵌入式有效载荷手动加载到内存中。 TEARDROP的代码与之前看到的任何恶意程序都没有重叠。
(2) 处理信息
- file_operation_closed
- file-path*: “c:\\windows\\syswow64\\netsetupsvc.dll
- actor-process:
- pid: 17900
Windows Defender Exploit Guard保护日志如下:
- Process”\Device\HarddiskVolume2\Windows\System32\svchost.exe” (PID XXXXX) would have been blocked from loading the non-Microsoft-signed binary
- ‘\Windows\SysWOW64\NetSetupSvc.dll’
(3) 攻击者的主机名与受害者的环境匹配
攻击者在其命令和控制基础设施上设置主机名,以匹配在受害者环境中找到的合法主机名。这使得攻击者能够逃避检查。
攻击者基础结构会在RDP SSL证书中泄漏其已配置的主机名,这可以在网上扫描数据中识别出来。这为防御者提供了一个检测机会,查询整个网上的扫描数据源中组织的主机名可以发现可能伪装成组织的恶意IP地址。 将网上扫描数据中标识的IP列表与远程访问日志进行交叉引用可能会在环境中识别出攻击。
(4) 对受害者国家/地区的IP地址进行分析
攻击者对IP地址的选择也进行了优化,以逃避检测。攻击者主要利用虚拟专用服务器使用与受害者来自同一国家的IP地址。
(5) 使用不同凭据进行感染
一旦攻击者使用受攻击的凭据获得对网络的访问权限,他们就会使用多个不同的凭据进行横向移动,用于横向移动的凭据始终与用于远程访问的凭据不同。
(6) 临时文件替换和临时任务修改
攻击者使用临时文件替换技术来远程执行攻击程序,他们用攻击程序替换了合法程序,执行了有效载荷,然后还原了合法原始文件。他们通过更新现有合法任务以执行其工具,然后将计划任务返回到它的原始配置来操纵计划任务。他们通常会删除他们的工具,包括一旦实现合法的远程访问就删除后门。
深入恶意软件分析
SolarWinds.Orion.Core.BusinessLayer.dll(b91ce2fa41029f6955bff20079468448)是Orion软件框架中由SolarWinds签名的插件组件,其中包含经过混淆的后门,该后门通过HTTP与第三方服务器进行通信。经过长达两周的初始休眠期后,它会检索并执行称为“作业”的命令,这些命令包括传输和执行文件,对系统进行配置文件以及禁用系统服务的功能。后门的行为和网络协议与合法的SolarWinds活动融为一体,例如伪装成Orion改进程序(OIP)协议并将检测结果存储在插件配置文件中。后门程序使用多个阻止列表,以通过进程、服务和驱动程序识别取证和杀毒软件工具。
攻击能力
- 执行子域域名生成算法(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.OrionImprovementBusinessLayer实现了基于HTTP的后门。逻辑上不相关的例程SolarWinds.Orion.Core.BusinessLayer.BackgroundInventory.InventoryManager.RefreshInternal中的代码在加载库存管理器插件时调用后门代码。
SolarWinds.Orion.Core.BusinessLayer.dll由SolarWinds签名,使用序列号为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 64位哈希,并带有附加值计算FNV-1A之后,通过6605813339339102567进行XOR,此哈希与名为businesslayerhost.exe的进程匹配。
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算法对每个值进行哈希处理,并对照硬编码的阻止列表进行检查。在此分析过程中,其中一些哈希已被暴力逆向,这表明这些例程正在扫描分析工具和杀毒引擎组件。如果找到阻止列表的进程,则更新例程将退出,并且样本将继续尝试执行该例程,直到阻止列表通过为止。通过将其列入名单的服务的HKLM \ SYSTEM \ CurrentControlSet \ services \< service_name >\Start注册表项设置为值4来停止禁用。
如果在系统中找到服务列表中的某些条目,则可能会影响DGA算法在生成的值方面的行为。停止服务的列表将被位打包到appSettings条目的ReportWatcherPostpone键中,用于示例的配置文件。如果有任何服务被转换为禁用,则Update方法将退出并稍后重试。该示例通过WMI查询Select*从Win 32_SystemDriver检索驱动程序列表。如果看到任何块列表驱动程序,则Update方法退出并重试。如果所有的块列表测试都通过了,则示例尝试解析api.solarwins.com来测试网络的连接性。
网络命令和控制(C2)
如果所有阻止列表和连接性检查均通过,则样本将通过其DGA在while循环中开始生成域。本文的样本将延迟域生成之间的随机间隔;此时间间隔可以是1到3分钟,30到120分钟或在错误条件下最长420到540分钟(9小时)范围内的任意随机值。根据控制恶意程序行为的IP地址块的硬编码列表检查生成的域的DNS A记录。以下范围内的记录将终止恶意程序,并将配置项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响应中成功检索到域,该样本将产生一个新的执行线程,调用该方法负责所有C2通信和调度的HttpHelper.Initialize方法。 HTTP线程通过延迟由SetTime命令控制的可配置时间开始。两次调用之间,HTTP线程将至少延迟1分钟。当请求数据时,该恶意程序使用HTTP GET或HEAD请求,而当C2输出数据发送到服务器时,则使用HTTP PUT或HTTP POST请求。当有效载荷小于10000字节时,将使用PUT方法,否则将使用POST。 If-None-Match HTTP标头将先前计算出的userID的XOR编码表示形式保留为值,并附加一个长度相同的随机字节数组。
JSON有效载荷适用于所有HTTP POST和PUT请求,并且包含 “userId”,“sessionId”和“steps”项。 “steps”字段包含具有以下项的对象列表:“时间戳”,“索引”,“事件类型”,“事件名称”,“持续时间”,“成功”和“消息”。 JSON项“EventType”被硬编码为值“Orion”,而“EventName”被硬编码为“EventManager”。将发送到服务器的恶意程序响应消息进行DEFLATE压缩和单字节XOR编码,然后在“steps”数组的“消息”字段之间进行拆分。每个“消息”值均经过Base64编码。并非“steps”数组中的所有对象都构成了恶意程序消息,“时间戳”字段中的整数必须设置为0x2位,以指示恶意程序消息中使用了“消息”字段的内容。
逃避方法
在观察到的流量中,这些HTTP响应对象试图看起来像与.NET程序集相关的良性XML,但是命令数据实际上分布在存在的许多GUID和HEX字符串中。通过使用以下正则表达式搜索HEX字符串,从HTTP响应主体中提取命令"\{[0-9a-f-]{36}\}"|"[0-9a-f]{32}"|"[0-9a-f]{16}"。命令数据分布在多个字符串中,这些字符串伪装成GUID和HEX字符串。响应中的所有匹配子字符串都将针对非HEX字符进行过滤,合并在一起并进行HEX解码。第一个DWORD值显示消息的实际大小,紧随其后的是消息,其后是可选的其他垃圾字节。使用消息的第一个字节对提取的消息进行单字节XOR解码,然后对其进行DEFLATE解压缩。第一个字符是ASCII整数,它映射到JobEngine枚举,并带有由空格字符分隔的可选附加命令参数。
然后根据命令值将命令发送到JobExecutionEngine,如下所述。
支持的命令
缓解办法
Solarwinds建议所有客户立即升级到Orion最新版本,该版本目前可通过SolarWinds客户门户获得。此外,你可以点此了解SolarWinds发布的其他缓解和强化说明。
如果你无法使用solarwind的建议,则可以采用以下缓解技术:
(1) 确保solarwind服务器被隔离/控制,直到进行进一步的检查和调查。这应该包括屏蔽Solarwinds服务器的所有互联网出口。
(2) 如果Solarwinds基础设施不是处于隔离状态,可以考虑采取以下步骤:
- 限制与solarwind服务器终端的连接范围;
- 限制在solarwind服务器上拥有本地管理员特权的帐户的范围;
- 使用SolarWinds程序阻止来自服务器或其他终端的互联网出口;
- 更改有权访问SolarWinds服务器/基础结构的帐户的密码;
- 如果solarwind用于管理网络基础设施,可以考虑对网络设备配置进行检查,以防止意外/未经授权的修改。