• 我们在哪一颗星上见过 ,以至如此相互思念 ;我们在哪一颗星上相互思念过,以至如此相互深爱
  • 我们在哪一颗星上分别 ,以至如此相互辉映 ;我们在哪一颗星上入睡 ,以至如此唤醒黎明
  • 认识世界 克服困难 洞悉所有 贴近生活 寻找珍爱 感受彼此

追捕Snake恶意软件(翻译)

威胁情报 云涯 2年前 (2023-07-04) 1319次浏览

参考链接:https://www.cisa.gov/news-events/cybersecurity-advisories/aa23-129a

摘要

Snake是俄罗斯联邦安全局(FSB)16号中心设计和使用的最复杂的网络间谍工具,用于长期收集敏感目标的情报。FSB通过创建一个秘密的点对点(P2P)网络,在全球范围内部署了许多被Snake感染的计算机作为中继节点,将伪装的操作流量路由到FSB所针对的目标上。Snake采用自定义的通信协议,利用加密和分段等技术来保护通信的保密性,以阻碍检测和收集行动。

Snake的基础设施遍布全球50多个国家,包括北美、南美、欧洲、非洲、亚洲和澳大利亚,其中包括美国和俄罗斯本土。尽管Snake利用各行各业的基础设施,但其定向攻击具有目标明确、战术性强的特点。FSB利用Snake从政府网络、研究机构、新闻媒体等高优先级目标中收集敏感情报。例如,FSB使用Snake从北约国家的一个受害者那里获取并外泄敏感的国际关系文件和外交通信。在美国境内,FSB攻击了教育、小型企业、媒体组织以及关键基础设施领域,包括政府设施、金融服务、重要制造业和通信等行业。

本次网络安全咨询(CSA)提供了关于Snake与FSB的归属以及植入物的详细技术描述。此外,CSA还涵盖了最近未被广泛披露的Snake变种。本文中的技术信息和缓解建议旨在帮助网络防御人员检测Snake及相关活动。如需了解有关FSB和俄罗斯国家支持的网络活动的更多信息,请参阅有关俄罗斯网络威胁的联合咨询以及CISA的俄罗斯网络威胁概述和咨询页面。

导言

Snake是俄罗斯联邦安全局(FSB)手中最复杂的网络间谍工具。Snake之所以如此复杂,主要体现在三个方面。首先,Snake采用了一系列手段,达到了极高的潜伏性,包括其主机组件和网络通信。其次,Snake的内部技术架构允许轻松添加新组件或替换现有组件。这种设计还促进了在不同主机操作系统上运行的Snake实例的开发和互操作性。我们观察到Snake在Windows、MacOS和Linux操作系统上的互操作性。最后,Snake表现出精心设计和实施的软件工程,尽管其复杂性很高,但该植入物中的错误相对较少。

在关于Snake的战术、技术和程序(TTP)的公开来源报道后,FSB采取了新的技术来逃避检测。对植入物的修改增强了识别和收集Snake及相关证据的难度,直接干扰了主机和基于网络的防御工具的检测能力。

这种类型的网络间谍植入物的效力完全依赖于其长期的潜伏性,因为长期间谍行动的目标是在目标上保持数月甚至数年的持续访问,以提供对重要情报的持续访问。Snake独特的复杂特性代表了FSB多年来为实现这种秘密访问所付出的巨大努力。

背景

FSB在2003年末开始开发Snake,最初名为“Uroburos”。初版的植入物开发似乎在2004年初完成,并在此后不久进行了首次网络行动。Uroburos这个名字非常贴切,因为FSB在公开披露之后并没有放弃它,而是不断进行升级和重新开发。该名称在早期版本的代码中出现,并且FSB的开发人员还留下了其他独特的字符串,包括“Ur0bUr()sGoTyOu#”,这些字符串公开露面后一直困扰着他们。

在早期版本的Uroburos中,独特的特性包括一幅德国哲学家和神学家雅各布·伯姆的历史插图部分的低分辨率图像。其中一种三级后门方法使用了该图像作为密钥。同样的图像也嵌入在其他与Snake相关的组件中。右侧是该图像的放大版本。

