疑似Lazarus组织针对韩国的攻击活动分析
· 3 分钟阅读 · @admin

Lazarus组织,又称HIDDEN COBRA、APT38、Zinc、Guardians of Peace等,是朝鲜半岛地区最活跃的APT组织之一。该组织的攻击目标涉及波兰、智利、美国、墨西哥、巴西等数十个国家,主要针对银行、比特币交易所等金融机构及个人实施定向攻击活动,以获取经济利益,堪称全球金融机构的最大威胁之一。
此外,该组织还针对航空航天、COVID-19疫苗技术、政府、媒体等关键领域的机构及企业进行渗透,窃取重要资料并实施破坏性勒索攻击。本文详细分析了Lazarus组织针对韩国的一次攻击活动,从诱饵文档到最终载荷的完整攻击链。
二、攻击链详细分析
2.1 诱饵文档分析
SaniTox是韩国Jiransecurity公司的一款反病毒程序,攻击者伪造SaniTox相关文档以骗取受害者信任,并诱导其启用宏功能执行恶意代码。

文档主题为“如何进入网络教室的操作手册”,利用社会工程学诱导受害者执行恶意宏:

该诱饵文档采用了远程模板注入技术。当受害者打开文档时,文档会自动加载远程模板文件,然后执行模板中的恶意宏代码,最终下载并执行IEUpdate.exe:

2.2 远程模板分析
远程模板包含恶意宏代码,主要功能是从远程服务器下载恶意文件并注入到WinWord进程中执行。
当远程模板被加载时,首先执行Auto_Open函数。该函数会检测文档是否在沙箱环境中打开,如果是则关闭文档;否则从远程服务器下载恶意文件并注入到WinWord进程。
如果注入失败,则弹出错误提示;注入成功则隐藏诱导启用宏的页面,显示“如何进入网络教室的操作手册”的正常内容以迷惑受害者:

此外,宏代码还实现了备用触发机制。当Auto_Open函数执行失败时,可通过WindowsMediaPlayer控件状态改变事件触发恶意代码,其主要逻辑与Auto_Open函数类似:

2.2.1 沙箱检测技术
恶意代码通过比较短时间内的Tick值来检测沙箱环境。如果差值小于50,则判定处于沙箱环境中并退出执行:

2.2.2 文件下载
根据系统架构(Win32/Win64)下载不同版本的恶意文件。下载的文件数据采用Base64编码,解码后将文件注入到WinWord进程中:

2.2.3 进程注入技术
宏代码实现了针对x86/x64进程的注入功能。与其他恶意软件类似,使用经典的进程挖空(Process Hollowing)技术:创建挂起状态的进程,将恶意代码写入目标进程内存,然后修改线程上下文将EIP/RIP指向注入代码的入口点。
注入过程中使用的关键API函数:

首先获取当前打开文档的WinWord进程路径,然后以该路径创建一个处于挂起状态的傀儡进程:

成功注入文件后,修改线程上下文的EIP/RIP为文件的入口点地址,当恢复线程时从入口点开始执行恶意代码:

注入的文件主要用于释放恶意程序IEUpdate.exe并执行,同时添加到注册表Run键实现持久化。由于下载链接已失效,未能获取到该阶段的有效样本进行深入分析。
2.3 IEUpdate下载器分析
该文件由注入到WinWord进程的Shellcode释放并执行,主要作为下载器从C&C服务器下载不同的恶意模块。
2.3.1 沙箱检测
检测Windows Defender虚拟引擎
判断自身模块名是否为“myapp.exe”,如果是则退出进程。这是Windows Defender虚拟机引擎在模拟执行恶意程序时使用的默认文件名:

Tick值检测
检测不同时间点的Tick值差是否小于50,如果小于则判定为沙箱环境并退出程序:

2.3.2 生成受害者标识符
恶意程序通过向系统硬盘设备发送IOCTL代码0x2D1400来获取设备序列号,并与字符串“VDEVICE”组合,然后使用自定义的CRC哈希算法计算哈希值。该哈希值与用户名一起作为受害者的唯一标识符:

自定义哈希算法实现:

2.3.3 权限检测
通过尝试在系统目录下创建目录来判断是否具有管理员权限:

2.3.4 检测韩国安全产品
获取进程快照,判断当前运行的进程中是否包含以下安全软件:
v3l4sp.exe:韩国AhnLab公司免费杀毒软件V3 Lite的组件AYAgent.aye:韩国ESTsoft公司互联网安全套件ALYac的组件IEUpdate.exe:检测自身进程

2.3.5 防止重复运行
检测路径“%LocalAppData%\Microsoft\PlayReady\IEUpdate.exe“的进程是否已经运行。如果已运行且PID与当前进程不同,则结束先前的进程实例:

2.3.6 命令行参数检测
(此部分在原样本中未实现具体功能)
2.3.7 添加Windows Defender白名单
如果恶意进程以管理员权限启动,则调用PowerShell命令将自身添加到Windows Defender白名单中,以规避杀毒软件检测:

2.3.8 获取C&C地址
从error.log文件中读取数据,与“dl.dropboxusercontent.com”拼接得到存放在Dropbox公共托管服务上的C&C地址文件URL,通过GET请求获取该URL以获得最终的C&C服务器地址:

2.3.9 发送上线包
将受害者的操作系统版本信息、是否存在安全软件、生成的标识符等信息作为上线包上传到C&C服务器的post2.php路径:

2.3.10 获取C&C指令
通过GET请求从拼接后的URL获取数据。读取数据中第三个’%’字符后的内容,以“\r“或”\n“作为结束符,解析其中的阿拉伯数字作为指令ID:

2.3.11 文件下载与执行
接收C&C服务器下发的指令,解析出指令ID和文件下载地址。使用GET请求下载文件,然后将其映射到内存并加载执行。根据指令ID调用导出函数“SEStart”或“SEEnd”:

2.4 hvncengine.dll模块分析
该模块由IEUpdate从C&C服务器下载。HVNC全称为“Hidden Virtual Network Connection”(隐藏虚拟网络连接),主要用于银行木马中实现隐蔽的远程控制。
VNC是一种常见的远程桌面管理软件,可远程控制目标计算机。然而,传统VNC在操作图形化界面时容易被受害者发现。对于金融相关业务,由于存在数字证书、双因素认证等安全机制,攻击者需要在受害者机器上直接操作才能绕过身份认证。因此,攻击者开发了HVNC技术,在隐藏桌面上执行操作,使受害者无法察觉。
2.4.1 样本描述
IEUpdate下载的恶意模块都包含SEStart和SEEnd两个导出函数:
- SEStart:通过Socket实现HVNC功能
- SEEnd:关闭Socket连接、结束管道句柄和后门逻辑线程
模块使用与IEUpdate相同的算法生成受害者标识符。
2.4.2 检测主逻辑线程
成功生成标识符后,恶意程序检测核心功能线程是否已在运行,避免重复创建线程。如果线程正在执行则不创建新线程;如果线程因异常未正常结束,则先结束该线程再创建新线程执行主要逻辑代码:

2.4.3 执行HVNC线程
每隔10分钟执行一次恶意代码,只有在主模块调用SEEnd函数后才会结束循环。在hvnc_thread线程函数内执行一系列与HVNC相关的功能:

2.4.4 执行HVNC功能
使用前面生成的标识符为名称创建一个新的隐藏桌面。在后续涉及桌面的操作时,使用SetThreadDesktop函数指定隐藏桌面,使相关操作在该隐藏桌面下执行,从而对受害者不可见。
在创建进程时,设置STARTUPINFO结构体的lpDesktop字段为隐藏桌面句柄,使进程在隐藏桌面下执行:

2.4.5 C&C通信
读取位于“%LOCALAPPDATA%/Microsoft/PlayReady“目录下的error.log文件,将数据与”dl.dropboxusercontent.com“拼接,得到存放于Dropbox托管服务中的实际C&C地址文件URL。通过GET请求该地址获取C&C服务器地址,然后通过Socket与其建立通信:

