基于lnk劫持的权限维持工具-shadowlnk

介绍

当我在研究免杀操作的时候,我发现常规意义上的注册表,启动项还有计划任务这三种基于机器自动化的权限维持手段,在杀软中是被看的很死的,我在学习的过程中很是苦恼。就在这个时候我正好在学习红队的一些基础钓鱼手段,其中利用隐藏文件夹以及lnk伪造文件的形式让我有了灵感,既然机器层面的自启动不好实现,那么人类层面呢?

lnk钓鱼详解

我演示的这就是一个很典型的样本

__MACOSX文件夹下方是

目录外的快捷方式指向其中的bat脚本,其中bat脚本内容是如下:移动我们的载荷并且在启动载荷的同时启动文档。

@echo off
cd /d %~dp0

move /Y 1.exe "C:\Users\Public\Documents\1.exe"

start "" "C:\Users\Public\Documents\1.exe"

timeout /t 1 /nobreak >nul
start "" "1.docx"
taskkill /f /im cmd.exe

当我们将__MACOSX文件夹隐藏后就是一个正常的文件,普通人不会在意这个角标。

但是这个样本还是有问题的,首先是其中的bat文件不免杀,移动文件和启动文件这两个操作单拿出来都不会被杀,但是组合在一起的bat很容易触发国内一些杀软的报警。其次则是在启动的时候还是会伴随短暂的黑框。

我的解决办法是利用,快捷方式调用vbs,也就是所谓的js脚本,js脚本能以黑框启动bat脚本。

Set WshShell = CreateObject("WScript.Shell")
WshShell.Run ".\__MACOSX\1.bat", 0, False

将bat脚本只用于启动载荷和伪装文档

@echo off
cd /d %~dp0
start "" "1.exe"
start "" "1.docx"
taskkill /f /im cmd.exe

如此情况下,就做到了一个简单的钓鱼样本,受害者在点击样本时,先执行我们隐藏的载荷,之后打开文档。

所以我在想,既然红队能通过如此手段诱导受害者点击文件,那么就也可以劫持机器上本身存在的lnk文件,通过劫持受害者常用的快捷方式做到每次开机,由人类来帮助我们上线。

工具实现

为了实现这种效果,我开发了一个小工具 shadowlnk

它有两种主要的使用逻辑,首先是利用-i指定劫持目标,-w指定可写目录(我们需要这个目录来创建隐藏文件夹),-p指定我们的载荷位置。

当成功劫持之后,图标看上去没有变化,连闪烁都不存在,但是它的指向已经被替换为了我们指定的恶意脚本。

执行后也是无感上线

(载荷需要自己做免杀,这个工具本质上是权限维持使用的,为了辅助载荷免杀,此工具也有参数启动选项),可以看到我环境当中还存在360,也是并没有触发警告。

所以这一套操作的流程是如何实现的呢?

首先当接受到图标目标后,shadowslnk会利用解析这个lnk的原指向。这一点是必须的,因为我们不仅需要载荷正常执行,更重要的一点是需要图标维持原样,而原lnk图标并没有内置ico的文件,只是调用了它原指向的目标的图标,这里我利用了go两个第三方库。

"github.com/Kodeworks/golang-image-ico"
"github.com/fcjr/geticon"

他们能从pe文件上剥离ico图标,并用于我们的伪造。

之后shaodwlnk会在我们指定的可写文件夹下创建与指向pe文件名相同的文件夹,并且添加系统属性和隐藏属性,这会使这个文件夹达成与attrib +s +h 一样的效果。

此后shaodwslnk会生成vbs,bat,ico三个文件:

 C:\Users\wacky\Desktop\shadowlnk-test\mgtv-1 的目录

2025/08/10  23:48            15,601 icon.ico
2025/08/10  23:48               130 mgtv-1.bat
2025/08/10  23:48               162 mgtv-1.vbs
2025/08/10  23:48             2,259 芒果TV.lnk
               4 个文件         18,152 字节
               0 个目录 32,365,248,512 可用字节

ico文件是shadowlnk从原程序上剥离的,与原lnk完全一致。vbs脚本用于执行bat脚本,而bat脚本用于执行载荷。

最终,shadowslnk会利用ico生成一个伪造lnk,并与桌面上的同lnk进行调换,至此劫持工作就完成了。

额外参数

这个工具还有两个我额外添加的操作,就是-r参数和-power参数

如果启用了-r参数,shadowlnk会自动的替换桌面上所有lnk文件,并且因为文件夹不重名的原因,兼容性还算不错,整个替换过程中桌面用户是无感的。

但是不建议实战中使用这种效果,因为360以及国内一些杀软会检查自身是否被替换快捷文件,所以一般情况下单个的劫持已经够用了,攻击者完全可以做到落地后检索当前环境,将常用软件lnk劫持替换进行权限维持。

在此之上,如果启用了-power参数,其中的vbs脚本会被替换成如下

这时,当用户启动程序后会弹出uac认证,但vbs本身就是微软程序,所以弹出来的uac认证看上去并不危险,一些人或许会因此稀里糊涂的上钩,让我们进行了权限提升。

可以看到获得的是管理员shell。这一点也需要按需使用,如果一个用户发现自己的浏览器在启动的时候每次都询问管理员权限,也是不太合理不是吗?

总结

这个小东西只是一个我实验性的小玩意,所做的作用就是带给大家一些新的权限维持思路,经过我的测试,在样本免杀的前提下,劫持只要不劫持杀软本身,则在劫持过程中以及触发过程中均不会被杀软报毒,但是我并不希望此工具被恶意利用,本文仅做学习展示,这警醒了防御方在如今内存查杀以及敏感行为的防御检测严格情况下,人类的交互也许是攻击者下手的便捷之道。