此外,Snake植入物的早期FSB开发人员在整个植入物中留下了一些独特的代码,揭示了他们的内部笑话、个人兴趣和对安全研究人员的嘲讽。例如,上述提到的“Ur0bUr()sGoTyOu#”字符串在2014年被替换为“gLASs D1cK”,这是对一些公开的网络安全报道的回应。

归因

我们将Snake的操作归属于FSB第16中心的一个已知单位。该单位更广泛地运营Turla工具集的众多元素,并在俄罗斯各地设有分部,反映了历史上苏联克格勃信号情报行动的分布。Snake几乎与第16中心成为FSB的一部分的时间一样长,一直是该单位操作的核心组件。

Snake在Turla工具集中广泛影响力的体现,表明它对该单位现代网络行动的几乎每个方面产生了影响。

Snake的日常操作是从俄罗斯Ryazan的FSB设施进行的,在Ryazan的FSB工作时间内(大约上午7:00至下午8:00,莫斯科标准时间,GMT+3),Snake的活动增加。主要开发人员是Ryazan的FSB官员,他们的化名包含在一些Snake版本的代码中。除了开发Snake外,Ryazan的FSB官员还使用它进行全球操作;这些操作与从莫斯科或其他FSB站点发起的操作在基础设施和技术上有所不同。

虽然Snake的开发和重新工具化通常由Ryazan的FSB官员完成,但Snake的操作也是从莫斯科的FSB第16中心占用的建筑物中发起的。我们的调查发现,FSB运营商不仅充分发挥了Snake的潜力,还有一些FSB运营商似乎对Snake的更高级功能不太熟悉。这些观察结果说明,将这样一个先进的工具集应用于FSB第16中心内的各个地理分散团队中是困难的。

我们已经集体调查了Snake和与之相关的工具近20年,以及该单位自20世纪90年代以来的其他行动。在此期间,FSB在许多不同的操作中使用了Snake,并通过多次公开披露和其他减轻措施进行了大量的调整和修订,以使其保持有效性。Snake的代码和多个与Snake相关的工具已经成为Turla家族中其他高产的植入物和操作工具的起点或关键影响因素。最值得注意的是,其中包括基于Snake代码的Carbon(又名Cobra)和类似的与Snake相关的植入物Chinch(目前在公开来源中称为ComRAT)。

受害情况

我们在包括北美、南美、欧洲、非洲、亚洲和澳大利亚在内的50多个国家发现了Snake的基础设施,包括美国和俄罗斯本身。尽管Snake利用各个行业的基础设施,但其定位是有目的和战术性的。例如,如果一个被感染的系统不响应Snake的通信,FSB运营商将在几天内有目的地重新感染它。在全球范围内,FSB使用Snake从高优先级目标(如政府网络、研究设施和新闻机构)收集敏感情报。例如,FSB运营商使用Snake从北约国家的一名受害者那里获取和外传敏感的国际关系文件和其他外交通信。在美国境内,FSB侵害了教育、中小企业和媒体组织等行业,以及政府设施、金融服务、关键制造业和通信等关键基础设施部门。

其他与Snake一起使用的工具和TTPs

FSB通常将Snake部署在网络的外部面向基础设施节点上,并从那里在内部网络上使用其他工具和TTPs进行额外的渗透操作。一旦成功进入目标网络并确立入口,FSB通常会对网络进行枚举,并努力获取管理员凭据和访问域控制器的权限。为了在网络中进行横向扩展,使用了各种机制来获取用户和管理员凭据,包括键盘记录器、网络嗅探器和开源工具。

通常情况下,FSB运营商在绘制网络地图并获取网络中各个域的管理员凭据后,就开始进行常规的收集操作。在大多数Snake的实例中,并不会部署进一步的重型植入物,而是依靠凭据和轻量级的远程访问工具在网络内部进行操作。FSB运营商有时会部署一个小型的远程反向Shell,与Snake一起进行交互操作。这个可触发的反向Shell已经使用了大约20年,可以用作备用访问向量,或者在横向移动时保持最小的存在,并避免被检测到。

