OpenSSH远程代码执行漏洞分析及POC(CVE-2024-6387)

admin 2024年7月2日21:53:39评论13 views字数 5759阅读19分11秒阅读模式

免责声明

道一安全(本公众号)的技术文章仅供参考,此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失,均由使用者本人负责。本文所提供的工具仅用于学习,禁止用于其他!!!

POC整理

https://github.com/wiggels/regresshion-check

https://github.com/xaitax/CVE-2024-6387_Check

https://github.com/TAM-K592/CVE-2024-6387

https://github.com/thegenetic/CVE-2024-6387-exploit

https://packetstormsecurity.com/files/179290/OpenSSH-Server-regreSSHion-Remote-Code-Execution.html

本文仅作收集整理,真伪性自辩

前言

OpenSSH远程代码执行漏洞分析及POC(CVE-2024-6387)

Qualys威胁研究单位(TRU)发现了OpenSSH服务器(sshd)在基于glibc的Linux系统中存在远程未经身份验证的代码执行(RCE)漏洞。此漏洞的CVE编号为CVE-2024-6387。

该漏洞是OpenSSH服务器(sshd)中的信号处理程序竞态条件,允许在基于glibc的Linux系统上未经身份验证的远程代码执行(RCE),并以root权限执行,构成重大的安全风险。这个竞态条件影响了sshd的默认配置。

通过使用Censys和Shodan进行搜索,我们发现超过1400万个潜在受影响的OpenSSH服务器实例暴露在互联网上。从Qualys CSAM 3.0与外部攻击面管理数据中获得的匿名化数据显示,大约有70万个外部面向互联网的实例存在漏洞。这占我们全球客户基础中使用OpenSSH的所有面向互联网实例的31%。有趣的是,超过0.14%的存在漏洞的面向互联网实例运行着已经停止支持的OpenSSH版本。

在我们的安全分析中,我们发现这个漏洞是先前修补的CVE-2006-5051漏洞的回归,该漏洞于2006年报告。在这里,回归意味着一个曾经修复的缺陷在后续的软件发布中再次出现,通常是由于更改或更新不慎重新引入了问题。此事件突显了彻底的回归测试在防止已知漏洞重新进入环境中的关键作用。这个回归是在2020年10月引入的(OpenSSH 8.5p1)。

Qualys已开发了一个用于回归漏洞的工作利用程序。作为披露过程的一部分,我们成功向OpenSSH团队演示了这个利用程序,以帮助他们理解和应对这个问题。我们不会发布我们的利用程序,因为我们必须给予修补程序应用的时间。然而,尽管利用程序复杂,我们相信其他独立研究人员能够复制我们的结果。

关于OpenSSH:保护企业通信和基础设施安全

OpenSSH(Open Secure Shell)是一套基于安全外壳(SSH)协议的安全网络实用工具套件,对于在不安全网络上进行安全通信至关重要。它提供强大的加密功能,确保隐私和安全文件传输,是远程服务器管理和安全数据通信的重要工具。OpenSSH以其广泛的安全和认证功能而闻名,支持多种加密技术,并且是多个类Unix系统(包括macOS和Linux)的标准组件。

OpenSSH的实现在安全通信中起着关键作用。它的企业价值在于其可扩展性,能够在不同环境中实施强大的访问控制和安全自动化流程。这包括自动备份、批处理处理以及复杂的DevOps实践,涉及在多个系统和地点安全处理敏感数据。其持续的发展和广泛的采用突显了其在全球网络通信保密性和完整性维护中的重要性。

OpenSSH在软件安全领域树立了标准,体现了强大的深层防御方法。尽管最近存在漏洞,其整体记录仍然异常强大,既是一个模型,也是该领域的启发。

受影响的 OpenSSH 版本

受影响的 OpenSSH 版本如下:

- 早于 4.4p1 版本的 OpenSSH 存在信号处理程序竞态条件漏洞,除非已修补 CVE-2006-5051 和 CVE-2008-4109。

- 从 4.4p1 版本到 8.5p1 版本(不包括 8.5p1)由于对 CVE-2006-5051 的转换性补丁,使先前不安全的函数变得安全,因此不受影响。

- 从 8.5p1 版本到 9.8p1 版本(不包括 9.8p1),由于在一个函数中意外删除了关键组件,该漏洞重新出现。

- OpenBSD 系统不受此漏洞影响,因为 OpenBSD 在 2001 年开发了一个安全机制,防止了这种漏洞的发生。

