原文地址:https://blog.qualys.com/vulnerabilities-research/2021/01/04/technical-deep-dive-into-solarwinds-breach
近期,许多组织都受到了SolarWinds入侵事件的影响。就各种迹象来看,这似乎是一起针对政府和私人机构的有针对性的攻击。到目前为止,这次攻击的影响范围仍然不是十分清楚,但是已知的是,黑客通过恶意的SolarWinds Orion更新获得了对受害者系统的访问权限,并且,有数千用户下载了这些更新。
由于攻击者能够访问SolarWinds软件的开发和交付通道,从而使他们能够将恶意代码添加到名为SolarWinds.Orion.BusinessLayer.dll的SolarWinds Orion平台驱动程序中。对于这种供应链攻击来说,由于受感染的dll具有相应的数字签名,使得恶意软件长时间未被发现,从而对用户造成了巨大的影响。
在这次入侵事件中,被感染的二进制文件是.Net程序集,其中包含Orion框架的许多合法名称空间、类和方法。这样的话,攻击者就能将自己的代码与合法代码融合在一起。同时,恶意代码作为OrionImprovementBusinessLayer类的一部分隐藏其中,而该类可以通过创建线程来执行,以避免中断dll的常规流称。实际上,创建线程的代码是RefreshInternal方法中的一部分,后者是dll中一个被感染的方法。
为了保留文件中的硬编码值,如进程、服务等列表,恶意软件使用了FNV-1a哈希算法的变体,将计算出的字符串哈希值与硬编码值进行XOR处理。
除了以哈希值形式保留硬编码值外,该恶意软件还使用了DEFLATE压缩算法来保留WMI查询、注册表项和令牌等字符串。
在恶意代码开始执行时,会进行各种检查,以确保代码是在合适的环境中运行:
进程名称为solarwinds.busslayerhost.exe。
dll至少提前12到14天(288到336小时)写入磁盘。
通过以下检查来检查系统的域名是否有效:
不应包含其哈希值保存在文件中的那些字符串。
不应与规则表达式(?i)([^a-z]|^)(test)([^a-z]|$)或(?i)(solarwinds)相匹配。
此外,它还会根据文件中以哈希值形式保存的进程、服务和驱动程序列表,对正在运行的进程、驱动程序和服务进行相应的检查。这看起来与检查系统上是否存在安全软件有关。
如果在系统上找到任何出现在检查列表中的服务,恶意软件就会通过操纵HKLM\SYSTEM\CurrentControlSet\Services下的服务注册表来禁用该服务。为此,它首先会找到一个新的所有者,方法是枚举通过查询“Select * From Win32_UserAccount”获得的用户列表。它会检查用户帐户是否是本地帐户,并且SID是否以S-1-5开头、以-500结尾,以确保它是本地管理员帐户。
找到相应的帐户后,恶意软件通过为其自身授予SeRestorePrivilege和SeTakeOwnershipPrivilege特权,使发现的帐户成为待修改的注册表的所有者。
为了获取已安装的驱动程序,它会使用Select * from Win32_SystemDriver WMI进行查询。
该恶意软件的核心功能就是一个HTTP后门,它与C&C服务器进行通信,并获得需要执行的命令。为了获取C&C服务器的详细信息,它会解析一个独特的FQDN,结构如下所示:
{subdomain}.domain3.domain2.domain1
domain3 = [eu-west-1, us-west-2, us-east-1, us-east-2]
domain2 = appsync-api
domain1 = avsvmcloud.com
该恶意软件实现了自己的域名生成算法,以便每次都能生成一个唯一的子域名。该DGA算法使用为系统生成的8字节用户ID和系统的域名来生成子域名。
作为DGA算法的输入之一,系统的用户ID是通过从系统收集到的以下数据生成的:
网络接口的物理地址
系统的域名
来自HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Cryptography的MachineGuid注册表值
它会将以上三个值连接起来,并计算连接后的字符串的MD5,然后进行自定义的XOR运算,从而生成相应的用户ID。
作为DGA算法的一部分,它用置换表“rq3gsalt6u1iyfzop572d49bnx8cvmkewhj”和随机数对系统的域名进行编码。
在对域名进行编码后,恶意软件就会使用用户ID、随机数和置换表“ph2eifo3n5utg1j8d94qrvbmk0sal76c”生成一个字符串。
然后,它将编码后的用户id与编码后的域名连接起来,从而得到一个子域名。这使得每个恶意软件实例的子域名和FQDN域名都是各不相同的。
该恶意软件会检查生成的FQDN域名是否已被解析,以获取IPAddress结构中的详细信息。此外,它还会检查解析的主机名是否与查询的主机名相同,然后根据IP列表和代码中硬编码的掩码检查解析的IP的地址族。如果不一致的话,则将解析的主机名用作后门的C2主机名。
作为C2通信的一部分,攻击者试图通过使用JSON格式的HTTP通信来模仿SolarWinds通信方法。以下是用于创建JSON格式的代码:
JSON格式:
{
"userId": ,
"sessionID": ,
"steps":
{
{
"Timestamp": "",
"Index":,
"EventType": "Orion",
"EventName": "EventManager",
"DurationMs":,
"Succeeded":true,
"Message": ""
}
}
}
HTTP后门会将json数据发送到C2服务器,如果通信成功,服务器就会返回经过编码处理的命令;接到命令后,该后门将使用表达式0-9a-f360-9a-f320-9a-f16解析该命令。
下面是在代码中硬编码的已解码命令列表。
从命令列表可以看出,这款恶意软件能够收集系统信息,使用注册表,删除磁盘上的另一个文件,并运行它。
我们考察了几个受支持命令。其中,CollectSystemDescription命令用于收集域名、用户名、OS版本和网络配置细节等信息。
作为获取网络配置详细信息的一部分,恶意软件使用select * From Win32_NetworkAdapterConfiguration where IPEnabled=true执行WMI查询,并解析以下字段:
Description
MACAddress
DHCPEnabled
DHCPServer
DNSHostName
DNSDomainSuffixSearchOrder
DNSServerSearchOrder
IPAddress
IPSubnet
DefaultIPGateway
为了获取操作系统详细信息,它会执行如下WMI Query,即Select * From Win32_OperatingSystem。
从代码中我们可以看到,它可以删除第二阶段的恶意软件,并执行它。
最后,我们可以得出如下结论:攻击者在这次入侵中使用的技术非常复杂,其中包括供应链攻击、数据编码以及动态解析,等等。同时,攻击者的重心并不是对受感染的系统进行重创,而是专注于不被安全产品发现踪迹。在今后的日子里,类似攻击将更为常见。
本文作者:mssp299
本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/151497.html