Snake架构

Snake的架构设计反映了专业软件工程实践。植入物内的关键路径由实现良好设计接口的松耦合组件堆叠而成。除了便于软件开发和调试外,这种结构还允许Snake在不同的环境中选择多个不同的组件来实现相同的功能,并根据环境因素进行选择。例如,Snake的自定义网络通信协议功能类似于堆栈。所有实现都使用加密层和传输层,如Snake的自定义HTTP或原始TCP套接字协议。Snake网络协议堆栈的每个层仅实现与相邻两层的操作兼容的指定接口。加密层和底层传输层因此可以独立运行,因此任何自定义的Snake网络协议都可以在不改变加密层代码的情况下使用加密覆盖。这种模块化设计使Snake运营商能够根据给定环境选择最合适的网络传输方式,而不会影响Snake的其他功能。当使用被感染的HTTP服务器作为Snake P2P网络的一部分时,运营商可以确保所有流向该机器的流量遵循Snake的自定义HTTP协议,从而有效地与合法流量混合。在合法允许安全外壳(SSH)连接的被感染机器的情况下,Snake可以使用自定义的原始TCP套接字协议而不是自定义的HTTP协议。Snake协议堆栈的所有其他层,从紧邻的传输加密层到远程命令处理层,只要正确实现其接口,完全不受传输层的影响。这种架构还允许Snake开发人员轻松替换新的通信协议,当他们认为某个协议已被破解时,无需对代码进行任何下游改动。最后,这种设计便于在不同的主机操作系统上开发完全可互操作的Snake植入物。

Snake的技术复杂性从软件架构延伸到较低级别的软件实现。早期版本的Snake开发于2003年,比许多现代编程语言和框架提供的支持模块化开发的工具出现得更早。Snake完全由C语言编写,这在低级别控制和效率方面具有重要优势,但在语言层面上不提供对象或接口的直接支持,并且在内存管理方面也没有提供任何帮助。Snake的开发人员成功地用C语言实现了植入物复杂的设计,并几乎没有出现太多的错误,包括小心避免与空字符结尾的字符串和有符号和无符号整数混合相关的常见陷阱。此外,开发人员在植入物的实现过程中表现出对计算机科学原理的理解。这包括选择和正确编码渐近最优算法,设计和使用与常见编码方案非常相似的高效自定义编码方法,并以安全方式处理与系统级编程相关的众多可能的错误。

充分利用错误

尽管Snake植入物作为一种高度复杂的间谍工具,但它并不免于人为错误的影响。像Snake这样的工具需要更多的熟悉和专业知识才能正确使用,在一些情况下,Snake操作人员忽视了按设计要求使用它。在其开发和运营过程中的各种错误为我们提供了对Snake内部运作的突破口,并且是开发能力的关键因素,使我们能够追踪Snake并操纵其数据。

FSB在处理Diffie-Hellman密钥交换时使用了OpenSSL库。Snake在密钥交换过程中生成的Diffie-Hellman密钥集长度太短,无法确保安全性。FSB在DH_generate_parameters函数中提供的素数长度仅为128位,对于非对称密钥系统来说是不足够的。此外,在某些看似仓促部署Snake的情况下,操作人员忽视了剥离Snake二进制文件的步骤。这导致了许多函数名称、明文字符串和开发人员的注释被发现,如下图所示。

SNAKE基于主机的技术细节

在私营行业披露了Snake的能力后,FSB迅速对其进行了适应。因此,Snake存在多个变体,因为它已经发展了近20年。本次网络安全咨询将重点介绍Snake的一个较新的变体,直到现在尚未广泛披露。适用的情况下,将简要讨论早期的Snake变体,但不会深入讨论,因为早期Snake变体的许多细节已经存在于公共领域。

安装程序

