IDA Pro > IDA Pro教程 > 技术问题 > 深入了解SolarWinds Serv-U SSH漏洞

深入了解SolarWinds Serv-U SSH漏洞

发布时间:2022-10-10 15: 57: 34

 几周前,微软检测到一个0-day远程代码执行漏洞被用来在有限且有针对性的攻击中攻击SolarWinds Serv-U FTP软件。微软威胁情报中心(MSTIC)根据观察到的受害者特征、策略和程序,高度自信地将这次攻击归咎于DEV-0322,这是一个在中国境外开展活动的组织。在此博客中,我们与SolarWinds分享了有关该漏洞的技术信息(编号为CVE-2021-35211),SolarWinds及时发布了安全更新以修复漏洞并缓解攻击。

 

 该分析由Microsoft进攻性研究与安全工程团队进行,该团队负责支持MSTIC等具有漏洞利用开发专业知识的团队。我们团队的职责是让计算更安全。为此,我们利用我们对攻击者技术和流程的知识,通过逆向工程、攻击创建和复制、漏洞研究和情报共享来构建和改进Windows和Azure中的保护。

 

 7月初,MSTIC向我们的团队提供了似乎表明针对SolarWinds Serv-U FTP服务器的SSH组件中新发现的漏洞的利用行为的数据。尽管intel包含有用的指标,但它缺少相关的漏洞利用,因此我们的团队着手重建漏洞利用,这需要首先找到并了解Serv-U SSH相关代码中的新漏洞。

 

 由于我们知道这是一个远程的预授权漏洞,我们很快构建了一个专注于SSH握手的预授权部分的模糊器,并注意到该服务捕获并通过了所有访问违规而不终止进程。很明显,Serv-U进程将使隐蔽、可靠的利用尝试变得容易完成。我们得出的结论是,被利用的漏洞是由Serv-U最初创建OpenSSL AES128-CTR上下文的方式引起的。反过来,这可能允许在解密连续的SSH消息期间使用未初始化的数据作为函数指针。因此,攻击者可以通过连接到开放的SSH端口并发送格式错误的预授权连接请求来利用此漏洞。

 

 我们通过Microsoft安全漏洞研究(MSVR)通过协调漏洞披露(CVD)与SolarWinds分享了这些发现以及我们创建的模糊器,并与他们一起解决了这个问题。这是情报共享和行业协作的示例,通过检测产品攻击和通过安全更新修复漏洞,从而为更广泛的社区提供全面保护。

 

 Serv-U实现SSH的漏洞

 Secure Shell(SSH)是一种广泛采用的协议,用于在不受信任的网络上进行安全通信。协议行为在多个评论请求(RFC)中定义,现有实现可在开源代码中获得;我们主要使用RFC 4253、RFC 4252和libssh作为此分析的参考。

 

 通过枚举对“SSH-”字符串的引用,可以找到Serv-U中SSH的实现,该字符串必须存在于发送到服务器的第一个数据中。此类代码最可能的实例如下:

图1.“SSH-”字符串的有希望的实例

 在上面的代码上设置断点并尝试使用SSH客户端连接到Serv-U证实了我们的假设,并导致断点被以下调用堆栈命中:

图2.由图1中代码设置的断点产生的调用堆栈

 此时,我们注意到Serv-U.dll和RhinoNET.dll都禁用了ASLR支持,这使得它们成为ROP小工具的主要位置,因为它们中的任何地址对于给定Serv在互联网上运行的任何服务器实例都是不变的-U版本。

 

 在逆向RhinoNET和Serv-U DLL中的相关代码后,我们可以在Serv-U处理它们时跟踪SSH消息的路径。为了处理传入的SSH连接,Serv-U.dll创建一个CSUSHSocket对象,该对象派生自RhinoNET!CRhinoSocket类。CSUSSHSocket对象的生命周期是TCP连接的长度——它可能在许多单独的TCP数据包中持续存在。底层CRhinoSocket为套接字提供缓冲接口,以便单个TCP数据包可以包含任意数量的字节。这意味着单个数据包可能包含任意数量的SSH消息(只要它们符合最大缓冲区大小),以及部分SSH消息。然后CSUSSHSocket::ProcessRecvBuffer函数负责从缓冲的套接字数据中解析SSH消息。

 

 CSUSSHSocket::ProcessRecvBuffer首先使用ParseBanner检查SSH版本。如果ParseBanner成功地从横幅中解析SSH版本,则ProcessRecvBuffer会循环ParseMessage,它会在套接字数据中获取指向当前消息的指针,并从消息中提取msg_id和长度字段(稍后将详细介绍ParseMessage函数)。

