关注网络与数据安全

忘记密码
“游侠安全网”创建了网络安全从业者QQ大群(群号:389710688) ,欢迎各位同仁加入!有其它问题,请联系站长“网路游侠”,QQ:55984512


OpenSSH Server远程代码执行漏洞(CVE-2024-6387)解析学习

2024-07-11 10:02 推荐: 浏览: 28字号:

摘要: 声明:该章分享的安全工具和项目均来源于网络,仅供安全研究与学习之用,如用于其他用途,由使用者承担全部法律及连带责任,与工具作者和本人无关。CVE-2024-6387 漏洞深度解析与防御策略 漏洞概述 CVE-2024-6387 是一个影响 OpenSSH ...

声明:该章分享的安全工具和项目均来源于网络,仅供安全研究与学习之用,如用于其他用途,由使用者承担全部法律及连带责任,与工具作者和本人无关。

CVE-2024-6387 漏洞深度解析与防御策略

漏洞概述

CVE-2024-6387 是一个影响 OpenSSH 服务器(sshd)的严重远程代码执行漏洞。OpenSSH 作为一套广泛使用的安全网络通信工具,提供了远程登录、命令执行、文件传输等核心功能。此漏洞的成因复杂,涉及条件竞争,因此在实际网络环境下的利用难度较大。攻击者需要绕过系统保护措施(例如地址空间布局随机化ASLR),并经过多次尝试才能成功利用。目前,已知的利用方案仅限于32位机器。

漏洞成因详解

该漏洞的根源在于 OpenSSH 服务器的信号处理程序中存在不安全操作。当服务器接收到 SIGALRM 信号时,其信号处理程序会调用一些异步信号不安全的函数,如 malloc 和 free。这些函数在异步信号处理上下文中执行时,可能导致堆内存状态的不一致,从而为远程代码执行漏洞提供可乘之机。

漏洞原理深入剖析

  • 堆内存损坏:当信号处理程序在执行过程中被中断时,堆内存可能处于不一致的状态。攻击者可以利用这种不一致性,通过精确控制信号的发送时机,来制造出有利于攻击的堆内存布局。
  • 堆喷射技术:攻击者通过发送特定大小的数据包,可以制造出特定的堆内存布局,使内存中的敏感数据结构(例如函数指针)指向攻击者控制的恶意代码。
  • 时间条件竞争:攻击者利用竞争条件,在正确的时间发送特定数据包,使得信号处理程序在处理过程中调用了不安全的函数,并导致执行攻击者控制的代码。

利用条件与限制

  • 目标系统:必须运行受影响版本的 OpenSSH 服务器,具体版本范围为 8.5p1 至 9.8p1 之间的版本。
  • 操作系统环境:目标系统需要是基于 glibc 的 Linux 系统,且当前已知的利用方案仅针对 32 位系统有效。
  • 网络访问:攻击者需要能够连接到目标系统的 SSH 服务。
  • glibc 版本:攻击者需要对目标系统的 glibc 版本和内存布局有一定了解,以便调整利用程序中的相关参数。
  • 堆内存布局:攻击者需要通过发送特定的数据包,来制造出有利于攻击的堆内存布局。
  • 多次尝试:由于条件竞争的利用特性,成功利用漏洞需要多次尝试。

不受影响的系统范围

  • 基于代码引入时间、系统保护措施以及系统安装的 OpenSSH 版本等因素,目前已知以下系统不受该漏洞影响:CentOS 7/8、RedHat 6/7/8、Debian 11 以及所有 Windows 操作系统。

防御措施与建议

  • 升级 OpenSSH:将 OpenSSH 升级至安全版本 9.8 及其以上,或者各发行版本的安全修复版本。
  • 限制访问:若暂时无法升级,建议使用安全组设置,将 OpenSSH 端口仅对可信地址开放。
  • 定期审计:定期进行安全审计和漏洞扫描,以及时发现和修复系统中的安全漏洞。
  • 安全编译选项:在编译 OpenSSH 时,启用堆保护机制(如堆栈保护、ASLR 等)。

详细利用过程示例

假设攻击者已知目标系统运行受影响的 OpenSSH 版本,并且可以访问 SSH 服务,且目标系统是32位的Linux系统。攻击者可以通过以下详细步骤尝试利用该漏洞:

建立连接:

攻击者与目标系统建立 SSH 连接,通过socket编程实现。

int sock = setup_connection("192.168.1.100", 22);

if (sock < 0) {

fprintf(stderr, "Failed to connect to target\n");

return -1;

}

制造堆布局:

通过发送特定大小的数据包,制造出有利于攻击的堆内存布局。

prepare_heap(sock);

在 prepare_heap 函数中,攻击者发送一系列数据包,填充 tcache 并创建特定大小的堆块。

发送恶意数据包:

攻击者创建一个包含伪造文件结构和函数指针的恶意数据包。

unsigned char final_packet[MAX_PACKET_SIZE];

create_public_key_packet(final_packet, sizeof(final_packet), glibc_base);

// 发送数据包,但保留最后一个字节以进行时间控制

send(sock, final_packet, sizeof(final_packet) - 1, 0);

精确时间控制:

攻击者计算合适的时间间隔,然后发送最后一个字节,触发竞争条件。

struct timespec start, current;

clock_gettime(CLOCK_MONOTONIC, &start);

while (1) {

clock_gettime(CLOCK_MONOTONIC, &current);

double elapsed = (current.tv_sec - start.tv_sec) + (current.tv_nsec - start.tv_nsec) / 1e9;

if (elapsed >= (LOGIN_GRACE_TIME - parsing_time - 0.001)) {

send(sock, &final_packet[sizeof(final_packet) - 1], 1, 0);

break;

}

}

检查结果:

如果攻击成功,攻击者可以观察到目标系统的异常行为,例如服务器连接被关闭或执行恶意代码。

response[1024];

ssize_t received = recv(sock, response, sizeof(response), 0);

if (received > 0) {

printf("Received response: %s\n", response);

} else if (received == 0) {

printf("Connection closed by server\n");

} else {

perror("recv");

}

总结

通过精确控制信号的发送时机,攻击者可以在32位的目标系统上制造出有利于攻击的堆内存布局,并利用竞争条件执行恶意代码。这一漏洞的发现和利用再次提醒我们,网络安全形势依然严峻,需要我们时刻保持警惕。目前,各操作系统发行方已发布安全更新。

PS:此文章仅做为学习记录笔记。此资源来自于 github ,出现的任何的法律问题与本人无关。

————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/m0_73866290/article/details/140154742

联系站长租广告位!

中国首席信息安全官