深度剖析 LNK 参数隐藏攻击 (ZDI-CAN-25373)
1、漏洞描述
ZDI-CAN-25373 是一个 Windows 快捷方式文件(.LNK)漏洞,它允许攻击者通过精心制作的恶意快捷方式文件来执行隐藏的恶意命令。攻击者通过在 .LNK 文件的 COMMAND_LINE_ARGUMENTS 结构中填充大量空白字符(如空格、水平制表符、换行符等)来隐藏恶意命令。这些填充字符使得恶意负载在 Windows UI 中不可见,从而规避了检测。
2. LNK 文件格式结构详解
Windows 快捷方式文件,也称为 Shell 链接文件(.lnk),是 Windows 操作系统使用的一种二进制文
件,用作文件、文件夹或应用程序的快捷方式。了解这些字段对于文件取证、恶意软件分析以及对 Windows 快捷方式的深入理解都非常重要。
以下是 MS-SHLLINK 文件格式的主要组成部分和关键字段介绍:
一个典型的 MS-SHLLINK 文件由以下几个主要结构组成,其中一些是必须的,一些是可选的:
- SHELL_LINK_HEADER (必须):快捷方式文件的核心头部,包含许多重要的标志和基本信息。
- LINKTARGET_IDLIST (可选):如果快捷方式指向一个 Shell 项(如文件、文件夹、控制面板项等),这个结构会描述其在 Shell 命名空间中的位置。
- LINKINFO (可选):包含有关链接目标位置的详细信息,例如卷序列号、网络路径等,用于在目标移动后帮助系统找到它。
- STRING_DATA (可选):包含各种字符串数据,如目标路径、工作目录、命令行参数、图标位置等。
- EXTRA_DATA (可选):一个包含一个或多个额外数据块的区域,用于存储其他可选信息。
主要字段和结构详解
2.1 SHELL_LINK_HEADER
这是每个 .LNK 文件的开头部分,提供了关于快捷方式的基本属性和其后续结构的信息。
- HeaderSize (4 字节):头的大小,通常为 0x0000004C。
- LinkCLSID (16 字节):一个固定的 GUID,用于标识这是一个 Shell Link 文件,通常为 {00021401-0000-0000-C000-000000000046}。
- LinkFlags (4 字节):一个位字段,包含指示文件中是否存在哪些可选结构的标志,以及快捷方式行为的各种标志。重要的标志包括:
- HasLinkTargetIDList:指示是否存在 LINKTARGET_IDLIST 结构。
- HasLinkInfo:指示是否存在 LINKINFO 结构。
- HasName:指示是否存在 STRING_DATA 中的 NAME_STRING。
- HasRelativePath:指示是否存在 STRING_DATA 中的 RELATIVE_PATH。
- HasWorkingDir:指示是否存在 STRING_DATA 中的 WORKING_DIR。
- HasArguments:指示是否存在 STRING_DATA 中的 COMMAND_LINE_ARGUMENTS(这在 ZDI-CAN-25373 漏洞中尤其重要)。
- HasIconLocation:指示是否存在 STRING_DATA 中的 ICON_LOCATION。
- IsUnicode:指示字符串数据是否为 Unicode 格式。
- FileAttributes (4 字节):链接目标的原始文件属性(例如,只读、隐藏、系统等),与 GetFileAttributes 函数返回的值类似。
- CreationTime (8 字节)