如果Socket成功连接,则发送上线数据包并等待C&C服务器下发指令。上线数据包构造如下:

用伪代码表示的数据包格式:
struct packet_format
{
// 固定魔术头 ")(*&POIU:LKJ"
uint8_t magic_start[0xc];
// 存放加密的数据 "D9 C8 CC CB EB C9 D9 C8"
// 解密后的值为 "00000000"
uint8_t unknown[0x8];
// 数据包类型,0表示上线包
uint32_t type;
// 标识符的大小
uint32_t id_size;
// 标识符字符串
uint8_t id_str[id_size];
// 固定魔术尾 "^%$#YTREHGFD"
uint8_t magic_end[0xc];
};
当C&C服务器下发指令时,恶意程序首先读取12字节判断是否为magic_start字符串,如果是则继续读取指令剩余部分,否则继续等待接收:

C&C通信指令表:
| 指令ID | 功能描述 |
|---|---|
| 0x01 | 持续发送截图数据 |
| 0x02 | 停止发送截图数据 |
| 0x03 | 执行下发的命令 |
| 0x05 | 模拟键盘操作 |
| 0x06 | 模拟鼠标操作 |
| 0x07 | 执行explorer.exe |
| 0x08 | 执行Chrome浏览器 |
2.4.6 屏幕截图功能
恶意程序使用两个与屏幕截图相关的指令:
- 指令0x01:持续对屏幕进行截图并发送到C&C服务器,每隔200ms截图一次。如果与服务器通信失败或screen_shot_flag值为0,则退出截图
- 指令0x02:设置screen_shot_flag值为0,表示即将结束截图
截图过程:首先遍历所有桌面,找到受害者正在使用的桌面,然后针对该桌面创建BitBlt对象并转换成图像流数据,即对受害者使用的桌面进行截图。为了将截图数据上传到C&C服务器,从流中读取数据并保存:

截图完成后,构造发送给C&C的数据包,使用固定的包格式:

数据包格式定义:
struct packet_format {
// 固定值 ")(*&POIU:LKJ"
uint8_t magic[0xc];
// 固定值 "00000000"
uint8_t unknown;
// 包类型,4表示截图数据
uint8_t type;
// 截图相关数据大小
uint8_t img_info_size;
// 截图信息结构体,大小为img_info_size
struct {
// 屏幕宽度
uint32_t width;
// 屏幕高度
uint32_t height;
// 屏幕截图数据的大小
uint32_t img_data_size;
// 屏幕截图数据
uint8_t img_data[img_data_size];
}
// 固定值 "^%$#YTREHGFD"
uint8_t magic_end[0xc];
};
2.4.7 执行任意命令
当接收到C&C指令ID为3时,执行任意命令。要执行的命令包含在C&C指令参数中,通过创建进程并将命令行参数设置为服务器下发的命令来执行。为了避免被受害者发现,将STARTUPINFO结构体的lpDesktop字段设置为隐藏桌面:

2.4.8 键盘模拟
当C&C指令ID为5时,模拟键盘操作。主要通过向目标窗口发送WM_KEYUP、WM_KEYDOWN和WM_CHAR消息来模拟所有按键操作。操作的窗口对象通过窗口位置获取,最后通过PostMessageA将消息发送到目标窗口:

2.4.9 模拟鼠标操作
攻击者使用HVNC功能操作桌面时,需要对桌面窗口进行各种操作。恶意程序通过向指定窗口发送窗口消息来实现操作,操作类型和所需参数由C&C服务器下发。恶意程序利用消息机制模拟了多种鼠标操作,包括拖拽窗口、单击、双击、滚轮滑动等。
模拟拖拽窗口
通过修改目标窗口对象的left、top、width和height四个值来实现窗口放大、缩小和移动功能:

模拟点击菜单项
恶意程序判断当前鼠标位置是否在任务栏的开始菜单范围内:
- 如果在,则发送WM_CLICK消息模拟点击开始菜单
- 如果不在,则判断鼠标是否在窗口类名为“#32768“的窗口控件中(该控件为菜单栏)。如果鼠标位置在菜单栏范围内,则模拟点击菜单项
具体实现:首先发送MN_GETHMENU消息获取菜单对象句柄,然后通过菜单句柄获取当前鼠标指向的菜单项对应的菜单资源ID,最后发送MN_SELECTITEM和WM_KEYDOWN消息模拟点击菜单项:

2.4.10 执行Explorer.exe
使用HVNC进行远程操作时,可能会出现界面不显示或其他异常。攻击者通过让目标机器执行explorer.exe程序来恢复正常状态。
首先设置注册表键TaskbarGlomLevel的值为2使任务栏使用“永不分组”模式,然后启动explorer进程。进程创建成功后,将任务栏设置为AlwaysOnTop,并恢复TaskbarGlomLevel为修改前的值:

2.4.11 执行Chrome浏览器
调用cmd程序执行Chrome浏览器,并关闭浏览器中比较消耗CPU性能的特性(如sandbox、GPU加速等),避免CPU使用率过高而被受害者发现。
启动浏览器时使用受害者默认的配置目录(User Data目录)。这样在访问需要账号登录的网站时,如果受害者设置了记住密码或保持登录状态,攻击者无需账号密码就能获取受害者的账号信息:

2.4.12 消息发送机制
在所有C&C指令中,只有键盘模拟和鼠标模拟需要发送窗口消息。恶意程序首先通过窗口位置获取对应的窗口对象,然后将参数转换为发送消息时对应的参数值,最后通过PostMessageA发送给目标窗口。
对于WM_CHAR消息,还需要将对应字符转换为Virtual Key值,同样使用PostMessageA发送给目标窗口对象:

三、ATT&CK映射矩阵
| 战术(Tactic) | 技术ID | 技术名称 | 描述 |
|---|---|---|---|
| Resource Development | T1583.006 | Acquire Infrastructure: Web Services | 利用Dropbox存放C&C地址 |
| Initial Access | T1566.001 | Phishing: Spearphishing Attachment | 通过鱼叉式钓鱼邮件投递恶意文档 |
| Execution | T1559 | Inter-Process Communication | 利用管道执行cmd命令 |
| T1204 | User Execution | 通过诱饵文档诱导用户执行恶意宏 | |
| Persistence | T1547 | Boot or Logon Autostart Execution | 设置注册表Run键实现自启动 |
| Privilege Escalation | T1055 | Process Injection | 将恶意代码注入到WinWord进程 |
| Defense Evasion | T1497 | Virtualization/Sandbox Evasion | 检测沙箱和虚拟化环境 |
| T1221 | Template Injection | 使用远程模板注入技术 | |
| T1562 | Impair Defenses | 将自身添加到Windows Defender白名单 | |
| Discovery | T1010 | Application Window Discovery | 查找窗口以便HVNC远程控制 |
| T1083 | File and Directory Discovery | 收集文件和目录信息 | |
| T1057 | Process Discovery | 检测安全软件进程 | |
| T1012 | Query Registry | 查询注册表键值 | |
| Collection | T1113 | Screen Capture | 收集屏幕截图 |
| T1056 | Input Capture | 捕获键盘输入 | |
| Command and Control | T1071 | Application Layer Protocol | 使用Socket协议进行C&C通信 |
四、总结
本次攻击活动展现了Lazarus组织高度成熟的攻击能力:
- 社会工程学:利用韩国本地化内容(网络教室操作手册、SaniTox安全软件)提高攻击成功率
- 多层免杀:结合远程模板注入、进程挖空、白名单添加等技术规避安全检测
- 针对性对抗:专门检测韩国主流安全产品(AhnLab V3 Lite、ALYac)
- 隐蔽性控制:使用HVNC技术在隐藏桌面执行操作,避免被受害者发现
- 基础设施:滥用Dropbox等合法云服务存储C&C地址,增加溯源难度
该攻击活动充分体现了APT组织针对特定地区、特定目标的精确打击能力,值得安全从业人员深入研究和防范。

