Windows最新BUG提权CVE-2024-30088 EXP

admin 2024年6月28日02:07:42评论17 views字数 3021阅读10分4秒阅读模式

漏洞

点击蓝字 关注我们

Windows最新BUG提权CVE-2024-30088 EXP

免责声明

本文发布的工具和脚本,仅用作测试和学习研究,禁止用于商业用途,不能保证其合法性,准确性,完整性和有效性,请根据情况自行判断。

如果任何单位或个人认为该项目的脚本可能涉嫌侵犯其权利,则应及时通知并提供身份证明,所有权证明,我们将在收到认证文件后删除相关内容。

文中所涉及的技术、思路及工具等相关知识仅供安全为目的的学习使用,任何人不得将其应用于非法用途及盈利等目的,间接使用文章中的任何工具、思路及技术,我方对于由此引起的法律后果概不负责。

🌟概述

CVE-2024-30088

Bug:

  • 当内核将当前令牌对象的_SEMBERZBASEP_SECURITY_ATTRIBUTES_INFORMATION复制到用户模式时,AuthzBasepCopyoutInternalSecurityAttributes函数中存在漏洞,其结构如下:

//0x30 bytes (sizeof)
struct _AUTHZBASEP_SECURITY_ATTRIBUTES_INFORMATION
{
ULONG SecurityAttributeCount; //0x0
struct _LIST_ENTRY SecurityAttributesList; //0x8
ULONG WorkingSecurityAttributeCount; //0x18
struct _LIST_ENTRY WorkingSecurityAttributesList; //0x20
};
  • 当执行复制SecurityAttributesList时,内核将SecurityAttribute的结构列表 * 直接 * 设置为用户提供的指针。之后,它调用RtlCopyUnicodeString和AuthzBasepCopyoutInternalSecurityAttributeValues函数来复制SecurityAttribute结构的名称和值,从而导致该函数中有多个TOCTAttribute。

  • 在调用RtlCopyUnicodeString [*]之前,通过一个简单的竞赛线程修改属性名的Buffer指针,我可以轻松地归档具有固定值和大小控制的任意地址写入。

Windows最新BUG提权CVE-2024-30088 EXP

  • 请注意,也有一些其他的方法来利用它,但在我的情况下,我选择利用RtlCopyUnicodeString。

触发错误:

  • 这个bug可以通过调用NtQueryInformationToken和TokenQueryInformation类来触发。

补丁:

  • 如果系统调用来自用户模式,补丁使用内核堆栈上的局部变量(下面代码块中的v18)作为缓冲区,在写回用户缓冲区之前复制安全属性的名称。

    [...]
p_SecurityAttributesList = &a1->SecurityAttributesList;
Flink = a1->SecurityAttributesList.Flink;
if ( Flink == p_SecurityAttributesList )
return (unsigned int)inserted;
v13 = a2 + 0x98;
while ( 1 )
{
if ( (unsigned int)Feature_2516935995__private_IsEnabledDeviceUsage() )
{
inserted = AuthzBasepProbeAndInsertTailList(a2 + 8, v13 - 0x68);
if ( inserted < 0 )
goto LABEL_24;
}
else
{
[...]
}
++*(_DWORD *)a2;
*(_WORD *)(v13 - 56) = Flink[3].Flink;
*(_DWORD *)(v13 - 52) = HIDWORD(Flink[3].Flink);
*(_QWORD *)(v13 - 24) = v13 - 32;
*(_QWORD *)(v13 - 32) = v13 - 32;
*(_QWORD *)v13 = v13 - 8;
*(_QWORD *)(v13 - 8) = v13 - 8;
*(_QWORD *)(v13 - 48) = 0i64;
*(_DWORD *)(v13 - 40) = 0;
*(_DWORD *)(v13 - 16) = 0;
Flink_low = LOWORD(Flink[2].Flink);
v19 = Flink_low;
v17 = (wchar_t *)((v10 + 1) & 0xFFFFFFFFFFFFFFFEui64);
v15 = (unsigned __int64)v17 + Flink_low;
if ( (unsigned __int64)v17 + Flink_low > v6 )
break;
if ( (unsigned int)Feature_3391791421__private_IsEnabledDeviceUsage() )
{
*(_QWORD *)&v18.Length = 0i64;
v18.MaximumLength = Flink_low;
v18.Buffer = v17;
RtlCopyUnicodeString(&v18.Length, (unsigned __int16 *)&Flink[2]);
*(_UNICODE_STRING *)(v13 - 0x48) = v18;
}
else
{
[...]
}
inserted = AuthzBasepCopyoutInternalSecurityAttributeValues(
(__int64)Flink,
v13 - 104,
v15,
(int)v6 - (int)v15,
&v19);
[...]
  • 在调试会话中,我们可以看到rcx是补丁后的内核地址:

5: kd> 
nt!AuthzBasepCopyoutInternalSecurityAttributes+0x1aa:
fffff803`5dbcf14a e8810fa5ff call nt!RtlCopyUnicodeString (fffff803`5d6200d0)
5: kd> r
rax=0000025a81d006a0 rbx=0000025a81d00590 rcx=ffffe20697c4f778
rdx=ffffa609c7a101a0 rsi=0000025a81d00598 rdi=0000025a81d00628
rip=fffff8035dbcf14a rsp=ffffe20697c4f740 rbp=0000025a81d006c0
r8=0000000000000003 r9=0000025a81d00590 r10=ffffa609c816ef78
r11=ffffe20697c4f7d0 r12=0000000000000a70 r13=ffffa609ca9b1118
r14=ffffa609c7a10180 r15=0000025a81d01000
iopl=0 nv up ei pl nz na pe nc
cs=0010 ss=0018 ds=002b es=002b fs=0053 gs=002b efl=00040202
nt!AuthzBasepCopyoutInternalSecurityAttributes+0x1aa:
fffff803`5dbcf14a e8810fa5ff call nt!RtlCopyUnicodeString (fffff803`5d6200d0)

利用

Windows最新BUG提权CVE-2024-30088 EXP

Windows最新BUG提权CVE-2024-30088 EXP

项目地址

https://github.com/tykawaii98/CVE-2024-30088

原文始发于微信公众号(SecHub网络安全社区):Windows最新BUG提权CVE-2024-30088 EXP

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年6月28日02:07:42
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Windows最新BUG提权CVE-2024-30088 EXPhttps://cn-sec.com/archives/2890204.html

发表评论

匿名网友 填写信息