Snake安装程序在Snake的存在期间使用了各种名称(例如,“jpinst.exe”)。本咨询将描述常常使用名称“jpsetup.exe”的安装程序版本。该可执行文件使用定制的混淆方法进行打包。开发人员似乎从一个用于查看JPEG文件的开源项目中添加了解压功能。这种技术可以将解压缩代码混淆在其他合法代码库中。

解压缩代码会从可执行文件中提取一个可执行文件,下文将称之为“Png Exe”,并从Png Exe的资源中提取一个经过AES加密的数据块,下文将称之为“Png Resource”。

jpsetup.exe安装程序需要通过命令行传递两个参数以执行。第一个参数是经过SHA-256哈希两次的宽字符字符串,这些计算的结果成为解密Png Resource的AES密钥。AES初始化向量(IV)由jpsetup.exe的第二个参数的前16个字节组成,在在该参数前加上一个宽字符“1”字符串。解密后,Png Resource变成了一个可执行文件,下文将称之为“Stage 2”。

解压后,从Stage 2的资源中提取了许多组件。其中一些资源是带有自己附加资源的可执行文件。Stage 2从其资源创建结构,最终成为Snake的主机构件。

磁盘上的组件

由于Windows是Snake主要针对的操作系统,因此本文档仅讨论基于Windows的构件;然而,Snake可以进行交叉编译,并能够在其他操作系统上运行。

磁盘上的混淆

Snake的主机架构和网络通信允许其具有非同寻常的隐蔽性。Snake在这两个环境中巧妙地使用其内核模块。所有已知的Windows版本的Snake都使用了隐藏的存储机制来隐藏主机组件。除了使用内核模块从操作系统返回的任何列表中删除相关组件外,Snake还利用内核模块在Snake的用户模式组件和隐藏的存储机制之间进行任何请求的调解,而隐藏的存储机制本身又使用唯一的每个植入物密钥进行加密。这种独特的密钥创建了检测难度,即使是独立于受损操作系统的工具,也无法简单地针对Snake主机组件进行签名。

持久性机制

本次咨询主要讨论的Snake版本在系统上注册了一个服务以保持持久性。通常,这个服务的名称是“WerFaultSvc”,我们评估认为它是用来与合法的Windows服务WerSvc混合在一起。在启动时,该服务将执行Snake的WerFault.exe,Snake开发人员选择将其隐藏在%windows%\WinSxS\目录中的众多有效的Windows“WerFault.exe”文件中。执行WerFault.exe将开始解密Snake的组件并将它们加载到内存中。

加密的注册表键数据

在执行过程中,Snake的WerFault.exe将尝试解密Windows注册表中的加密blob,通常位于HKLM:\SOFTWARE\Classes.wav\OpenWithProgIds位置。加密数据包括用于查找和解密包含Snake内核驱动程序和内核驱动程序加载器的文件的AES密钥、IV和路径。注册表对象的结构可以在下图的右侧看到。Snake使用Microsoft Windows Cryptography API: Next Generation (CNG)密钥存储来存储解密注册表对象所需的AES密钥。

队列文件

最后要讨论的主机基础组件是队列文件。通常,此文件位于%windows%\Registration目录中,格式为<RANDOM_GUID>.<RANDOM_GUID>.crmlog,并由Snake的内核驱动程序解密。由于队列文件的复杂性和重要性,其详细信息将在下一小节中详细讨论。

队列

队列是一个Snake结构,包含各种信息,包括密钥材料、通信通道、操作模式、主要的用户模式组件等,这些是Snake成功运行所需的。需要注意的是,这是开发人员使用的名称,并不等同于计算机科学中通常的”队列”。队列数据以队列文件的形式保存在磁盘上,它是一个包含子结构的平面文件,子结构包括0x2c字节的文件头,后面是数据块。每个数据块对应于一个队列项,例如简单的配置参数、Snake命令或整个嵌入式可执行文件。每个队列项与特定的队列容器相关联。

队列容器和队列项

每个容器通过其类型和实例值进行标识。每个容器类型保存了Snake植入物用于特定目的的相同类型的信息。以下表格显示了不同的容器类型及其功能。队列可以具有多个相同类型的容器,但每个容器的实例值都不同

