
1. 项目概述当AITM钓鱼盯上TikTok商业账号最近在分析一些针对企业社交媒体账号的新型攻击案例时一个词反复出现AITM。这可不是什么人工智能模型而是“Adversary-in-The-Middle”的缩写直译过来就是“攻击者在中间”。这是一种比传统钓鱼复杂得多的中间人攻击变种它不再满足于让你在一个假页面上输入密码而是扮演一个“诚实的中间人”在你和真正的服务之间穿梭实时窃取你的一切登录凭据包括那些你以为固若金汤的双因素认证MFA验证码。而TikTok的商业账号正成为这类攻击的“高价值目标”。为什么因为一个成熟的TikTok商业账号背后连接着品牌影响力、广告预算、客户数据和销售渠道。攻击者一旦得手不仅可以冒用品牌身份进行诈骗、发布恶意内容损害商誉更可能直接盗取广告资金、窃取客户信息甚至以账号为跳板攻击与之关联的其他企业系统。我见过太多案例企业以为社交媒体账号安全是市场部的事直到一次钓鱼攻击导致品牌声誉一夜崩塌才追悔莫及。本文要拆解的正是一种专门针对TikTok商业账号的、高度定制化的AITM钓鱼攻击链。攻击者巧妙地组合了云服务滥用、验证绕过和实时代理技术构建了一个几乎可以“以假乱真”的窃密管道。更重要的是我们不能只停留在“看热闹”的层面。作为防御方我们必须深入其技术机理理解攻击者的每一步操作和意图才能构建起有效的、可落地的全链路防御体系。这不仅仅是写几行检测规则而是从邮件网关到终端行为从身份认证到应急响应的一场立体战争。2. 攻击链深度拆解从诱饵投放到凭证收割要防御必须先理解攻击是如何发生的。这条针对TikTok商业账号的攻击链体现了现代网络犯罪的高度专业化和流程化。它不再是单点漏洞利用而是一套组合拳。2.1 攻击入口精心伪装的钓鱼邮件与链接一切始于一封邮件。攻击者通常会伪装成TikTok官方团队、广告合作伙伴、版权投诉方或内部IT部门向目标公司的市场、运营或管理层发送邮件。邮件的核心是一个链接声称是“账号异常登录通知”、“广告账户审核”、“版权侵权申诉”或“安全设置更新”诱导用户点击。这里的关键在于链接的伪装技术。攻击者不再使用一眼假的域名如tikt0k-security.com。在此类攻击中我观察到一种更狡猾的手法滥用合法的云存储服务。例如攻击者会先创建一个Google Cloud StorageGCS的存储桶并上传一个包含恶意跳转代码的HTML文件。然后他们利用GCS提供的公开访问链接格式如https://storage.googleapis.com/[bucket-name]/fake-page.html作为钓鱼链接。为什么这么做信誉高storage.googleapis.com是谷歌的官方域名信誉极高能轻易绕过许多基于域名信誉的初级邮件过滤规则。成本低且易得注册谷歌云账号有免费额度创建存储桶几乎是零成本。隐蔽性强这个链接本身并不直接托管钓鱼页面它只是一个“跳板”。真正的钓鱼页面托管在另一个攻击者控制的服务器上。GCS上的HTML文件只包含一段简单的JavaScript重定向代码将受害者无缝导向真实的钓鱼站点。这增加了检测难度因为安全设备扫描邮件中的GCS链接时看到的只是一个几乎空白的、来自可信域的页面。2.2 绕过前端防护与Cloudflare Turnstile的博弈受害者点击链接后会被引导至攻击者搭建的钓鱼网站。这个网站是对TikTok登录页面的高精度克隆从LOGO、配色、字体到布局都一模一样。但攻击者面临第一个技术挑战TikTok登录页面前端通常部署了Cloudflare Turnstile以前叫hCaptcha Enterprise等反机器人验证。Turnstile的作用是在不出现验证码挑战的情况下通过浏览器环境、用户交互行为等指标判断访问者是真人还是自动化脚本。如果被识别为机器人访问可能会被阻止或要求进行更复杂的验证。攻击者的对策不是破解Turnstile而是绕过。他们的钓鱼页面会原样嵌入TikTok真正的Turnstile组件。当受害者访问时钓鱼页面会向Cloudflare发起验证请求。由于这个请求是从受害者的真实浏览器发出的且伴有真实的人类交互点击、鼠标移动Turnstile很大概率会返回一个有效的验证令牌。关键点攻击者并不需要窃取或伪造这个令牌的验证逻辑。他们只需要将这个由受害者浏览器合法获取的令牌随受害者输入的账号密码一起提交到攻击者自己的后端服务器即可。钓鱼页面的后端服务器在收到凭证和令牌后可以立即用它们向真正的TikTok登录接口发起登录请求。此时TikTok服务器看到的是有效的凭证和有效的Turnstile令牌因此会正常处理这次登录尝试。这就完美绕过了前端的人机验证防护。2.3 核心攻击AITM中间人代理的实时窃密绕过验证后攻击进入最核心的AITM阶段。这是与传统钓鱼的本质区别。传统钓鱼受害者在假页面输入密码假页面将密码保存到攻击者的数据库。攻击者随后手动或利用脚本尝试用这些密码登录真实网站。如果用户开启了MFA攻击者就无法登录因为拿不到实时验证码。AITM钓鱼攻击者在受害者与TikTok服务器之间建立了一个实时的、双向的代理。其工作流程如下受害者在钓鱼页面输入用户名和密码。钓鱼页面的JavaScript代码将这些凭证通过WebSocket或Fetch API实时发送到攻击者控制的“代理服务器”。代理服务器立即通常在毫秒级使用这些凭证向真正的TikTok登录API发起登录请求。TikTok服务器返回响应。如果账号开启了MFA如短信验证码、认证器App码TikTok会返回一个状态要求进行二次验证。代理服务器将这个“要求MFA验证”的响应原封不动地返回给受害者的浏览器。受害者的钓鱼页面上随即弹出MFA验证码输入框与真实情况完全一致。受害者输入收到的短信或App上的6位数验证码。验证码再次被实时发送到攻击者的代理服务器。代理服务器将验证码与之前获取的凭证一起提交给TikTok完成整个登录流程。登录成功后TikTok服务器会下发会话Cookie例如sessionid,tt_chain_token等。这些Cookie也被代理服务器截获。同时代理服务器会向受害者的浏览器返回一个“登录成功”的页面甚至可能将其重定向到真实的TikTok主页让受害者毫无察觉。至此攻击者在受害者毫无感知的情况下完成了一次“完整的”登录并窃取到了用户名和密码尽管密码可能很快被修改但已不重要。有效的MFA验证码这是关键。新鲜的、具有完整权限的会话Cookie这是最具价值的战利品。有了这些Cookie攻击者可以将其导入到自己的浏览器或自动化工具中在会话有效期内可能是几天完全冒充受害者身份操作账号无需再次通过密码或MFA验证。这就是所谓的“会话劫持”。3. 技术实现关键点与攻击者工具栈理解了流程我们来看看攻击者具体需要哪些技术来实现它。这有助于我们在防御时找到可能的技术监测点。3.1 钓鱼页面克隆与动态化处理克隆一个静态登录页并不难难的是让它在交互上动态逼真。工具通常使用curl或wget下载真实登录页然后手动修改HTML中的表单提交地址actionURL和JavaScript请求端点将其指向攻击者服务器。更高级的做法是使用Python的requests、BeautifulSoup库或Node.js的puppeteer进行自动化抓取和替换。难点处理登录流程中常有动态参数如CSRF令牌、一次性nonce等。攻击者需要在钓鱼页面中编写JavaScript在用户提交时从真实页面实时获取这些参数并一同提交。或者他们的代理服务器需要能处理这些参数的回传与转发。3.2 反向代理服务器的搭建这是AITM的心脏。它需要同时处理来自受害者浏览器的请求和向TikTok官方服务器的请求。技术选型攻击者常选用Node.jsExpress http-proxy-middleware或PythonFlask/Django requests库来快速搭建。Node.js因其异步非阻塞特性在高并发转发场景下性能表现更好。核心逻辑服务器需要监听两个主要路由凭证接收端点如/submit接收钓鱼页面发来的用户名、密码。API代理端点如/api/proxy/*将所有的API请求登录、验证MFA、获取用户信息等透明地转发到https://www.tiktok.com并修改响应头中的Set-Cookie域或者直接截获Cookie内容存入数据库。一段简化的Node.js代理核心思路伪代码如下const express require(express); const { createProxyMiddleware } require(http-proxy-middleware); const app express(); // 存储窃取的凭证和Cookie const stolenData {}; // 1. 接收钓鱼页面提交的凭证 app.post(/submit, (req, res) { const {username, password} req.body; stolenData[req.session.id] {username, password}; // 立即用这些凭证向真实TikTok登录接口发起请求 proxyLoginToTikTok(username, password, req.session.id); // 给受害者返回“正在处理”的响应 res.json({status: processing}); }); // 2. 透明代理所有向TikTok的API请求 app.use(/api/proxy, createProxyMiddleware({ target: https://www.tiktok.com, changeOrigin: true, onProxyReq: (proxyReq, req, res) { // 在转发前可以注入窃取的凭证或Cookie if (stolenData[req.session.id]?.cookie) { proxyReq.setHeader(Cookie, stolenData[req.session.id].cookie); } }, onProxyRes: (proxyRes, req, res) { // 拦截响应窃取Cookie const cookies proxyRes.headers[set-cookie]; if (cookies) { stolenData[req.session.id].cookie cookies.join(; ); } // 移除或修改可能导致浏览器出问题的响应头 delete proxyRes.headers[content-security-policy]; } })); function proxyLoginToTikTok(username, password, sessionId) { // 模拟登录逻辑处理MFA挑战等 // 这是一个简化示例实际需要模拟完整登录流程 }3.3 会话管理与人机交互模拟为了维持对多个受害者的会话劫持攻击者需要管理窃取来的Cookie。存储使用Redis或数据库存储session_id - cookie的映射关系。复用通过自动化工具如Selenium、Playwright或修改浏览器配置文件加载特定的Cookie从而以受害者身份登录并执行操作如发布视频、修改信息、盗取广告资金。人机交互模拟为了避免被TikTok的反自动化系统检测攻击者在操作账号时会使用工具模拟人类行为如随机延迟、模拟鼠标移动轨迹、不规则滚动等。4. 构建全链路防御体系从感知到响应面对如此精巧的攻击单点防御必然失效。我们需要一个覆盖攻击链各环节的纵深防御体系。4.1 第一关邮件与链接安全这是最外层的防线目标是尽可能减少钓鱼邮件到达用户并阻止用户点击恶意链接。邮件安全网关增强配置SPF、DKIM、DMARC策略严格验证发件人。但针对滥用可信域名如GCS的钓鱼需要更高级的检测。URL动态分析与沙箱检测部署的安全解决方案应能对邮件中的链接进行实时点击前检测。这包括静态分析检查URL模式、域名年龄、证书信息。动态沙箱检测在隔离环境中访问该链接观察其最终跳转目标、下载内容、网络请求和DOM行为。一个指向GCS但最终快速重定向到陌生IP的页面是极高的风险指标。员工安全意识培训定期进行钓鱼演练培训员工识别可疑邮件的细微特征如发件人地址的细微拼写错误、紧迫性话术、不寻常的请求并建立清晰的内部报告流程。4.2 第二关终端与浏览器防护当链接被点击防御战场转移到终端。终端安全软件部署具备行为检测能力的EDR终端检测与响应或高级防病毒软件。它们可以监控浏览器进程的异常网络连接如向未知IP发送包含password、otp字段的POST请求、异常进程启动等。浏览器安全扩展使用信誉良好的反钓鱼扩展这些扩展维护着庞大的恶意URL数据库并能提供实时警告。网络层检测企业防火墙或安全网关应能解密并检查HTTPS流量需部署SSL证书。通过检测出站流量中是否包含向非TikTok官方域名提交登录凭证的行为可以实时阻断AITM攻击。4.3 第三关强化身份认证与会话安全这是保护账号本身的最后一道也是最关键的防线。推行强MFA/无密码认证优先使用FIDO2/WebAuthn这是目前防御钓鱼包括AITM最有效的手段。它基于公钥加密认证过程与特定域名Origin绑定。即使受害者在钓鱼网站输入了密码攻击者也无法完成WebAuthn挑战因为钓鱼网站的域名与TikTok官方域名不匹配。慎用基于推送的MFA虽然方便但用户可能在匆忙中误点“批准”。如果使用应配合数字匹配即在手机上显示一个随机码需要在电脑端输入确认来增加安全性。避免纯短信验证码短信验证码易受SIM卡交换攻击和AITM实时窃取应作为最后备选。实施严格的会话管理缩短会话超时时间强制登录会话在短时间如15-30分钟无操作后失效。绑定设备与地理位置记录常用登录设备和地点对异常的新设备或异地登录要求进行严格的二次认证。提供“登出所有设备”功能让用户在怀疑账号被盗时能一键终止所有活跃会话。持续监控账号异常活动日志分析与SIEM集中收集TikTok商业账号的后台操作日志、登录日志。通过SIEM平台建立检测规则例如短时间内从多个不同国家IP登录。登录后立即进行敏感操作如修改支付信息、绑定新邮箱。用户代理字符串异常如自动化工具特征。用户行为分析建立用户正常行为基线对偏离基线的操作如下班时间频繁登录、操作速度异常快进行告警。4.4 第四关应急响应与事后追溯假设防御失败账号已被入侵必须有预案将损失降到最低。建立明确的应急响应流程明确谁负责安全团队、市场团队、IT支持、做什么冻结账号、重置密码、审查内容、通知客户、如何沟通。定期备份账号内容与设置特别是品牌账号的头像、简介、已发布的视频列表、广告设置等以便快速恢复。法律与公关准备准备好数据泄露通知模板、对外声明口径并与法务部门协同在必要时追究攻击者责任。5. 可工程化的检测与防御代码示例理论需要实践落地。以下提供一些可集成到安全运维流程中的简单代码思路用于辅助检测。5.1 恶意链接特征识别脚本可以编写一个Python脚本作为邮件安全网关的补充对可疑URL进行快速分析。import re from urllib.parse import urlparse import whois from datetime import datetime import requests from bs4 import BeautifulSoup import time def analyze_url(url): 分析URL的潜在风险 risks [] parsed urlparse(url) domain parsed.netloc # 1. 检查是否使用短链或云存储跳板 cloud_storage_domains [storage.googleapis.com, s3.amazonaws.com, blob.core.windows.net] if any(csd in domain for csd in cloud_storage_domains): risks.append(f高风险URL使用了云存储域名 ({domain})常用于钓鱼跳转。) # 尝试访问并检查是否快速重定向 try: resp requests.get(url, allow_redirectsFalse, timeout5) if 300 resp.status_code 400: redirect_to resp.headers.get(Location) risks.append(f 该链接立即重定向至: {redirect_to}) # 进一步分析重定向目标 if redirect_to: redir_domain urlparse(redirect_to).netloc if tiktok.com not in redir_domain: risks.append(f 警告重定向目标非TikTok官方域名 ({redir_domain})) except: risks.append( 无法访问该链接进行重定向检查。) # 2. 检查域名相似度 (简易版) if tiktok in domain: if domain not in [www.tiktok.com, tiktok.com, business.tiktok.com]: # 扩展官方域名列表 risks.append(f中风险域名包含tiktok但非官方域名 ({domain})可能是仿冒。) # 3. 检查域名注册时间新域名风险高 try: w whois.whois(domain) if isinstance(w.creation_date, list): creation_date w.creation_date[0] else: creation_date w.creation_date if creation_date: age (datetime.now() - creation_date).days if age 30: # 注册时间少于30天 risks.append(f高风险域名非常新仅注册 {age} 天。) except: risks.append(无法查询域名Whois信息。) # 4. 检查URL路径中是否包含敏感关键词如login, auth, verify等 sensitive_paths re.compile(r(login|signin|auth|verify|account|security|password), re.I) if sensitive_paths.search(parsed.path): risks.append(注意URL路径中包含账户认证相关关键词。) return risks # 示例使用 if __name__ __main__: test_urls [ https://storage.googleapis.com/some-bucket/redirector.html, https://tiktok-security-verification.com/login, https://www.tiktok.com/login # 正常URL ] for url in test_urls: print(f\n分析URL: {url}) risks analyze_url(url) if risks: for risk in risks: print(f - {risk}) else: print( - 未发现明显风险特征。)5.2 钓鱼页面静态特征检测对于已获取的页面内容可以快速进行静态特征匹配。def detect_phishing_page(html_content, original_domaintiktok.com): 检测HTML内容是否为钓鱼页面 indicators [] soup BeautifulSoup(html_content, html.parser) # 1. 检查表单提交目标 forms soup.find_all(form) for form in forms: action form.get(action, ) if action and not action.startswith((https://www.tiktok.com, //www.tiktok.com)): indicators.append(f可疑表单提交地址: {action}) # 2. 检查隐藏的iframe或脚本可能用于AITM通信 iframes soup.find_all(iframe, stylere.compile(rdisplay:\s*none|visibility:\s*hidden, re.I)) if iframes: indicators.append(发现隐藏的iframe标签。) scripts soup.find_all(script, srcre.compile(rws://|wss://)) # 检查WebSocket if scripts: indicators.append(发现可能用于实时通信的WebSocket脚本。) # 3. 检查页面标题和元描述是否模仿目标 title soup.title.string if soup.title else if original_domain.replace(., ).lower() in title.lower() and login in title.lower(): # 标题包含品牌和登录关键词但需要结合其他指标判断 pass # 4. 检查大量混淆或压缩的JavaScript常见于恶意页面 script_texts [script.get_text() for script in soup.find_all(script) if script.get_text()] long_obfuscated_scripts [s for s in script_texts if len(s) 5000 and (eval( in s or fromCharCode in s)] if long_obfuscated_scripts: indicators.append(发现可能经过混淆的长JavaScript代码。) return indicators6. 防御实践中的常见陷阱与进阶思考在部署上述防御措施时有几个常见的误区需要避免。过度依赖单一防护认为部署了强MFA就万事大吉。AITM攻击恰恰证明了如果会话Cookie被窃取MFA可能被绕过。防御必须是多层次的。忽视内部威胁攻击者可能通过钓鱼先控制一个普通员工账号再以此为跳板通过内部通信工具如企业微信、Slack发送更具欺骗性的钓鱼链接给拥有更高权限的账号管理员。因此内部系统的安全意识同样重要。配置错误导致防护失效例如没有正确配置DMARC的拒绝策略preject导致伪造邮件依然可能被接收或者WebAuthn没有强制使用员工仍可选择较弱的验证方式。缺乏持续监控和演练安全策略和工具部署后便置之不理。需要定期审查登录日志、分析告警、更新钓鱼指标IOCs并定期进行红蓝对抗演练检验防御体系的有效性。进阶思考面向未来的防御随着攻击技术演进防御也需要向前看基于AI的行为分析不仅分析URL和静态内容更深度分析用户在登录前后的鼠标轨迹、击键节奏、页面停留时间等生物行为特征识别自动化脚本或受控会话的异常。零信任网络访问对TikTok后台这类关键业务应用不默认信任企业内网要求每次访问都进行严格的设备、身份和上下文认证。密码学解决方案探索使用通行密钥等完全无需密码的技术从根本上消除凭证窃取的风险。防御AITM钓鱼是一场持续的战斗。攻击者的工具在进化我们的防御视角也必须从单点保护转向覆盖“身份-设备-应用-数据”的全链路安全。对于运营TikTok商业账号的企业而言将账号安全纳入整体企业安全战略而不仅仅是市场部门的责任是当前形势下必不可少的一步。