主要发现
- 最初的入侵是通过带有 ZIP 压缩恶意 LNK 附件的鱼叉式网络钓鱼邮件实现的。
- 旨在激发好奇心的主题被广泛运用,包括航空公司电子机票、朝鲜研究活动的邀请函以及冒充国防和警察官员等。
- 当LNK文件执行时,它会通过基于环境变量的混淆命令调用批处理文件来下载额外的有效载荷。
- 使用相同基于环境变量的子字符串扩展技术的 BAT 文件按顺序执行,从而保持与 C2 服务器的通信。
- 一个扩展名为 .cat 的已编译 Python 脚本恶意软件文件从 C2 服务器下载,以执行后续活动。
- 应加强基于行为的EDR响应框架,以识别混淆和多阶段下载滥用行为。
1. 概述
Genians 安全中心发现了一起疑似与 APT37 有关的威胁活动,该活动结合了混淆的批处理文件命令调用技术和编译后的 Python 恶意软件。
这种威胁通过电子邮件以 ZIP 压缩文件的形式传播,利用鱼叉式网络钓鱼攻击,首先诱使用户执行其中包含的 LNK 快捷方式文件。当用户运行该文件时,攻击者会利用基于环境变量的子字符串扩展技术重构实际命令,然后依次下载并执行其他恶意载荷。
分析证实,威胁行为者使用了各种诱饵来吸引收件人的注意力,包括航空公司电子机票确认函、与朝鲜研究相关的活动邀请函以及冒充国防和警察部门官员,以诱使收件人执行附件操作。
当用户解压压缩文件并执行 LNK 文件时,嵌入其中的混淆命令会被触发,下载并执行一个 BAT 文件。随后,其他使用相同基于环境变量的字符串重组技术的脚本会被执行,从而继续多阶段感染流程,该流程会与 C2 服务器通信并接收后续有效载荷。
在最后阶段,恶意软件以编译后的Python字节码(.pyc)的形式下载,并伪装成.cat文件。经分析,该恶意软件是一个远程命令执行后门,它通过Python运行时环境运行。
尤其值得注意的是,本案例中观察到的基于环境变量的批处理文件混淆方法,与去年9月15日发布的“基于人工智能驱动的深度伪造军人身份信息APT攻击活动”报告中描述的方法具有相似特征。此外,在滥用C2基础设施(包括韩国Cafe24服务和法国.fr域名)的案例中也发现了类似的模式。
综合来看,此案例与国家支持的威胁组织使用的社会工程技术、脚本混淆和多阶段下载入侵结构具有很强的相似性。
因此,除了基于已识别的入侵指标 (IoC) 进行检测外,组织还需要加强基于行为的 EDR 响应能力,以识别混淆脚本执行、异常命令调用和多阶段下载活动。
【图1-1】冒充警察官员案件的攻击流程
2. 背景
APT37组织持续改进其入侵策略,将鱼叉式网络钓鱼、社会工程、脚本混淆和多阶段有效载荷下载等手段结合起来,攻击国防、安全和朝鲜相关领域的个人。该组织的组织结构此前已在多边制裁监督小组(MSMT)的一份报告中披露。
报告指出,该威胁组织被归类为与朝鲜国务委员会下属情报机构——国家安全部有关联的网络威胁组织。该组织主要针对参与朝鲜事务的个人进行恶意网络间谍活动,同时还开展支持朝鲜利益的反间谍活动。
根据去年3月的媒体报道,朝鲜已将国家安全部更名为国家情报局。此举被解读为旨在突破其现有以政权安全为中心的角色定位,加强情报搜集职能,并拓展其作为对外情报机构作用的组织架构调整。此外,据悉朝鲜于2025年9月扩充并重组了隶属于朝鲜人民军总参谋部的对外行动机构——侦察总局,并将其更名为侦察情报总局。此举被认为旨在加强其对外情报搜集能力和网络作战职能。
这两个组织名称中都包含“情报”一词,表明朝鲜正在重新定义其安全和侦察机构的职能,使其更加侧重于情报工作。这似乎不仅仅是简单的名称变更,而是反映出朝鲜在制度上正朝着更加重视情报收集、分析和作战应用的方向发展。
鉴于朝鲜的特殊性质,其内部组织结构难以从外部准确判断。此外,还必须考虑组织结构重组或人员调动的可能性。由于这些结构特点,在识别特定网络威胁行为者的支持组织或进行归因分析时,必须格外谨慎。
组织间的关系或隶属关系会随时间推移而发生变化,特定的威胁行为者可能会被重新分配到其他组织,或根据需要通过组织间合作开展行动。在这种情况下,相同的人员、工具和基础设施可能被多个组织使用。因此,仅基于恶意软件、攻击工具或基础设施特征来归因行为者可能会导致归因过程中的错误或误判。
与此同时,被认定为APT37幕后黑手的所谓“andydad”的GitHub代码库被发现自2020年起已运行约三年。该代码库中发现了多个恶意文件以及有效载荷暂存基础设施的使用痕迹。此外,还确认了导致基础设施外部暴露的运维安全(OPSEC)漏洞,并收集了大量与攻击向量相关的证据。
[图 2-1] 威胁行为者的 GitHub 代码库
当时,APT37 组织使用了多种恶意文件格式,包括 Windows 帮助文件 (CHM)、HTML 应用程序文件 (HTA)、Hancom Office 文档文件 (HWP)、Microsoft Excel 加载项文件 (XLL)、基于宏的 Microsoft Office 文档文件和 LNK 快捷方式文件。
在此期间,2025年3月20日,韩国安全公司Hauri发布了一份题为《APT37组织持续性威胁攻击》的深度分析报告。该报告指出,存在大量与APT37基础设施相关的恶意LNK文件。
当执行 LNK 快捷方式文件时,PowerShell 会在当前路径中搜索特定大小的“.lnk”文件,从指定的偏移量提取数据,将其保存为临时路径(“%TEMP%”)中的“_ms3360.bat”,并在隐藏窗口中执行它。
生成的批处理文件使用了一种混淆技术,通过基于环境变量的子字符串扩展来重构实际命令。根据变体的不同,文件名以三种形式出现:“_pK3772.bat”、“_wS1825.bat”和“ _ms3360.bat ”。
随后从C2服务器下载的“ WStemp163.cab ”文件包含一个混淆的Python脚本。该脚本插入大量类似于Windows CBS(基于组件的服务)日志的注释数据,以伪装成合法文件,而实际代码仅位于其中一部分。这种基于注释的伪装技术使得恶意逻辑难以识别。之后,该脚本从C2服务器下载并执行“MicroAppsTemp28h2.bat”文件。
在评估本案中的威胁关联时,这一背景可作为重要的比较点。
在去年报道的基于人工智能深度伪造技术的军方官员身份冒用案例中,攻击者使用“cafe24[.]com”服务发送恶意文件,并附上托管在“ versonnex74[.]fr ”上的附件链接。恶意LNK文件(位于ZIP压缩包内)执行后,攻击者会调用PowerShell脚本,随后下载并执行其他批处理文件。
在另一起类似的基于 LNK 的攻击中,攻击者冒充统一研究机构,使用了相同的“ _ms3360.bat ”文件和名称相似的“ MStemp109.cab ”文件。该攻击在策略上表现出相似性,包括使用同类混淆技术,例如基于环境变量的子字符串扩展、分支设置字符串和注释伪装的 Python 脚本。
在此案例中,还识别出一个域名为“cafe24[.]com”的发件人和一个位于法国、基于域名为“ choisy[.]fr ”的C2服务器。值得注意的是,相似之处不仅在于域名注册国家/地区,还在于它们都使用了相同的IP地址“51.158.21[.]1”。
执行流程还包括在基于环境变量的批处理脚本混淆后下载后续有效载荷。这表明,在基础设施运行、社会工程诱饵结构和初始执行技术方面,该攻击与之前观察到的威胁活动高度相似。
总体而言,该案件在战术、技术和基础设施方面与之前披露的案件具有高度连续性,并被评估为与 APT37 组织相关的威胁活动的延伸。
3. 攻击场景
该攻击活动遵循多阶段感染链,包括通过鱼叉式网络钓鱼电子邮件进行初始访问、执行压缩存档中的 LNK 文件、链式执行混淆的 BAT 脚本、连接到外部 C2 服务器以及执行基于编译的 Python 脚本的最终有效载荷。
攻击者首先发送根据收件人的兴趣和工作环境量身定制的电子邮件。
[图 3-1] 鱼叉式网络钓鱼案例截图
已识别的诱骗手段包括航空公司电子机票、与门户网站服务邮箱地址冲突的邮件、朝鲜研究相关活动的邀请函,以及冒充国防和警察官员的邮件。这些诱骗手段旨在引导用户自然而然地打开文件。
这些电子邮件通常包含一个 ZIP 压缩包,以链接或附件的形式提供。该压缩包内含一个伪装成文档的 LNK 文件。当用户解压压缩包并运行 LNK 文件时,恶意可执行文件并不会直接启动。相反,它会首先通过 cmd.exe 执行一个经过混淆处理的命令,该命令包含基于环境变量的子字符串扩展。
此过程旨在避免直接暴露实际的命令行。它结合了多个环境变量和子字符串扩展,以便最终命令仅在运行时重新构建。
重构后的命令会从远程C2服务器下载并执行一个BAT脚本。该BAT文件随后会使用类似的混淆技术扩展感染链。在最后阶段,恶意软件(以.cat扩展名的已编译Python脚本的形式)会被下载并执行。
虽然该文件使用的扩展名可能被误认为是合法文件,但它实际上是一种基于 Python 的远程控制恶意软件。通过这种恶意软件,攻击者可以执行后续操作,例如建立持久化控制、执行其他命令、收集文件以及窃取系统信息。
总而言之,这种威胁结合了旨在诱使用户执行的社会工程、基于子字符串扩展的混淆以逃避分析和检测,以及多阶段下载结构以在初始入侵后隐藏实际目标有效载荷。
4. 详细分析
4-1. 初始访问
我们已识别出用于初始传播的恶意文件的多个变种。本报告选取了4月中旬发现的最新样本作为代表性案例进行详细分析,该样本会冒充警务人员。
此次攻击采用鱼叉式网络钓鱼手段,通过电子邮件发送包含 Windows 快捷方式 (LNK) 文件的压缩包。攻击者将快捷方式文件置于压缩包内,并将其伪装成工作文档或公共机构相关资料,诱使用户执行该文件。
当用户解压存档并运行 LNK 文件时,表面上打开的是一个合法的文档,但同时在后台执行恶意命令。
在这种情况下,我们配置了一个文件名可以被识别为合法文档的诱饵文档,使其与正文一起运行,这样用户很可能会认为该操作只是打开一个文档。
该技术被分析为一种典型的社会工程方法,旨在降低用户的怀疑并提高首次执行的成功率。
尽管基于 LNK 的攻击是一种相对较老的技术,但它仍然是一种有效的初始入侵方法,被各种威胁行为者反复使用。
换句话说,需要继续保持谨慎,因为普通用户在日常工作中随意打开的文件格式可能会被滥用,并导致实际的安全漏洞。
4-2. 执行与混淆
对嵌入 LNK 文件中的命令行应用了基于环境变量的字符串重组混淆技术。
LNK 文件通过“cmd.exe /k”参数执行。它首先将一个长字符串存储在“a9390f0”环境变量中,然后使用子字符串引用语法(形式为“%a9390f0:~offset,1%))按顺序组合所需的字符来构造实际命令。
[图 4-1] 嵌入在 LNK 文件中的参数值
这种方法旨在避免直接暴露完整的执行命令。相反,命令、选项、文件路径、URL 和变量名会被拆分成单个字符,然后在运行时重新组合。
因此,在静态分析过程中,实际的执行语法难以立即识别。这导致威胁分析师或安全解决方案难以直观地理解命令的用途。
恢复原始命令后,确认 LNK 文件使用 cmd.exe 解析混淆后的字符串,最终调用了 powershell -executionpolicy bypass -command 语法。换句话说,在此阶段,cmd.exe 负责初始反混淆,而后续的文件下载和执行控制则由 PowerShell 脚本完成。
恢复的 PowerShell 语法显示,尝试将存在于正常系统路径中的 C:\Windows\System32\curl.exe 复制到 %TEMP% 路径,并将其命名为 RpJjgMB.exe。
然而,由于在路径连接过程中省略了分隔符 (),该文件实际上创建在 %LOCALAPPDATA%\TempRpJjgMB.exe。然后,复制的文件被用作后续下载工具。
【图 4-2】恢复原始命令
滥用 curl.exe(操作系统内置可执行文件)通常可以归类为 LOLBins(Living-Off-the-Land Binaries,即利用系统自带二进制文件)技术。
相比之下,后期使用的 pythonw.exe 并非 Windows 内置组件,而是包含在合法软件发行版中的可执行文件。因此,与其将其归类为 LOBin,不如将其视为通过滥用合法软件构建的执行环境更为准确。
分析证实,在 LNK 阶段,从位于韩国的 C2 服务器kmot.co[.]kr上的 board.php 路径依次下载了两个文件。
第一个文件是“사이버범죄 신고시스템(ECRM).hwp”,它伪装成一个合法的文档;第二个文件是“GuFLjO7q.bat”,这是一个用于执行后续恶意活动的批处理文件。
HWP 文件作为诱饵文件显示给用户,而 BAT 文件则单独执行,继续实际的感染流程。
换句话说,攻击者采用了双重执行结构,让用户误以为打开的是合法文档,而另一个脚本则在后台执行后续恶意活动。
4-3. 辅助有效载荷执行
通过 LNK 文件执行的 GuFLjO7q.bat 也被证实使用了基于环境变量的字符串重组进行混淆。
该批处理文件是一个脚本,设计用于在 Windows 命令解释器 (cmd.exe) 环境中运行。其内部配置用于重新组装和执行诸如 curl、mkdir、tar、del、ren 和 schtasks 之类的命令。
[图 4-3] 反混淆后的批处理文件命令
恢复后,发现批处理文件首先从合法的 python.org 网站下载“python-3.10.0-embed-amd64.zip”,将其保存到 C:\Users\Public\temp012.zip,并在后续的提取过程中使用它。
然后,它创建了 C:\Users\Public\Music\MusicLibrariesPackage 路径,并将 ZIP 文件解压到该目录中,以配置 Python Embed 执行环境。
在此过程中,python.exe 被删除,pythonw.exe 被重命名为 codeflush.exe。分析表明,此举旨在消除合法 Python 解释器的原始身份,并将其伪装成通用可执行文件。
特别是,pythonw.exe 可以在不显示控制台窗口的情况下运行,因此非常适合配置在后台运行且用户不知情的环境。
然后,批处理文件从 C2 服务器下载了另一个文件settingenv.cat。
分析证实,该文件不是合法的 Windows 安全目录 (.cat) 文件,而是 Python 字节码 (.pyc) 格式的编译文件。
攻击者使用合法的 Python Embed 包作为执行基础,并将恶意脚本伪装成 .cat 扩展名存储,从而保持了更隐蔽的整体感染流程。
这种方法对威胁行为者有利,因为它允许快速配置独立的执行环境,而无需在操作系统上正式安装单独的程序。
通过从合法的软件分发服务器获取运行时环境,这可能也有助于降低人们对网络活动本身的恶意怀疑。
4-4. 坚持
该批处理文件并非仅仅用于下载其他文件。它的主要目的是通过配置一个环境来实现持久化,使恶意载荷在感染后能够继续运行。
为了实现这一点,批处理文件创建了一个 Windows 计划任务来建立持久性。
计划任务名称被识别为 MicrosoftMusicLibrariesPackageTaskMachine。
这个名称旨在模仿合法的微软系统任务,使用户难以通过视觉识别出它是可疑的。
计划任务配置为以一分钟的间隔重复运行,执行命令结构如下。
C:\Users\Public\Music\MusicLibrariesPackage\codeflush.exe C:\Users\Public\Music\MusicLibrariesPackage\settingenv.cat |
[表 4-1] 计划任务执行命令
换句话说,该结构的设计目的是让伪装的可执行文件 codeflush.exe 定期运行,并将 settingenv.cat 作为参数传递。
这使得恶意软件能够持续重新执行,无论系统是否重启。
尤其值得注意的是,短短一分钟的执行间隔似乎是为了在进程终止、错误或用户干预等情况下快速恢复恶意活动而配置的。
4-5. Python 字节码分析
如前一分析阶段所确认,批处理文件从C2服务器下载了settingenv.cat文件并将其保存在MusicLibrariesPackage路径下。由于该文件被确定为后续执行阶段的关键组件,因此对其结构进行了分析。
尽管 settingenv.cat 根据其扩展名伪装成 Windows 安全目录文件 (.cat),但内部结构分析表明它是一个 Python 字节码 (.pyc) 格式的编译文件。
[图 4-4] settingenv.cat 文件的头部结构
Python 字节码文件(.pyc)是编译 Python 源代码生成的中间代码文件。它由 Python 解释器直接加载和执行。为了验证与执行环境的兼容性,这些文件在文件开头(即文件头)包含一个魔数和其他信息。
在 Python 3.7 及更高版本中,根据PEP 552使用了扩展的头文件结构。这里,PEP(Python 增强提案)指的是用于提出和记录 Python 语言及其标准实现的特性、结构、策略和其他方面的官方设计文档系统。
使用十六进制编辑器分析 settingenv.cat 的头部区域,确认了以下结构。
- 偏移量 0x00 ~ 0x03:6F 0D 0D 0A
- 偏移量 0x04 ~ 0x07:01 00 00 00
- 偏移量 0x08 ~ 0x0F:00 00 00 00 00 00 00 00
- 偏移量 0x10:E3(代码对象开始)
首先,文件开头的值“6F 0D 0D 0A”符合Python字节码文件的魔数格式。Python .pyc文件的魔数由四个字节组成。在CPython中,前两个字节(“6F 0D”)以小端序格式存储每个Python版本的字节码标识符值,而后两个字节(“0D 0A”)组合起来作为回车换行符(CRLF)值。
在此上下文中,CPython 指的是用 C 语言实现的标准 Python 解释器,通常指通过“python.exe”或“pythonw.exe”执行的官方 Python 发行版。
此样本中识别出的“6F 0D”值是 Python 3.10.0 的魔数值 (3439) 的小端表示,与“0D 0A”组合而成。这证实该文件要么是在 Python 3.10 系列中生成的,要么是作为专为 Python 3.10 运行时环境构建的字节码。
这也与攻击者之前下载“python-3.10.0-embed-amd64.zip”来配置Python运行时环境的行为相符。
以下值“01 00 00 00”对应于 PEP 552 中定义的 Flags 字段,该字段在 Python 3.7 中引入。此值表示该文件是基于哈希的 .pyc 文件,而不是使用基于时间戳的方法生成的文件。
然而,在这个样本中,Flags字段之后的8字节字段(通常存储哈希值或时间戳相关信息)完全被设置为“0x00”。这是一个异常结构,缺少合法.pyc文件中应有的源信息。经评估,这可能是故意移除与原始来源的链接信息,或是为了增加分析和追踪的难度。
具体来说,基于哈希的 .pyc 结构中缺少哈希值并不符合 Python 的正常行为。因此,这被解释为元数据在不影响执行的范围内被中和。
随后在偏移量 0x10 处识别出值“0xE3”,该标识符标记了 Python 封送格式中代码对象的起始位置。这意味着从该点开始包含可执行的 Python 字节码。
换句话说,经确认,“settingenv.cat”文件并非简单的数据文件,而是一个包含代码对象的编译文件,该代码对象可由Python解释器直接执行。其结构使得字节码通过先前配置的Python运行时环境(“codeflush.exe”)执行,并被分析为执行实际恶意行为的核心有效载荷。
然后从“0xE3”之后的区域提取代码对象,并执行反编译,将 Python 字节码转换为适合分析的形式。
反编译部分恢复了“settingenv.cat”文件中的Python代码。然而,字符串和主要组件整体上仍然处于混淆状态。
具体而言,代码的初始部分确定了以下特征。
[图 4-5] 反编译后的 Python 代码初始部分
反编译结果表明,“settingenv.cat”文件中的代码并没有像典型的Python代码那样直接暴露键字符串或模块名称。相反,它使用chr()函数逐个字符地构建它们,或者通过[::-1]操作恢复反转后的字符串。
__import__ 函数也没有被直接调用。相反,代码通过 getattr(__builtins__, "__import__") 的形式访问它,并动态加载所需的模块。
该代码使用了 os、base64、urllib.request、urllib.parse、sys 和 io 等模块,但所有模块名称都通过基于 chr() 的字符串构造进行了隐藏。关键分析信息,包括 C2 URL、HTTP 标头名称(Cookie 和 User-Agent)、传输参数(data)以及编码字符串(utf-8),也使用相同的方法进行了混淆处理。
[图 4-6] 恢复模糊的弦乐
这种混淆使得即使在反编译之后也很难立即理解代码的含义,并且被用来延迟基于字符串的检测和分析。
因此,我们进行了额外的分析,以恢复使用 chr() 和反转字符串操作构造的字符串,解释动态导入结构,并确定代码执行的实际功能。
经过反混淆后,发现该代码能够根据受感染系统中的用户信息生成识别令牌,与 C2 服务器通信,接收命令并执行命令。
在代码中,os.getlogin() 用于获取当前登录的用户名。然后,将获取到的值与预定义的字符串组合,并使用 Base64 编码生成令牌值。
生成的令牌值随后会包含在C2通信期间的HTTP Cookie标头中,用于识别受感染主机。然后,代码使用“urllib.request”向“kmot.co[.]kr”上的“board.php”路径发送HTTP请求,并从C2服务器接收响应数据。
接收到的响应数据被处理成 Base64 编码的 Python 代码。该代码配置为解码数据并通过 `exec()` 函数执行。执行期间,标准输出 (stdout) 被重定向到一个 `io.StringIO()` 对象,从而可以将执行结果收集为字符串。
然后,将收集到的执行结果与从远程服务器提供的命令代码一起再次进行 Base64 编码,包含在“数据”参数中,并通过 POST 发送回 C2 服务器。
分析证实,“settingenv.cat”不是一个简单的下载器,而是一个基于 Python 的远程命令执行后门,它从 C2 服务器接收命令,执行这些命令,并将结果发送回去。
这种行为提供了一种结构,允许对受感染的系统进行远程控制。其功能还可以根据C2服务器提供的Python代码进行动态扩展。
因此,经评估,该恶意软件的运行方式与 RAT(远程访问木马)家族中通常观察到的控制结构类似。
5. 威胁归因
5-1.以往的威胁案例
2020 年,APT37 组织通过在 HWP 文档文件中嵌入 OLE 对象并利用它们触发 Adobe Flash Player 中的漏洞 CVE-2018-15982 来进行攻击。
[图5-1]恶意“프로필양식 (Profile Form) .hwp”文件的传递
具体而言,OLE 对象包含一个外部 URL,用于调用利用 Flash 漏洞的文件。在此过程中,使用了 C2 服务器域名“sjem.co[.]kr”。
这套攻击基础设施并非仅使用过一次,而是在长达两年的时间里反复出现。尽管针对 Flash 漏洞的安全补丁已经发布,但在某些未应用补丁的用户环境中,同样的攻击方法仍然有效,使得威胁得以持续很长时间。
[图 5-2] Flash 漏洞调用 URL
一旦与 C2 服务器建立通信,就会执行额外的 Flash 漏洞活动,以下载存储在 OneDrive 存储库中的二进制数据,之后继续执行后续操作。
[图 5-3] 带有 CWS 签名的 zlib 压缩 SWF 文件
现阶段识别出的最后一个有效载荷“HncUpdate.exe”是一个恶意文件,具有信息窃取功能,创建于2020年11月11日01:20:09 (UTC)。根据文件中嵌入的PDB路径,它被广泛称为“Chinotto”项目。
- D:\VSWorkspace\ chinotto \Release\ Chinotto.pdb
作为参考,“Chinotto”一词指的是一种意大利柑橘类水果和用它制成的碳酸饮料。
该恶意文件试图通过 C2 服务器“ haeundaejugong[.]com ”和“ kumdo[.]org ”收集和窃取用户信息。
[图5-4]“Chinotto.pdb”字符串
当时,类似的恶意文件使用了各种 C2 基础设施,包括“ljs5950.cafe24[.]com”、“hanainternational[.]net”、“kjdnc.gp114[.]net”、“luminix[.]kr”、“sunlin[.]org”、“ezvm[.]kr”和“intobiz[.]kr”。
[图 5-5] 2022 年使用的攻击邮件
攻击者使用了多种类型的恶意文件,包括 DOCX、HWP 和 EXE 文件,以及多个 C2 服务器。对不同案例和威胁基础设施的比较揭示了显著的相似之处。
主题 | 类型 | C2 | IP |
'andydad'의 GitHub 上 | chm | attiferstudio[.]com /install.bak/sony/10.html | 121.78.88 [.]93 |
평화 연구원 사칭 | EXE文件 | haeundaejugong[.]com /editor/ chinotto / do.php | 121.78.88 [.]88 |
서울 유엔 인권 사무소 사칭 | docx | sunlin[.]org /adm/phpMyAdmin/info/ style.php | 211.169.73[.]104 |
민주평통 사무처 사칭 | hwp | hanainternational[.]net /editor/data/ font.php | 121.78.88 [.]92 |
경찰 수사관 사칭 | EXE文件 | intobiz[.]kr /bbs/data/bbs62/ blog.php | 121.78.88 [.]93 |
[表 5-1] 按攻击类型划分的 C2 服务器比较
在三个执行 C2 功能的 PHP 文件中发现了一种常见的字符串隐藏技术。密钥字符串并非直接以明文形式存储,而是声明长度相同的虚拟字符串,并使用 `[System.Text.Encoding]::UTF8.GetBytes()` 将其转换为字节数组。
然后,对于数组中的每个索引,对两个整数常量进行异或 (XOR) 运算,以恢复构成实际字符串的字节值。此操作针对字符串的长度重复进行。
[图 5-6] XOR 字符串混淆的相似性比较
最终,通过“GetString()”调用将恢复的字节数组重新构建为字符串,并且此过程仅在运行时执行。
5-2.重复使用同一账户的证据
2026 年 4 月,在威胁行为者冒充警察调查员时使用的文件中,发现了诱饵文件“사이버범죄 신고시스템(ECRM).hwp”。
[图 5-7] 诱饵文件中记录的“Lailey”账户名称
HWP 文档最后一次保存是在 2026 年 4 月 17 日星期五上午 11:00:10,最后一次保存的帐户记录为“ Lailey ”。
同一个“Lailey”账户此前也曾在2022年攻击中使用恶意文件,冒充韩国国家统一咨询委员会秘书处和首尔联合国人权办公室。
5-3. PHP Webshell 相似性比较
经确认,2022 年在“ hanainternational[.]net ”注册的 webshell和 2026 年从“ printory[.]kr ”下载编译后的 Python 字节码 (.pyc) 形式的恶意软件的 webshell属于同一类型。
2021 年,在冒充朝鲜脱北青年招生和学术专业博览会的网络钓鱼攻击中,托管在“ udcontest[.]com ”上的 webshell也呈现出相同的形式。
[图 5-8] Webshell 比较
当时使用的“udcontest[.]com”域名解析到的IP地址为“ 114.207.246[.]156 ”。
该 IP 地址还与“ ableinfo.co[.]kr ”域相关联,并被用作分发恶意文件的基础设施,类似于在所谓的“andydad”GitHub 存储库中发现的 CHM 和 LNK 类型。
[图 5-9] C2 服务器托管恶意文件
5-4.威胁基础设施关联
在对此次威胁活动进行调查的过程中,我们发现其与之前案例中分析的各种基础设施存在诸多相似之处。不仅攻击中使用的C2基础设施存在一致的模式,恶意软件行为、文件结构以及投放器和加载器链等独特的技术特征也存在一致性。
[图 5-10] 相关性图
威胁行为者似乎不断更改基础设施细节,包括域名、IP 地址、文件名和分发路径,以掩盖过去的活动痕迹。
尽管发生了这些变化,但在特定的批处理脚本执行方法、配置文件结构、中间加载文件的使用以及感染链的分阶段结构中,仍然反复观察到有意义的共同点。
这表明这些攻击活动并非仅仅是更换基础设施,而是可能基于相同或类似的攻击框架或开发资源持续进行。尤其值得注意的是,某些C2服务器IP地址范围、文件打包方法以及特定用途诱饵文件的使用模式,都与之前的案例存在密切关联。
因此,尽管此次攻击活动的外部基础设施发生了变化,但根据其内部结构和操作方法的一致性,极有可能此次攻击活动是由同一威胁行为者或相关组织实施的。
6. 结论
6-1. 威胁活动结论
经证实,该威胁是由 APT37 发起的攻击活动,通过电子邮件网络钓鱼诱使用户执行 ZIP 压缩包中的恶意 LNK 文件,然后通过混淆的命令调用和多阶段有效载荷下载执行基于 Python 的后门。
攻击者利用反映目标用户工作环境和兴趣的诱饵,例如航空公司电子机票、朝鲜研究活动的邀请函以及冒充国防和警察官员等,来降低用户的警惕性。当用户执行 LNK 文件时,该文件看似显示合法文档,但实际上,攻击者会在后台通过“cmd.exe”和 PowerShell 重建基于环境变量的子字符串扩展命令,随后下载并执行后续的 BAT 文件。
具体而言,该攻击活动被发现复制了合法的 Windows 组件“curl.exe”,并将其用作下载工具。它还下载了合法的 Python Embed 软件包,以配置一个独立的运行时环境,并将“pythonw.exe”重命名为“codeflush.exe”,然后利用该运行时环境执行伪装成“.cat”扩展名的已编译 Python 字节码。经评估,这是一种试图通过滥用合法工具和合法软件运行时环境来降低被安全解决方案检测到的可能性的攻击行为。
使用定时任务重复执行恶意Python字节码也清楚地表明了攻击者意图在受感染系统上建立持久化控制。最终的有效载荷“settingenv.cat”已被证实是一个远程命令执行后门,它从C2服务器接收额外的命令,执行这些命令,并将结果发送回服务器。
考虑到这些特点,应对这种威胁不仅需要基于入侵指标 (IoC) 的检测,还需要对整个攻击链进行基于行为的分析,包括以下内容:
- 执行压缩包内的 LNK 文件
- 链接调用“cmd.exe”和 PowerShell
- 基于环境变量的子字符串扩展混淆
- 使用“curl.exe”进行外部下载
- 在公共用户路径下创建 Python 运行时环境
- 重命名“pythonw.exe”并执行扩展名异常的文件
- 通过计划任务实现持久性
- 通过 C2 服务器接收和执行动态 Python 代码
因此,各组织应加强以EDR为中心的响应框架,使其能够全面检测威胁行为者的战术、技术和流程(TTP),涵盖从初始交付和执行到后续有效载荷下载、持久化、C2通信以及远程命令执行的各个环节。尤其值得注意的是,域名、IP地址、文件名和文件扩展名都可能轻易更改。因此,组织不应仅仅依赖单一的入侵指标,还应基于进程执行关系、命令行模式、文件创建位置、计划任务创建以及合法工具滥用等关联性,开展检测和威胁搜寻工作。
6-2. 采用“Genian Insights E”的综合响应策略
经证实,此次威胁是一种复杂的攻击,它结合了社会工程、滥用合法工具(LOLBins)、混淆脚本、多阶段下载以及基于Python的后门程序。因此,以EDR为中心的集成安全框架至关重要,它能够可视化整个攻击流程,从初始执行到持久化、C2通信以及后续命令执行,并基于事件之间的关联性进行检测和响应。
“ Genian Insights E ”是一个基于单代理的集成端点安全平台,它通过以下功能支持对各种威胁进行有效响应。
- LNK 执行后“cmd.exe”到 PowerShell 调用流程
- 执行基于环境变量的子字符串扩展命令
- 使用“curl.exe”进行外部下载
- 基于“pythonw.exe”的异常执行
- 创建并重复执行计划任务
- 基于特征码的已知恶意软件及其变种的检测和拦截
- 基于安全 IoC 快速识别现有感染
- 阻止文件加密行为以及自动备份和恢复
- 最大限度减少未来类似攻击中可能造成的额外损害
- 通过控制 USB 设备和外部存储介质的使用,防止内部信息泄露。
- 限制感染后传播途径
通过基于行为的分析,EDR 可以立即检测到可疑 LNK 文件在特定端点上使用压缩工具创建的初始交付阶段。它还能提供 LNK 文件执行时使用的参数信息。
[图 6-1] 通过 EDR 检测可疑 LNK 文件
“Genian Insights E”中的“攻击故事线”功能允许分析人员根据命令行轻松识别 LNK 文件执行了哪个批处理文件命令。
这些信息可以帮助安全管理员分析通过 EDR 的威胁流。
[图 6-2] 命令行查找屏幕
分析人员还可以识别 PowerShell 命令的行为,并按顺序分析后续活动,其中“curl.exe”被重命名为“TempRpJjgMB.exe”,并用于尝试从 C2 服务器下载其他文件。
尽管在分析时并未与 C2 服务器进行通信,但相关尝试本身仍然可以通过基于行为的事件日志得到确认。
[图 6-3] 通过 PowerShell 和“curl.exe”连接 C2
通过这一系列基于行为的分析数据,EDR 管理员可以直观地了解从初始攻击到后续活动的整个攻击流程,从而为快速准确地识别威胁提供基础。
7. 入侵指标 (IoC)
255155bad9af5e2c6cf550ff2a95219d
abbb362cdfe14b56b3a13a2a55937ee4
b5f9cd67cb32f44c138c382e17b06fd6
f7b2e0cebd7793c8cfee2c7c5b93df9c
FCB97F87905A33AF565B0A4F4E884D61
1aa7751332710f4e963a708243d3d550
09dabe5ab566e50ab4526504345af297
16d7be5ebc3c2ff1cffbb83b965fd4fb
33c97fc4eacd73addbae9e6cde54a77d
804d12b116bb40282fbf245db885c093
7922f91281e8b0fe00518d05bf295b4a
oxenhan1.cafe24[.]com
kmot.co[.]kr
ycpatent.co[.]kr
印刷厂[.]kr
fe01.co[.]kr
choisy[.]fr
51.158.21[.]1
183.111.174[.]69
211.239.157[.]126
218.150.78[.]198
220.73.160[.]23