CVE-2023-38831 - WinRAR
本仓库包含针对 CVE-2023-38831(WinRAR ZIP 文件欺骗 / 双扩展名漏洞利用)的检测逻辑,包含原始查询 / 代码块以及 ETW 特定的提供程序名称和事件 ID。 目标系统上存在易受攻击的 WinRAR 版本(< 6.23)
CVE-2023-38831 在以下情况下被利用:
用户在 WinRAR 中打开恶意 ZIP
压缩包中包含:
● 一个诱饵文件(例如 invoice.pdf )
● 一个同名目录(例如 invoice.pdf \)
● 目录内有两个同名但名称略有差异的文件(其中一个文件名以空格结尾并带有任意扩展名,例如第一个文件是 "invoice.pdf ",那么第二个文件可以是任何脚本或可执行文件,如 "invoice.pdf .cmd")
WinRAR 执行脚本或可执行文件,而不是打开文档(本例中为“PDF”)
此执行是通过调用函数 ShellExecuteExW 来执行该文件触发的,并传入 shExecInfo(通过资源管理器执行 ShellExecute)
WinRAR 生成一个子进程(cmd、powershell、mshta、wscript、exe,与文件夹中实际存在的内容相同)
执行通常发生在 Temp / AppData / 解压路径中
流程摘要 用户打开压缩包
↓
WinRAR 显示诱饵文件
↓
用户双击文档
↓
WinRAR 解压同名目录
↓
可执行文件被写入 *.pdf\*.pdf .exe
↓
通过资源管理器执行 ShellExecute
↓
可执行文件的 ImageLoad
↓
Payload 执行
为什么此流程对检测很重要
● 不使用宏
● 不依赖进程创建
● 漏洞利用依赖于文件系统伪装
● 高置信度、低噪声信号
重要的技术细节
文件以特殊结构写入
例如压缩包中有两个同名对象(文件/目录)。当压缩文件中同时存在同名文件和目录,而你想临时打开该文件时,只需在打开的压缩文件中双击它(目标文件),WinRAR 就会为你解压该文件,同时也会解压所有与目标文件同名的文件。所有这些文件都会被写入 %tmp% 路径下的临时目录中。
| 文件/目录名称 | 解压路径 |
| ------------------------------------------------------ | --------------------------------------------------------------------------------- |
| CLASSIFIED_DOCUMENTS.txt <– 被点击的目标文件 | `C:\Users\UsersName\AppData\Loca\Temp\Rar$DIa8432.13968\CLASSIFIED_DOCUMENTS.txt\`|
| CLASSIFIED_DOCUMENTS.txt .cmd <– 目录中的文件 | `C:\Users\UsersName\AppData\Loca\Temp\Rar$DIa8432.13968\CLASSIFIED_DOCUMENTS.txt\`|
如果在临时(解压)目录中有两个同名但大小不同的文件(例如 20k 和 12k),当你打开压缩包并打开第一个文件 1.txt(大小为 20k 字节)时,WinRAR 会提示你用第二个文件 1.txt(大小为 10K)替换该文件。如果点击“是”,则只会打开第二个文件 1.txt。此条件可作为排除项添加。
检测逻辑的要点
从 ZIP 解压路径或临时目录触发的进程执行,带有误导性扩展名或伪装成文件的文件夹
当 WinRAR 在临时目录中释放文件进行解压时,其中必须包含两个同名但名称略有差异的文件(以空格结尾并带有任意扩展名),例如在主文件名末尾添加一个空格“ ”(CLASSIFIED_DOCUMENTS.pdf ),然后再加一个“.cmd”(CLASSIFIED_DOCUMENTS.pdf .cmd)。
当 WinRAR 加载 DLL 并调用 ShellExecuteExA 函数时,参数 "pExecInfo" 中的路径带有一个空格并以任意扩展名结尾,例如 "CLASSIFIED_DOCUMENTS.pdf .cmd"。
ETW 提供程序与检测原理(仅 ETW) ETW 提供程序
| 用途 | ETW 提供程序 |
| -------------------------- | ------------------------------------- |
| 进程创建 | `Microsoft-Windows-Kernel-Process` |
| 命令行可见性 | `Microsoft-Windows-Security-Auditing` |
| 文件操作(可选) | `Microsoft-Windows-Kernel-File` |
检测将依赖于(如果没有 ProcessStart、CreateProcess 或 EDR 风格的父/子逻辑):
● 文件系统 ETW
● Shell / 资源管理器 ETW
● 映像加载 ETW(可选,非创建)
● 命令行 ETW(可选)
核心 ETW 提供程序
| 用途 | ETW 提供程序 |
| -------------------------- | ------------------------------------- |
| 目录创建 | `Microsoft-Windows-Kernel-File` |
| EXE 创建 | `Microsoft-Windows-Kernel-File` |
| Shell 执行 | `Microsoft.Windows.ShellExecute` |
| 映像加载 | `Microsoft-Windows-Kernel-Image` |
| 资源管理器 | `Microsoft-Windows-Explorer` |
| Shell | `Microsoft-Windows-Shell-Core` |
原始检测逻辑
在高层面上,该逻辑检测:
● WinRAR.exe 发起文件写入
● 同时创建同名目录和文件
● 重命名或覆盖后出现可执行扩展名
● 在紧凑时间窗口内(<2 秒)发生的序列
这种模式在良性工作流中极为罕见,但却是漏洞利用执行路径的核心。
● 该规则有意避免:
● 命令行检查
● 子进程跟踪
● 完整文件哈希
下文列出了核心检测逻辑,并附有置信度级别和简要说明。
1.映像加载(执行确认)
原因:无需进程创建遥测即可确认实际执行。
检测逻辑:
Windows 加载器:
● 将 Invoice.pdf .exe 映射到内存中
ETW 信号:
● ImageLoad
● 映像路径:
● *.pdf\*.pdf .exe
2.检测规则(API ShellExecuteExA)— 高保真规则逻辑
基于以下遥测数据的通用检测规则:
● WinRar.exe 产生的文件创建事件
● WinRar.exe 加载 DLL Shell32.dll 并开始使用带参数的 API(ShellExecuteExA|W)的映像加载事件。
● 该函数只接收一个名为 SHELLEXECUTEINFO 的参数,它是一个结构体。如你所见,这个结构体有许多字段,但其中两个对我们很重要:
lpVerb 和 lpFile。
● lpVerb — 如果将 LpVerb 设置为 NULL,ShellExecuteExA|W 会使用默认动词(如果可用),否则会执行“open”(打开)动词。“open”动词会打开或执行该文件。
● lpFile — lpFile 是 ShellExecuteExA 用于执行动词的文件路径,现在请注意文件路径末尾的空格字符(0x20)。
注意:
1- Shell32.dll:ShellExecuteExA 在此定义。它包含解析 SHELLEXECUTEINFO 结构并决定如何处理请求(例如打开文档、运行 EXE 或显示属性对话框)的逻辑。
2- 漏洞的工作方式:漏洞就在这里。WinRAR 在写入时从文件名中移除了空格,但忘记将此更改提交到解压列表。因此目标文件名没有改变,空格仍然保留在文件名中。
我还可以说,ShellExecuteExA 打开的是“CLASSIFIED_DOCUMENTS.pdf .cmd”文件。对 ShellExecuteExA 来说“.cmd”无关紧要,它只是运行该路径中名为“CLASSIFIED_DOCUMENTS.pdf ”的文件。
检测逻辑(高保真规则逻辑):
● SQL 方式:\\Detection_Logic\\SQL-based-ShellExecute.txt
● KQL(ProcessCommandLine):\\Detection_Logic\\KQL-API-ProcessCommandLine.txt
● 伪代码检测逻辑:\\Detection_Logic\\SQL-API-ShellExecute.txt
注意:- 你可以按照上述标准创建检测逻辑。我还添加了一个简单的 Python 脚本,用于获取事件,这将有助于你编写检测规则,在创建基于 ETW 的规则时也很有用。
| 提供程序 | 事件 ID | 事件 ID / 任务 |
| ------------------------------------- | ----------------------------------------- | --------------------------- |
| `Microsoft-Windows-Shell-Core` | {30336983-0362-4540-9E69-14844E6A3B7A} | Event ID 1(执行) |
| `Microsoft-Windows-Kernel-Process` | {22FB2AD3-E163-4078-8C2A-801648437D2D} | 映像加载 / 进程启动 |
3.针对 WinRAR CVE-2023-38831 漏洞利用的高保真规则逻辑
- 原因:当从名称以文档扩展名结尾的目录中创建或加载可执行文件,并通过资源管理器/Shell API 发起执行时发出警报。
- 伪代码检测逻辑(高保真规则逻辑)- \\Detection_Logic\\WinRAR-CVE-2023-38831-Exploitation.txt
4.EDR 检测规则(基于 ETW)
基于以下遥测数据的通用 EDR 检测规则:
● 文件创建事件
● Shell 执行 / 资源管理器调用
● 映像加载事件(可选但强烈推荐)
检测逻辑:\\Detection_Logic\\EDR-Detection-ETW-based.txt
5.不使用 DeviceProcessEvents 的 KQL 查询(如果端点支持)
原因:此版本无需依赖 DeviceProcessEvents 即可正常工作
检测逻辑:\\Detection_Logic\\KQL-Detection-without-DeviceProcessEvents.txt
6.Shell 执行信号(如果已启用且受支持)
原因:与文件创建关联时可增强置信度。
检测逻辑:\\Detection_Logic\\Shell-Execution-Signal.txt
7.面向 SOC 的规则(分流流程)
原因:此规则针对攻击过程中发现的每一个步骤而创建。
检测逻辑:\\Detection_Logic\\SOC-Friendly.txt
(警报 / 如果包含 ProcessStart、CreateProcess 或 EDR 风格的父/子逻辑)
1.检测 winrar.exe 何时创建可疑目录/文件(尤其是从临时目录或压缩包解压路径创建),以及使用存在漏洞的 WinRAR 版本运行可疑创建文件
原因:根据你的产品所处理的事件来创建规则,例如访问类、事件类或基于云的产品
检测逻辑:\\Detection_Logic\\Gen-Pseudocode-Detection-Logic.txt
2.检测 winrar.exe 何时生成可疑子进程(尤其是从临时目录或压缩包解压路径生成)
检测逻辑:
端点:\\Detection_Logic\\winrar-spawns-suspicious-child-process.txt
Sigma 规则:\\Detection_Logic\\Sigma-Rule-WinRAR Exploit.txt
3.基于 ETW 提供程序(进程创建)的警报
| 提供程序 | 事件 ID |
| ------------------------------------- | --------------------------- |
| `Microsoft-Windows-Security-Auditing` | 4688(进程创建) |
检测逻辑
● 父进程 = winrar.exe
● 新进程 = 脚本引擎或可执行文件
● 命令行包含 Temp/AppData
4.使用 DeviceProcessEvents 的 KQL 查询(如果端点支持)
原因:如果我们希望使用 DeviceProcessEvents 进行开发
检测逻辑:\\Detection_Logic\\KQL-Detection-with-DeviceProcessEvents.txt
5.攻击指标(可添加高置信度警报)
通过满足以下条件,你可以添加 IOA 或观察列表规则用于警报。
| 指标 | 置信度 |
| ---------------------------------- | ---------- |
| winrar.exe 生成 cmd/powershell | 高 |
| 从 Temp/AppData 执行 | 高 |
| `.cmd/.bat /.exe ` 执行 | 高 |
| 打开双扩展名 ZIP | 中 |
为存在漏洞的 WinRAR 版本(< 6.23)创建的目录中的两个同名文件创建观察列表:
因为在目录中不能有两个同名文件,也不能有同名的目录和文件。
但在 WinRAR/7zip 等压缩软件中这是可能的。在压缩文件中,无论是否存在同名文件,文件都以特殊结构写入。
因此,你可以在 ZIP/RAR 文件中拥有两个同名的对象(文件/目录)。
可能合法的触发条件
● 7-Zip/WinRAR 自解压安装程序生成的 cmd.exe
● RAR 打包的企业软件更新程序启动的 powershell.exe
● 打印机驱动或 GPU 驱动安装程序使用的 rundll32.exe
排除逻辑(示例)
AND NOT (
ChildImage IN (cmd.exe, powershell.exe, rundll32.exe)
AND
CommandLine CONTAINS (
"setup.exe",
"install.cmd",
"driverinstall",
"vendorupdate"
)
)
这可以在抑制已知安装程序行为的同时,保留漏洞利用检测能力。
压缩包文件遥测(文件系统事件)— 将此规则与 RAR/ZIP 解压活动关联(例如,在执行前立即创建 .cmd/.bat/.exe 文件,尤其是从 WinRAR 解压目录(如 Rar$EX*)中创建),可以通过证明执行紧随压缩包解压之后发生,从而显著提高置信度并减少误报。
T1204.002 – 用户执行:恶意文件
T1059 – 命令和脚本解释器
T1036 – 伪装(双扩展名)
此检测代码仅用于教育和授权测试目的。
请勿在你不拥有或未经明确许可测试的系统上使用。