队列中每个容器中的数据被分为队列项,每个队列项具有0x40字节的元数据结构,如下表所示。队列项的数据内容紧随此结构之后。每个容器中的队列项通过它们对应的项目编号和项目类型标识符进行区分。项目编号由Snake植入物自己分配,而Snake运营商通常在尝试引用特定项目时参考项目类型值。

在先前的Snake版本中,队列文件存在于一个加密的隐秘存储中。队列项本身的数据也被CAST-128加密。在较新的版本中,隐秘存储被移除,队列文件单独存在于磁盘上。队列文件中的队列项仍然使用CAST-128进行加密,此外,整个队列文件也被CAST-128加密。用于加密容器实例中的队列项的CAST密钥可以在相应的0x2容器中找到,其项目类型为0x229(见下文)。用于加密队列文件的密钥和初始向量(IV)可以通过解码Snake的内核驱动程序中的字符串来找到。

容器描述

0xb容器

0xb容器列出了给定Snake植入物可用的操作模式。在使用某种模式时,Snake使用特定的一组容器和通信通道。每个感染可以使用最多四种不同的模式。在0xb容器中的每个模式都有一个容器实例值,与此模式相关的所有容器(除了0x3容器)将使用相同的实例值。

0x0容器处理Snake感染主机的传入命令和数据。命令将在此容器中排队,直到植入物准备好执行它们。

0x1容器

0x1容器处理Snake感染主机的传出命令和数据。数据将在0x1容器中排队,直到植入物准备好将其外泄。

0x2容器

0x2容器存储了与其对应的模式的配置信息。这些容器中存储了对Snake成功操作至关重要的各种信息。本小节将讨论在0x2容器中可以找到的一部分参数。

在0x2容器中可以找到关键的密钥信息。包括用于加密队列容器中各个项目的CAST密钥(项目0x229),传入和传出的RSA密钥(分别为项目0x228和0x227),用于Snake网络通信协议顶层加密的预共享密钥以及用于Snake网络连接的准唯一值“ustart”。

Snake不断在其内核和用户模式组件之间传递数据。用于进行这些通信的方法(通常为命名管道)列在0x2容器的项目0x65-0x6f中。项目0x70-0x7a列出了建立这些通信所需的参数。

项目0xc9-0xd3包含了多达十个其他Snake感染(称为“通信通道”)的详细信息,植入物在被动操作期间可以与这些感染进行通信。与其他主机建立Snake会话所需的参数可以在项目0xd4-0xde中找到。

在0x2容器中还可以找到许多其他数据点,例如Snake注入的进程名称或从0x3容器加载的模块。

0x3容器

0x3容器包含了Snake的嵌入文件和模块。所有Queue中的容器都可以访问一个单独的0x3容器。0x3容器有一个专用的0x2容器,其中只包括一个项目类型为0x229(CAST-128密钥)的队列项目。这个密钥将用于加密和解密0x3容器中的所有嵌入文件和模块。

嵌入在0x3容器中的文件和模块分配的项目类型在Snake的P2P网络中的所有Snake感染中保持一致。例如,项目类型为0x01的是Zlib库,因此在Snake感染的0x3容器中看到项目类型为0x01的文件始终是Zlib库。植入物的0x2容器将跟踪它加载的库。如果DLL是磁盘上的文件,DLL的完整路径将保存在0x2容器中。如果库是从0x3容器中加载的,则加载的模块将以“&<加载模块的3容器中的项目类型>”的格式显示在植入物的0x2容器中。

0x4容器

0x4容器记录命令活动。容器中的每个队列项目都是一个已执行或尝试执行的单个命令的日志。每个模式都有对应的0x4容器。

0x5容器

0x5容器保存Snake网络日志,记录连接到该植入物的任何IP地址。某些版本的Snake不再使用此容器。

0x6容器

0x6容器保存在特定时间执行的命令。为每个计划命令创建一个队列项目。

0x7容器