"regreSSHion" 的潜在影响

如果利用了这个漏洞,可能会导致完整系统被妥协,攻击者可以以最高权限执行任意代码,从而完全接管系统,安装恶意软件,操纵数据,并创建用于持续访问的后门。这可能促使网络传播,允许攻击者利用被攻击系统作为立足点,穿越并利用组织内其他易受攻击的系统。

此外,获得 root 访问权限将使攻击者能够绕过关键的安全机制,如防火墙、入侵检测系统和日志机制,进一步掩盖他们的活动。这也可能导致重大数据泄露,使攻击者能够访问系统上存储的所有数据,包括可能被窃取或公开披露的敏感或专有信息。

由于这种漏洞具有远程竞态条件的性质,其利用具有挑战性,可能需要多次尝试才能成功攻击。这可能导致内存损坏,并需要克服地址空间布局随机化(ASLR)。深度学习的进展可能显著提高利用率,潜在地为攻击者在利用此类安全漏洞中提供重大优势。

减少风险的即时步骤

针对 OpenSSH 中的 regreSSHion 漏洞,该漏洞可能在 Linux 系统上导致远程代码执行,需采取专注和分层安全方法来应对。以下是企业应对这一重大威胁的简明步骤和战略建议:

补丁管理:及时应用 OpenSSH 的可用补丁,并优先进行持续的更新流程。

加强访问控制:通过基于网络的控制限制 SSH 访问,以减少攻击风险。

网络分割和入侵检测:划分网络以限制未经授权的访问和关键环境内的横向移动,并部署系统来监视并警报异常活动,指示可能的攻击企图。

实施临时解决方案:如果无法立即升级,你可以通过在OpenSSH配置文件中将**LoginGraceTime**参数设置为0来降低风险。这可以防止未经身份验证的会话保持开放并被利用。但是,如果所有连接插槽都被占用,这个设置可能会导致服务拒绝。

技术细节

在 OpenSSH 的服务器(sshd)中发现了一个新的漏洞,具体是一个信号处理程序竞态条件。此问题发生在客户端未能在 LoginGraceTime 期间完成身份验证时,最近版本默认设置为 120 秒,较旧版本为 600 秒。如果达到这个超时时间,sshd 的 SIGALRM 处理程序将被触发。问题在于此处理程序调用了诸如 syslog() 等从信号处理程序中调用不安全的各种函数。这种竞态条件对运行默认 sshd 配置的系统构成重大风险。

有趣的是,这个漏洞并不全是新发现的。它是之前已经识别的问题 CVE-2006-5051 的一个回归,由 Mark Dowd 在 2006 年报告。早期的漏洞也涉及 OpenSSH 4.4 版本之前的信号处理程序竞态条件,可能导致拒绝服务或潜在允许远程代码执行。