图3.从CSUSSSHSocket::ProcessRecvBuffer处理循环中选择代码

 被迭代的套接字数据在概念上是伪C结构ssh_msg_t的数组,如下所示。消息数据包含在有效负载缓冲区中,其第一个字节被认为是msg_id:

 ProcessRecvBuffer然后根据msg_id分派对消息的处理。一些消息直接从消息解析循环处理,而另一些则传递给ssh_pkt_others,后者将消息发布到队列中,以供另一个线程提取和处理。

图4.CSUSSSHSocket::ProcessRecvBuffer中的Pre-auth可达处理程序

 如果msg_id被推迟到备用线程,CSSHSession::OnSSHMessage会处理它。此功能主要处理需要与Serv-U管理的用户配置文件数据交互的消息(例如,针对每个用户凭据的身份验证)和UI更新。CSSHSession::OnSSHMessage在漏洞搜寻方面被证明是无趣的,因为其中的大多数消息处理程序都需要成功的用户身份验证(初始遥测表明这是一个预身份验证漏洞),并且在其余处理程序中没有发现漏洞。

 

 当最初对带有调试器的Serv-U运行模糊器时,很明显应用程序正在捕获通常会使进程崩溃的异常(例如访问冲突),记录错误,修改状态足以避免进程终止,然后继续,好像没有问题一样。这种行为提高了文件服务器应用程序的正常运行时间,但也导致可能的内存损坏在进程中徘徊并随着时间的推移而累积。作为攻击者,这提供了诸如暴力破解代码地址或具有动态地址的数据的机会。

 

 这种对访问违规的挤压有助于利用,但对于模糊测试,我们过滤掉了由读/写访问违规产生的“无趣”异常,并让模糊器运行直到遇到RIP已损坏的错误。这很快导致了以下崩溃上下文:

图5.WinDbg显示来自fuzzer生成的SSH消息的崩溃上下文

 如上所示,libeay32.dll(OpenSSL的一部分)中的CRYPTO_ctr128_encrypt试图调用无效地址。使用的OpenSSL版本是1.0.2u,所以我们获得了源代码来阅读。下面展示了相关的OpenSSL功能:

 同时,下面显示了传递的结构:

 崩溃函数是通过以下路径从OpenSSL API边界到达的:EVP_EncryptUpdate->evp_EncryptDecryptUpdate->aes_ctr_cipher->CRYPTO_ctr128_encrypt。

 

 进一步查看调用堆栈,很明显Serv-U从CSUSSSHSocket::ParseMessage调用EVP_EncryptUpdate,如下所示:

图6.调用OpenSSL的位置,其中可能会调用攻击者控制的函数指针

 此时,我们手动最小化了fuzzer产生的TCP数据包缓冲区,直到只剩下触发崩溃所需的SSH消息。在RFC中使用的符号中,所需的SSH消息是:

 请注意,以下描述引用了当崩溃代码路径明显试图解密缓冲区时调用的“加密”函数。这不是错误:Serv-U使用加密OpenSSL API,虽然对于代码清晰度来说不是最佳的,但它在行为上是正确的,因为高级加密标准(AES)在计数器(CTR)模式下运行。

 

 在通过消息处理序列进行时间旅行调试跟踪和调试后,我们发现问题的根本原因是Serv-U最初使用如下代码创建了OpenSSL AES128-CTR上下文:

使用NULL密钥和/或IV调用EVP_EncryptInit_ex是有效的,并且Serv-U在这种情况下这样做是因为上下文是在处理KEXINIT消息时创建的,这是在密钥材料准备好之前。但是,在设置密钥之前不会执行AES密钥扩展,并且在执行密钥扩展之前,ctx->cipher_data结构中的数据保持未初始化状态。我们可以(正确地)推测我们的消息序列导致崩溃导致enc_algo_client_to_server->decrypt在初始化密钥材料之前调用。Serv-U KEXINIT处理程序为消息中给出的所有参数创建对象。

但是,在处理以下NEWKEYS消息之前,当前为连接活动的相应对象不会被新创建的对象替换。客户端总是在正常的SSH连接中完成密钥交换过程,然后再发出NEWKEYS消息。无论连接状态或密钥交换如何,Serv-U都会处理NEWKEYS(从而设置m_bCipherActive标志并替换密码对象)。由此,我们可以看出,我们的模糊序列中的最后一个消息类型无关紧要——在部分初始化的AES CTR密码对象被激活后,只需要在套接字缓冲区中处理一些数据即可触发解密。

 

开发

