Syed Hasan - LNK File Analysis: LNKing It Together!
shell 链接或更常见的本地 Windows 用户称为快捷方式文件(技术上称为其扩展名 LNK)是威胁参与者最富有成效的初始访问载体之一。 一个看似无害的文件,带有一个可疑的图标,背后是恶意软件操作员的希望——该文件开始行动并推动恶意软件的各个阶段来破坏系统——太棒了!
本文的目的是深入研究为 LNK 文件提供支持的Shell Link Binary文件格式,并分析这些简单快捷方式 (LNK) 如何成为破坏的潜在途径。
Shell 链接二进制文件(文件格式)
Shell 链接二进制格式是 LNK 文件的动力。 它描述了一个结构——比如一个用来保存对象的容器——称为“shell链接”——用于快捷方式或 LNK 文件的行话。 它的目的相当简单——通过另一个对象访问一个数据对象。 为此,它必须存储对目标数据对象(称为“链接目标”)的某种形式的引用,以便源创建与它的关系(称为“链接”)。
图 1:Shell Link 二进制文件格式概述
Shell 链接由组成文件本身的几个其他结构组成。 下面列出了这些结构:
- SHELL_LINK_HEADER
- LINKTARGET_IDLIST
- LINKINFO
- STRING_DATA
- EXTRA_DATA
系好安全带——这不会是最“有趣”的部分。 尽管您需要这些信息来理解解析器的输出(我们将在下一节中讨论)。
SHELL_LINK_HEADER
SHELLLINK_HEADER 是链接文件中唯一的结构,LNK 文件必须符合文件格式。
这是因为此标头包含有关目标文件的关键信息、与该文件有关的属性以及其他结构(例如_LinkFlags)以识别其他可选标头(结构)的存在。
例如,要存在 LINKTARGET_IDLIST 结构,必须在此标头的 LinkFlags 子结构中设置HasLinkTargetIDList属性。
图 2:SHELL_LINK_HEADER 结构概述
LinkFlags 中的完整属性列表可在此处的Microsoft 文档中找到。
LINKTARGET_IDLIST
假设HasLinkTargetIDList在前一个结构中的LinkFlags下设置,此结构存储对文件系统上目标位置的引用。
但是,这些引用不是简单的完全限定路径(例如,C:\ABC\aFile.txt)。相反,Shell命名空间组织文件(或对象),使得每个文件都可以通过其ItemID来识别(IShellFolder 接口中的GetDisplayNameOf方法可用于将指向这些 ID 的指针转换为可读的显示名称)。
图 3:LINKTARGET_IDLIST 结构概述
这些 ItemID 的有序列表创建了一个 IDList,该 IDList 进一步封装在 LINKTARGET_IDLIST 结构中。
LINKINFO
同样,如果在第一个标头中的 LinkFlags 下设置了HasLinkInfo属性,则填充 LINKINFO 结构。
此结构包含有助于解析链接目标和识别其位置的信息,包括驱动器卷、序列号、标签和本地路径。
STRING_DATA
STRING_DATA 部分主要由 SHELL_LINK_HEADER 中的 LinkFlags 结构控制。例如,如果在LinkFlags中设置了HasWorkingDir和HasRelativePath属性,您将能够在此结构中看到链接目标的工作目录和相对路径。
另一个重要的属性是HasArguments,它指定了执行链接的命令行参数。
EXTRA_DATA
现在,链接文件中的最终结构是 EXTRA_DATA 结构,它包含有关链接目标的所有其他补充信息。尽管此处提供了完整列表,但仍有一些值得一提:
- 当链接目标也具有相应的环境变量时,EnvironmentVariableDataBlock结构很有用
- TrackerDataBlock提供了另一种使用链接跟踪服务来定位和解析链接目标的方法——它可以帮助识别目标文件是否被复制或移动。它还可以返回目标最后存在的 MachineID(NetBIOS 名称)和 MAC 地址等信息
图 4:EXTRA_DATA 结构概述
解析 LNK 文件
每次都通过规范不是很乏味吗?幸运的是,我们的同行在解析 LNK 文件并立即显示数据方面做得非常出色。
要从一长串解析器中挑选一个,我会选择Eric Zimmerman的LECmd。有多种查看输出的方法、抑制细节的选项、MAC 到供应商的转换等等。
要使用它,只需从 repo 中拉出该工具并从 shell 运行它。要查看帮助:
LECmd.exe -h
这是我解析样本的方式:
LECmd.exe -f "C:\Users\X\Desktop\HxD.lnk"
这是输出的一部分:
图 5:LECmd 在示例 LNK 文件上的输出
如果你已经读到这里了——你应该知道输出中的每个部分代表什么。现在,让我们把它提高一个档次,看看攻击者是如何喜欢干预这些文件的!
LNK 文件的黑暗面
大多数情况下,威胁参与者使用 LNK 文件的命令行功能使文件能够充当下载器。让我们看一下典型但恶意的 LNK 文件在用户眼中的样子。
Figure 6: How sweet is it?
深入研究它的属性,有一个讨厌的调用…… hsmta。不管那是什么。
图 7:使用 URL 调用“hsmta”(可能是下载程序)
因此,它在 C:\Windows 中启动并移动到其目标位置,但没有hsmta。
嗯,有一个 mshta.exe(一个用于执行已编译 HTML 文件的 Windows 实用程序)——这个实用程序因恶意而闻名。但是这里发生了什么?
如果您现在按“打开文件位置”- 即使目标框清楚地提到了其他一些二进制文件,您也会点击“mshta”。
现在,我们在文件规范中有几十个地方看到了对链接目标的引用。
让我们解析这个文件并详细查看它。以下是解析目标路径的那些路径的摘要:
Relative Path: ..\..\..\Windows\System32\hsmta.exe
...
Local path: C:\Windows\System32\hsmta.exe
...
-File ==> mshta.exe
Short name: hsmta.exe
Modified: 2021-01-02 03:07:32
Extension block count: 1
--------- Block 0 (Beef0004) ---------
Long name: mshta.exe
Created: 2021-01-02 03:07:32
Last access: 2021-01-02 03:07:32
MFT entry/sequence #: 215068/6 (0x3481C/0x6)
...
Environment variables: %windir%\System32\hsmta.exe
...
28636aa6-953d-11d2-b5d6-00c04fd918d0\30 Parsing Path ==> C:\Windows\System32\hsmta.exe
LNK 文件通过几种方法来寻找链接目标。这里,当短名称失效时,长名称用于解析链接目标(路径实际上取自EnvironmentVariableDataBlock,没有它会使LNK无用)并执行恶意链接文件。
不幸的是,事实并非如此。
您会认为文件属性中的Target框将能够在其中保存整个命令行参数。但它不能。该字段实际上限制为 260 个字符。而整个命令行参数字段支持 4096 个字符:
图 8:这里没有任何可疑之处。只是一个 cmd.exe 调用。
意思应该是:显示的最多260,实际最多4096
众所周知,威胁参与者会在字段中添加空格或填充。这会将恶意命令推到盒子范围之外。现在,如果一个不知情的用户要查看文件中的可疑指标,那么将一无所有,并且可能正在进行妥协。
我们对于它可以做些什么呢?
编写检测规则可能是检测和阻止恶意尝试执行 LNK 文件的最有效方法之一。
Florian Roth 的 Signature Base 存储库也是几个很好的 Yara 规则的所在地,用于检测 LNK 文件从源数组中删除,例如 ZIP 文件或检测一组相当可疑的 LinkFlags。
使用 TrackerDataBlock,您还可以使用 NetBIOS 名称、MAC 地址和卷序列号来跟踪多个入侵和活动的参与者。从这个FireEye 入侵分析中可以看出,元数据已被证明非常有用。