这个回归问题发生在 2020 年 10 月发布的 OpenSSH 8.5p1 版本中。在更新日志基础设施时,sigdie() 函数中关键的指令(#ifdef DO_LOG_SAFE_IN_SIGHAND)被意外地移除。这个函数是由 sshd 的 SIGALRM 处理程序直接调用的,再次变得不安全。具体来说:

- OpenSSH < 4.4p1:除非应用了 CVE-2006-5051 或 CVE-2008-4109 的补丁,否则存在竞态条件漏洞。

- 4.4p1 ≤ OpenSSH < 8.5p1:由于存在 #ifdef DO_LOG_SAFE_IN_SIGHAND,使得 sigdie() 调用 _exit(1) 变得安全,因此是安全的。

- 8.5p1 ≤ OpenSSH < 9.8p1:由于移除了 #ifdef DO_LOG_SAFE_IN_SIGHAND 指令,再次存在漏洞。

这个漏洞的影响在基于 glibc 的 Linux 系统尤为严重,因为 syslog() 本身可能会调用其他不安全的函数如 malloc() 和 free()。这创造了一个场景,攻击者可以潜在地以 root 权限执行任意代码而无需身份验证。这是因为 sshd 的特权代码以完整系统特权运行,并且缺乏沙箱保护。

利用分析

利用 OpenSSH 中的信号处理程序竞态条件漏洞需要深入理解时间攻击和内存操作。以下部分解释了攻击者利用此漏洞的步骤,同时提供了示例伪代码以说明整个过程。

首先,攻击者向目标 OpenSSH 服务器发起多个连接,重复触发 LoginGraceTime 限制而未完成身份验证。这会导致服务器触发 SIGALRM 信号。攻击的关键在于在服务器的信号处理程序执行非异步信号安全操作(如 syslog())的确切时刻中断它。攻击者需要发送经过特别设计的输入,以操纵服务器的内存布局,导致堆破坏。

通过操纵服务器的内存,攻击者可以在堆中创建不一致的状态。这是通过在内存分配或释放函数(如 malloc() 或 free())期间触发 SIGALRM 信号来实现的。利用此漏洞并不简单,通常平均需要大约 10,000 次尝试。每次尝试都会重置 LoginGraceTime 计时器,使攻击者有机会触发漏洞。

在利用过程中,攻击者根据之前尝试的反馈调整输入的时机。这有助于精细调节在关键时刻成功中断信号处理程序所需的时机。现代系统具有诸如地址空间布局随机化(ASLR)和无执行(NX)等防御机制,以防止此类攻击。攻击者利用可预测的内存模式和先进的时间技术来绕过这些保护措施。成功利用漏洞允许攻击者覆盖关键内存结构,从而执行任意代码。这将导致以 root 权限远程控制服务器。

以下示例来自该 GitHub 仓库,概述了攻击者可能采取的利用此漏洞的步骤:

int perform_exploit(const char *ip, int port) {    int success = 0;    double parsing_time = 0;    double timing_adjustment = 0;    for (int base_idx = 0; base_idx < NUM_GLIBC_BASES && !success; base_idx++) {        uint64_t glibc_base = GLIBC_BASES[base_idx];        printf("Attempting exploitation with glibc base: 0x%lxn", glibc_base);        for (int attempt = 0; attempt < 10000 && !success; attempt++) {            if (attempt % 1000 == 0) {                printf("Attempt %d of 10000n", attempt);            }            int sock = setup_connection(ip, port);            if (sock < 0) {                fprintf(stderr, "Failed to establish connection, attempt %dn", attempt);                continue;            }            if (perform_ssh_handshake(sock) < 0) {                fprintf(stderr, "SSH handshake failed, attempt %dn", attempt);                close(sock);                continue;            }            prepare_heap(sock);            time_final_packet(sock, &parsing_time);            // Implement feedback-based timing strategy            parsing_time += timing_adjustment;            if (attempt_race_condition(sock, parsing_time, glibc_base)) {                printf("Possible exploitation success on attempt %d with glibc base 0x%lx!n", attempt, glibc_base);                success = 1;                // In a real exploit, we would now attempt to interact with the shell            } else {                // Adjust timing based on feedback                timing_adjustment += 0.00001; // Small incremental adjustment            }            close(sock);            usleep(100000); // 100ms delay between attempts        }    }    return success;}

以下是来自研究人员发布的研究论文中的实际例子,展示了如何在不同的 OpenSSH 版本中利用此漏洞:

在 Debian 上的 OpenSSH 3.4p1 中,攻击涉及在公钥解析期间使用 SIGALRM 中断 free() 调用。这使堆处于不一致状态,然后在 SIGALRM 处理程序内的另一个 free() 调用中进行利用。通常需要约 10,000 次尝试,每 600 秒进行 10 个连接,大约需要一周时间。

在 Ubuntu 上的 OpenSSH 4.2p1 中,攻击者以 SIGALRM 目标 pam_start() 调用,创建 PAM 结构的不一致状态。此状态在 SIGALRM 处理程序内的 pam_end() 调用期间进行利用。需要约 10,000 次尝试,每 120 秒进行 10 个连接,大约需要 1-2 天时间。

在 Debian 上的 OpenSSH 9.2p1 中,攻击中断 malloc() 调用以 SIGALRM 期间进行公钥解析,导致堆破坏。这在 syslog() 内的另一个 malloc() 调用期间进行利用。通常需要约 10,000 次尝试,大约需要 6-8 小时时间,因为需要大约一半的时间正确猜测 glibc 地址。

研究人员主要关注具有稳定网络条件的虚拟机。尽管已取得显著进展,但预计未来会有进一步的改进,特别是在利用 ASLR 更强的新型 amd64 系统时。发现相关的漏洞报告促使立即与 OpenSSH 开发人员沟通,突显了及时采取行动解决此类漏洞的重要性。

原文始发于微信公众号(道一安全):OpenSSH远程代码执行漏洞分析及POC(CVE-2024-6387)

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年7月2日21:53:39
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   OpenSSH远程代码执行漏洞分析及POC(CVE-2024-6387)https://cn-sec.com/archives/2910600.html

发表评论

匿名网友 填写信息