由于该漏洞允许从未初始化的内存中加载RIP,并且在过程中有一些没有ASLR的模块,因此利用并不那么复杂:我们可以找到一种方法来控制未初始化的cipher_data结构的内容,指向cipher_data->block函数指针在一些初始的ROP小工具上,并启动一个ROP链。由于异常处理程序会导致任何错误被忽略,我们不一定需要在第一个数据包上获得可靠的代码执行。可以重试利用,直到代码执行成功,但是这会在日志文件中留下痕迹,因此可能值得投入更多精力来避免记录日志的不同技术。第一步是找到密码数据分配,因为预填充缓冲区的最直接途径是喷射目标分配大小的分配并在尝试将地址回收为cipher_data之前释放它们。ctx->cipher_data在EVP_CipherInit_ex中使用以下行进行分配和分配:

使用调试器,我们可以看到我们案例中的ctx_size是0x108,并且这个分配器最终会调用ucrtbase!_malloc_base。从前面的逆向我们知道,CRhinoSocket和CSUSSSHSocket级别的数据包解析都调用operator new[]来分配空间来保存我们发送的数据包。幸运的是,这也以ucrtbase!_malloc_base结束,使用相同的堆。因此,预填充目标分配就像发送一个适当大小的TCP数据包或SSH消息然后关闭连接以确保它被释放一样简单。使用此路径进行喷洒不会触发其他相同大小的分配,因此我们不必担心会污染堆。

 

从调试器/反汇编中提取的另一个重要值是offsetof(EVP_AES_KEY,block),因为需要将喷射数据中的偏移量设置为初始ROP小工具。该值为0xf8。方便的是,EVP_AES_KEY结构的其余大部分可用于ROP链内容本身,并且在受控函数指针调用时,寄存器rbx、r8和r10中存在指向该结构基址的指针。

 

作为一个简单的概念证明,请考虑以下python代码:

以上结果在调试器中产生以下上下文:

图 7. 显示攻击者控制的 rcx、rdx 和 rip 的机器上下文

结论:负责任的披露和行业合作提高了所有人的安全性

我们的研究表明,Serv-U SSH服务器存在预授权远程代码执行漏洞,可以在默认配置中轻松可靠地利用该漏洞。攻击者可以通过连接到开放的SSH端口并发送格式错误的预授权连接请求来利用此漏洞。成功利用后,该漏洞可能允许攻击者安装或运行程序,例如我们之前报道的针对性攻击。

 

我们通过协调漏洞披露(CVD)将我们的发现分享给了SolarWinds。我们还分享了我们创建的模糊器。SolarWinds发布了一个咨询和安全补丁,我们强烈鼓励客户应用该补丁。如果您不确定您的系统是否受到影响,请在SolarWinds客户门户中打开支持案例。

 

除了与SolarWinds共享漏洞详细信息和模糊测试工具外,我们还建议为Serv-U进程中加载​​的所有二进制文件启用ASLR兼容性。启用ASLR是一个简单的编译时标志,默认情况下启用,并且从Windows Vista开始可用。ASLR是针对暴露于不受信任的远程输入的服务的关键安全缓解措施,它要求进程中的所有二进制文件都是兼容的,以便有效地防止攻击者在其漏洞利用中使用硬编码地址,这在Serv-U中是可能的。

 

我们要感谢SolarWinds的及时响应。该案例进一步强调了软件供应商、安全研究人员和其他参与者之间需要不断协作,以确保用户计算体验的安全性。

 

原文地址:https://www.microsoft.com/security/blog/2021/09/02/a-deep-dive-into-the-solarwinds-serv-u-ssh-vulnerability/

展开阅读全文

标签:IDA

读者也访问过这里:
邀请您进入交流群 点击扫码
400-8765-888 kefu@makeding.com

专业销售为您服务

