《微软爆超严重远程代码执行漏洞MadLicense》
目录
引言
7月份,微软修复了142个漏洞,其中包括一个超严重的远程代码执行漏洞MadLicense,中文译为狂躁许可,CVE编号为CVE-2024-38077。
漏洞概述
漏洞名称:CVE-2024-38077
CVSS评分:9.8(满分10分)
漏洞类型:远程代码执行
影响范围:开启Windows Remote Desktop Licensing(RDL)Service 的Windows服务器
影响版本:Windows Server 2000 - Windows Server 2025
综合评价:
<利用难度>:容易
<威胁等级>:严重
官方解决方案:微软官方已发布补丁公告
该漏洞是一个预身份验证 RCE 缺陷,允许攻击者在易受攻击的系统上执行任意代码,而无需用户交互。
这一漏洞存在于Windows远程桌面许可管理服务(RDL)中,该服务被广泛部署于开启Windows远程桌面(3389端口)的服务器,用于管理远程桌面连接许可。攻击者无需任何前置条件,无需用户交互(零点击)便可直接获取服务器最高权限,执行任意操作。
该远程代码执行漏洞, CVSS评分高达9.8 ,可导致开启了远程桌面许可服务的Windwos服务器完全沦陷。 漏洞影响Windows Server 2000到Windows Server 2025所有版本,已存在近30年。 该漏洞可稳定利用、 可远控、可勒索、可蠕虫等,破坏力极大。
该漏洞是自“永恒之蓝”后,Windows首次出现影响全版本且能高稳定利用的认证前RCE漏洞。建议尽快通过官网公告更新安全补丁。
漏洞详情
该缺陷的根源在于“CDataCoding::DecodeData”过程中,分配了一个固定大小的缓冲区(21字节),然后用于计算和填充用户控制的长度缓冲区,导致堆溢出。
堆栈调用伪代码
堆栈调用伪代码
```windbg
0:012> k
# Child-SP RetAddr Call Site
00 000000b9`d2ffbd30 00007fff`67a76fec lserver!CDataCoding::DecodeData
01 000000b9`d2ffbd70 00007fff`67a5c793 lserver!LKPLiteVerifyLKP+0x38
02 000000b9`d2ffbdc0 00007fff`67a343eb lserver!TLSDBTelephoneRegisterLicenseKeyPack+0x163
03 000000b9`d2ffd7d0 00007fff`867052a3 lserver!TLSRpcTelephoneRegisterLKP+0x15b
04 000000b9`d2fff0c0 00007fff`8664854d RPCRT4!Invoke+0x73
05 000000b9`d2fff120 00007fff`86647fda RPCRT4!NdrStubCall2+0x30d
06 000000b9`d2fff3d0 00007fff`866b7967 RPCRT4!NdrServerCall2+0x1a
07 000000b9`d2fff400 00007fff`86673824 RPCRT4!DispatchToStubInCNoAvrf+0x17
08 000000b9`d2fff450 00007fff`866729e4 RPCRT4!RPC_INTERFACE::DispatchToStubWorker+0x194
09 000000b9`d2fff520 00007fff`86688d4a RPCRT4!RPC_INTERFACE::DispatchToStub+0x1f4
0a 000000b9`d2fff7c0 00007fff`86688af1 RPCRT4!OSF_SCALL::DispatchHelper+0x13a
0b 000000b9`d2fff8e0 00007fff`86687809 RPCRT4!OSF_SCALL::DispatchRPCCall+0x89
0c 000000b9`d2fff910 00007fff`86686398 RPCRT4!OSF_SCALL::ProcessReceivedPDU+0xe1
0d 000000b9`d2fff9b0 00007fff`86697f4c RPCRT4!OSF_SCONNECTION::ProcessReceiveComplete+0x34c
0e 000000b9`d2fffab0 00007fff`840377f1 RPCRT4!CO_ConnectionThreadPoolCallback+0xbc
0f 000000b9`d2fffb30 00007fff`867f7794 KERNELBASE!BasepTpIoCallback+0x51
10 000000b9`d2fffb80 00007fff`867f7e37 ntdll!TppIopExecuteCallback+0x1b4
11 000000b9`d2fffc00 00007fff`85b11fd7 ntdll!TppWorkerThread+0x547
12 000000b9`d2ffff60 00007fff`8683d9c0 KERNEL32!BaseThreadInitThunk+0x17
13 000000b9`d2ffff90 00000000`00000000 ntdll!RtlUserThreadStart+0x20
1
2
3
4
5void __fastcall CDataCoding::SetInputEncDataLen(CDataCoding *this)
6
7
8{
9
10
11 // ...
12
13
14 dword_1800D61D0 = 35;
15
16
17 v1 = log10_0((double)dword_1800D61C8) * 35.0;
18
19
20 v2 = v1 / log10_0(2.0);
21
22
23 v3 = (int)v2 + 1;
24
25
26 v4 = 0;
27
28
29 if ( v2 <= (double)(int)v2 )
30
31
32 v3 = (int)v2;
33
34
35 LOBYTE(v4) = (v3 & 7) != 0;
36
37
38 LODWORD(dwBytes) = (v3 >> 3) + v4; // dwBytes is a fixed value 21
39
40
41}
42
43
44__int64 __fastcall CDataCoding::DecodeData(
45
46
47 CDataCoding *this,
48
49
50 const unsigned __int16 *a2,
51
52
53 unsigned __int8 **a3,
54
55
56 unsigned int *a4)
57
58
59{
60
61
62 // ...
63
64
65 v4 = 0;
66
67
68 v8 = 0;
69
70
71 if ( a3 )
72
73
74 {
75
76
77 // dwBytes is a global variable with value 21
78
79
80 v9 = dwBytes;
81
82
83 *a3 = 0i64;
84
85
86 *a4 = 0;
87
88
89 ProcessHeap = GetProcessHeap();
90
91
92 v11 = (unsigned __int8 *)HeapAlloc(ProcessHeap, 8u, v9);
93
94
95 v12 = v11;
96
97
98 if ( v11 )
99
100
101 {
102
103
104 memset_0(v11, 0, (unsigned int)dwBytes);
105
106
107 while ( *a2 )
108
109
110 {
111
112
113 // Str is BCDFGHJKMPQRTVWXY2346789
114
115
116 // a2 is user-controlled buffer
117
118
119 v13 = wcschr_0(Str, *a2);
120
121
122 if ( !v13 )
123
124
125 {
126
127
128 v4 = 13;
129
130
131 v18 = GetProcessHeap();
132
133
134 HeapFree(v18, 0, v12);
135
136
137 return v4;
138
139
140 }
141
142
143 // here change the integer a2 from base 24 to base 10
144
145
146 // but does not check the length of a2
147
148
149 v14 = v13 - Str;
150
151
152 v15 = v12;
153
154
155 v16 = (unsigned int)(v8 + 1);
156
157
158 do
159
160
161 {
162
163
164 v17 = dword_1800D61C8 * *v15 + v14;
165
166
167 *v15++ = v17;
168
169
170 LODWORD(v14) = v17 >> 8;
171
172
173 --v16;
174
175
176 }
177
178
179 while ( v16 );
180
181
182 if ( (_DWORD)v14 )
183
184
185 v12[++v8] = v14;
186
187
188 ++a2;
189
190
191 }
192
193
194 *a4 = dwBytes;
195
196
197 *a3 = v12;
198
199
200 }
201
202
203 else
204
205
206 {
207
208
209 return 8;
210
211
212 }
213
214
215 }
216
217
218 else
219
220
221 {
222
223
224 return 87;
225
226
227 }
228
229
230 return v4;
231
232
233}
234
235
236}
该漏洞通过操纵许可服务来加载远程 DLL,从而允许攻击者在服务进程中执行任意 shellcode。
漏洞Poc演示代码
由于漏洞的严重性,为了防止Poc被滥用,这里仅仅只是提供伪代码。
https://github.com/CloudCrowSec001/CVE-2024-38077-POC
漏洞演示视频
研究人员 Ver、Lewis Lee 和zhiniang Peng 的 PoC 漏洞演示了如何利用此漏洞绕过 Windows Server 2025 中的现代安全防护措施,从而实现完整的远程代码执行功能。
视频来源于YouTube
漏洞利用可以构建在Windows Server 2000到Windows Server 2025上的所有服务器。这里我们只以2025版本进行演示,因为Windows Server 2025号称是最新、最安全的Windows Server 。
微软已获悉此漏洞的可利用性,但最初将其标记为“利用可能性较小”。
漏洞影响
由于有超过 170,000 个远程桌面授权服务暴露在公共互联网上,因此该漏洞的潜在影响是巨大的。内部网络中受影响的数量无疑要大得多,该漏洞的零点击性质使其特别危险,因为它可以在没有任何用户交互的情况下被利用,从而增加了广泛攻击的风险。
该漏洞利用的POC在Windows Server 2025上的成功率超过95%。考虑到服务崩溃后会重新启动,并且不需要两次泄露模块基地址,最终的成功率可能会更高(接近100%)。
此漏洞几乎等同于当年的“永恒之蓝”漏洞。
参考链接:
https://sites.google.com/site/zhiniangpeng/blogs/MadLicense
https://cybersecuritynews.com/madlicense-0-click-rce-flaw/
推荐阅读
关于我们
极智安科技是一家专注于AGI安全方向的人工智能公司。曾受邀参与针对openai明星产品chatgpt的安全攻防评测,在针对chatgpt的安全测试中发现多种越狱攻击,数据泄露问题。公司创始成员具有丰富的安全攻防实战经验,安全体系建设经验。公司可提供最专业的AIGC内容安全检测服务,AIGC安全评测服务,AIGC安全合规服务,AIGC数据安全服务等。
更多信息可关注公司官网 www.jzatech.com。
点击左下角“阅读原文”查看AGI安全系列文章。
【极智安科技专注于AGI安全方向,提供最专业的AIGC安全解决方案,欢迎关注与交流。】