0x7容器记录在被动操作期间连接到该植入物的任何其他Snake植入物的IP地址。命令0x79(读取代理跟踪)和0x7a(清除代理跟踪)用于与此容器进行交互。请注意,某些版本的Snake已弃用命令0x7a,并在调用时返回“不支持的函数”错误。

Snake的网络通信

Snake的网络通信是经过加密、分段并使用自定义方法发送的,它可以利用常见的网络协议,包括原始的TCP和UDP套接字以及更高层次的协议,如HTTP、SMTP和DNS。Snake最常见的协议是HTTP和TCP,但也支持UDP、ICMP和原始IP流量的功能。Snake的网络通信由”会话”组成,这与其所在的合法协议关联的会话是不同的(例如,TCP会话)。然后,Snake会话由不同的命令组成。Snake的自定义传输加密层(”enc”)和Snake的应用层都有自己的加密机制,其中传输加密层操作于单个P2P会话,而Snake应用层提供了从控制器(即起始点)到命令最终目标的端到端加密。下图详细说明了Snake的通信协议栈。

Snake利用其内核模块还能实现隐蔽的网络通信。为了完全参与Snake的P2P网络,被植入的机器(即非最终目标)必须作为其他Snake节点的服务器。Snake的内核模块以及精心设计的用于区分Snake流量和合法客户端流量的机制,使得植入的机器能够在Snake P2P网络中作为服务器运行,而无需打开任何新端口,从而极大地增加了检测的难度。此外,Snake的自定义网络通信协议被设计成与被入侵服务器通常接收的流量相混合。这使得Snake操作人员能够使用合法服务器作为基础设施,这样就减少了简单的IP地址或域名阻断的效果,而无需打开新端口或向该基础设施发送异常的流量。

Snake的网络身份验证技术

Snake的网络身份验证技术“ustart”是为了区分流向被入侵服务器上的应用软件的合法流量和Snake流量而使用的。这种技术使得Snake能够在不开放服务器上其他端口的情况下有效地作为服务器软件运行。相关的每个植入体的身份验证值存储在植入体的队列文件中,称为“ustart”。20

Snake的内核模块不是在指定的TCP端口上打开侦听套接字,而是拦截每个TCP会话中三次握手后的第一个客户端到服务器的数据包。然后,内核模块确定该数据包的内容是否与目标Snake植入体的ustart值匹配。如果匹配成功,Snake内核模块将转发该数据包以及该TCP会话中的所有后续数据包到Snake自己的处理功能中,而(可能合法的)在该端口上侦听的应用程序将不会察觉到该TCP会话。如果匹配失败,Snake内核模块允许该数据包以及整个TCP会话继续传递到合法的侦听应用程序,例如Web服务器软件。请参考以下示意图进行说明。

所有ustart版本都通过发送一个随机的nonce以及由该nonce和ustart值本身组合进行数学运算的数据来进行身份验证。接收方机器提取该nonce并执行相同的计算以验证发送方机器。ustart2和ustartl版本使用Fowler-Noll-Vo(FNV)哈希算法从nonce和ustart生成整体的身份验证值。在自定义的Snake HTTP协议和自定义的Snake TCP协议中,这种机制略有不同。

使用ustart方法,Snake P2P网络中的节点可以作为服务器运行,而无需打开任何本来关闭的端口,也无需干扰被入侵服务器的合法功能。Snake只会在另一个应用程序正在监听的TCP端口上进行通信。这种技术使得通过网络流量监控来检测Snake入侵变得更加困难。使用标准防火墙或网络入侵检测功能可以检测或阻止对意外TCP端口的入站流量。替换合法服务应用程序为修改后的可执行文件可能会在主机或网络级别引发检测。Snake的技术绕过了这两种缓解措施。当结合Snake流量与预期流量相似的事实,特别是在Snake的基于HTTP的协议的情况下,除非详细了解Snake的自定义协议,否则很难检测到Snake的通信。

 

 

 

 


云涯历险记 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:追捕Snake恶意软件(翻译)
喜欢 (0)