欢迎添加好友,了解更多IDA优惠信息,领逆向工程学习资料礼包1份!
热门文章
exe反编译工具哪个好?反编译能力强的工具盘点
随着软件技术的发展,exe(可执行文件)已经成为了电脑、手机等多个平台上的主要软件运行格式,而对于exe文件的反编译也成为了逆向工程中不可缺少的一个步骤。本文将介绍一些常用的exe反编译工具,并评价其优缺点,帮助读者选择合适的工具。
2023-04-12
idapro怎么改为中文
IDA Pro是一款功能强大的反汇编和反编译工具,广泛应用于逆向工程和软件开发领域。在使用IDA Pro时,如果我们不习惯英文界面,可以将其改为中文界面。本文将介绍IDA Pro怎么改为中文界面。IDA Pro界面改成中文主要有两种方法,下面是详细介绍。
2023-04-19
c++反编译工具有哪些
反编译C++代码的工具一般是针对可执行文件和库文件的反汇编和逆向分析工具。本文将给大家介绍c++反编译工具有哪些的内容。市面说的c++反编译工具有很多,下面介绍几款使用认识较多的软件。
2023-04-23
ida如何转伪代码 ida伪代码怎么看
IDA Pro是一款常用的反汇编和反编译工具,可以帮助我们分析二进制文件的实现细节和执行过程,以便更好地理解程序的执行过程和逻辑。在进行逆向工程的过程中,我们经常需要将反汇编结果转换为伪代码,以便更好地进行分析和修改。本文将介绍如何使用IDA Pro转换为伪代码,并简单讲解ida伪代码怎么看。
2023-04-14
ida怎么查找字符串 ida字符串窗口快捷键
在数字化时代,逆向工程作为解密软件和分析程序的关键技术,正日益受到广泛关注。在逆向分析的过程中,IDA(Interactive DisAssembler)是一款备受推崇的工具,它为逆向工程师们提供了强大的功能和灵活的操作。本文将带您深入探讨如何在IDA中查找字符串,优化字符串窗口的使用,并探讨IDA如何将变量转换成字符串,帮助您更加熟练地驾驭这一工具,为逆向分析的世界增添一抹精彩。
2023-09-27
最新文章
怎么用IDA软件反汇编功能学习汇编指令 IDA反汇编功能如何进行多平台二进制分析
说到反汇编分析,很多人第一时间就会想到IDA。这款工具可以说是做逆向工程的“神器”,不管是学习汇编指令还是分析二进制文件,都非常给力。如果你是个初学者,刚接触反汇编,可能会对IDA的一些功能感到陌生,比如怎么用IDA软件反汇编功能学习汇编指令 IDA反汇编功能如何进行多平台二进制分析。别急,今天就带你一步步搞清楚。
2024-12-02
怎么用IDA软件反汇编功能来理解汇编指令 IDA反汇编如何分析软件的异常处理机制
你听说过IDA吗?它可不是一个普通的软件,而是逆向工程界的“老大”!很多程序员、黑客、研究员都用它来破解、分析程序。今天,咱们就来说说:怎么用IDA反汇编,搞懂这些看似难懂的汇编指令,分析程序出现问题时是怎么应对的。
2024-11-27
IDA反编译功能在软件安全审计中有何作用 怎么用IDA反编译功能分析程序的优化级别
在做软件安全审计的时候,程序的安全性和性能优化一直都是大难题。而说到分析程序的二进制代码,IDA反编译工具简直就是安全审计师的“瑞士军刀”。通过反编译,IDA能把难懂的机器码翻译成汇编语言,找出漏洞和优化空间。所以,今天我们就来聊聊“IDA反编译功能在软件安全审计中有何作用 怎么用IDA反编译功能分析程序的优化级别”,一起看看IDA到底有多强大。
2024-11-14
IDA反汇编如何进行二进制补丁分析 IDA反汇编后如何对程序进行静态分析
在软件安全和逆向工程领域,IDA Pro是一款非常受欢迎的工具。它能帮助我们深入分析二进制文件,今天,我们就来聊聊“IDA反汇编如何进行二进制补丁分析 IDA反汇编后如何对程序进行静态分析”这两个话题。希望通过这篇文章,能够让大家更好地运用IDA来进行相关分析。
2024-11-05
IDA软件反编译功能如何研究软件的动态链接库 IDA怎么反编译提取软件程序的调用关系图
在软件开发和安全领域,IDA软件真的是个非常强大的反编译工具。了解它的各种功能,尤其是在研究软件的动态链接库(DLL)时,绝对能让你的工作事半功倍。今天,我们就来聊聊“IDA软件反编译功能如何研究软件的动态链接库 IDA怎么反编译提取软件程序的调用关系图”这个话题,让你对IDA有更深入的认识。
2024-11-05
idapro怎么添加新常量 idapro的识别率怎么看
如果你是搞逆向分析的,那么IDA Pro你一定用过或者听说过。这款工具可真是个“神器”,但是用起来也有点“烧脑”,尤其是遇到一些小问题的时候,比如说“怎么添加新常量”,或者“识别率到底怎么看”。别担心,今天咱们就来好好聊聊这些问题,看看“idapro怎么添加新常量 idapro的识别率怎么看”这个话题,希望能让你在用IDA Pro的时候少踩坑,多顺利!
2024-10-30

通过微信咨询我们

欢迎添加好友,了解更多IDA优惠信息,领取逆向工程学习资料礼包1份!