此次攻击活动的攻击流程大致如下所示:
1.采用模板注入的方式,等待诱饵文档被打开后将攻击者构造的恶意模板下载到主机执行。
2.模板中的宏代码请求指定的URL,下载恶意载荷并将其注入到WINWORD.exe中执行。
3.下载到的恶意载荷主要用于释放下载工具IEUpdate.exe并执行,以及将其添加至注册表RUN中实现持久化。
4.IEUpdate.exe得到执行后发送消息获取后续通信使用的C2,根据回传的信息下载不同恶意载荷执行。
5.目前已知存在两种载荷hvncengine.dll和shellengine.dll,用于与C2通信以实现远程控制。
图2‑1 攻击流程示意图
3.1 诱饵文档
病毒名称 |
Trojan/Generic.ASHMacro.7D6 |
原始文件名 |
Sogang KLEC.docx |
MD5 |
f1a61ee026eac8583ee840d297792478 |
文件大小 |
13.25 MB (13889306 bytes) |
文件格式 |
Office Open XML Document |
利用漏洞 |
无 |
释放手法 |
远程模板注入 |
创建时间 |
2022-04-06 8:40:00 UTC |
最后编辑时间 |
2022-08-05 2:40:00 UTC |
创建者 |
无 |
最后保存者 |
exciting |
正文国家语言 |
ko-KR |
VT首次上传时间 |
2022-08-16 21:05:35 UTC |
VT检测结果 |
16/65 |
通过公开情报平台的关联功能发现诱饵文档的下载链接,信息说明诱饵文档是在Naver Mail提供的大附件存储站点下载得到,猜测攻击者可能通过Naver Mail发送钓鱼邮件进行攻击。已知Naver Mail是由韩国互联网集团Naver Corporation提供的电子邮件服务。
图3‑1 诱饵文档下载链接
SaniTOX为韩国Jiransecurity公司的一款安全防护软件,诱饵文档仿冒SaniTOX诱导受害者启用宏,恶意文档正文内容如下。
图3‑2 此次攻击活动诱饵文档正文内容
对文档正文内容关联后发现,诱饵文档正文内容并非第一次出现。
攻击者使用Word模板注入的方式,在受害者打开诱饵文档后下载恶意模板执行,模板所在的地址为http://23.106.160.173/temp2.dotm。
图3‑4 远程模板链接
3.2 模板文件
表3‑2 模板文件
病毒名称 |
Trojan/Generic.ASMacro.36F1B |
原始文件名 |
D5583E63.dotm |
MD5 |
8D7C3F3C56AD3069908901790ADFA826 |
文件大小 |
68.12 KB (69755 bytes) |
文件格式 |
Office Open XML Document |
利用漏洞 |
无 |
释放手法 |
宏文档 |
创建时间 |
2022-07-31 2:45:00 UTC |
最后编辑时间 |
2022-08-03 14:48:00 UTC |
创建者 |
exciting |
最后保存者 |
exciting |
VT首次上传时间 |
2022-08-16 21:13:22 UTC |
VT检测结果 |
37/65 |
模板中包含恶意宏代码,当打开文档后自动执行。宏代码主要功能为下载恶意载荷,若成功下载,便将下载到的恶意载荷注入到Winword程序中执行。
图3‑5 下载恶意载荷
此函数将下载的恶意载荷注入到WinWord中执行。
图3‑6 注入函数
注入到Winword进程中的恶意载荷运行后会在%LocalAppData%MicrosoftPlayReady下释放IEUpdate.exe和error.log文件,之后通过fodhelper.exe绕过UAC提升IEUpdate.exe权限执行,error.log文件中记录了后续所需要访问的部分URL链接“s/ucnpe74wo87d3mm/server.txt?dl=0”。
图3‑7 恶意载荷释放的文件以及error.log中的内容
修改注册表启动项实现持久化功能。
图3‑8 将IEUpdate.exe文件添加到注册表RUN中
3.3 IEUpdate.exe 下载工具
表3‑3 二进制可执行文件
病毒名称 |
Trojan/Generic.ASMalwS.2D |
原始文件名 |
IEUpdate.exe |
MD5 |
c073012bc50b6a4f55f8edcce294a0b4 |
处理器架构 |
Intel 386 or later, and compatibles |
文件大小 |
92.00 KB (94208 bytes) |
文件格式 |
Win32 EXE |
时间戳 |
2022-08-03 03:27:06 UTC |
数字签名 |
无 |
加壳类型 |
无 |
编译语言 |
Microsoft Visual C++ v.11 – 2012 |
VT首次上传时间 |
2022-08-16 21:13:22 UTC |
VT检测结果 |
49/72 |
首先判断自身所处路径是否包含“:myapp.exe”,若包含则退出。
图3‑9 判断自身所处路径
通过sleep设置延迟时间,判断延迟时间是否生效,以此绕过部分修改sleep时间的沙箱。
图3‑10 沙箱检测
获取主硬盘的设备描述信息,并将其与“VDEVICE”进行拼接,拼接后的字符串通过CRC散列后与“0”进行拼接,格式为“0+CRC散列后的值”。
图3‑11 获取主机信息并生成主机标识
通过在系统目录下创建目录,判断其是否具有管理员权限。
图3‑12 权限判断
获取操作系统的版本信息。
图3‑13 获取操作系统版本信息
获取进程快照,并判断当前运行的进程中,是否包含“v3l4sp.exe”、“AYAgent.aye”、“IEUpdate.exe”。其中“v3l4sp.exe”为韩国AhnLab公司免费杀毒软件V3 Lite的子程序,“AYAgent.aye”为韩国公司ESTsoft的互联网安全套件ALYac的一部分。
图3‑14 检测指定杀软
如果存在路径为“%LocalAppData%MicrosoftPlayReadyIEUpdate.exe”且进程ID与当前进程不符,则关闭先前的IEUpdate.exe进程。
图3‑15 关闭先前进程
根据cmdline的参数中是否包含“/s”、“/a”来设置标记,并根据先前设置的管理员权限标记选择不同分支执行。
图3‑16 根据参数设置标记
判断先前的提权操作是否成功。如果为管理员权限,则会通过PowerShell命令将自身添加到Windows Defender排除列表中。
图3‑17 将此文件添加到Windows Defender白名单
如果非管理员权限,创建新线程并循环执行,具体如下所示。
图3‑18 创建线程
线程创建另一个线程函数,该线程函数用作同C2进行通信。
首先将“dl.dropboxusercontent.com”与从error.log文件中获取到的内容进行拼接,并从拼接后形成的URL中获取接下来通信的C2地址。
图3‑19 从Dropbox中获取C2地址
然后将操作系统版本信息、是否存在指定的杀软、先前生成的uid作为上线包回传。
图3‑20 构造上线包
上线包回传函数,将收集到的信息发送到post2.php。
图3‑21 发送上线包
随后从拼接的URL中接收数据,并对数据进行处理,获取数据中第三个“%”后的内容,并以“r”、“n”作为结束符。此内容将作为后续下载URL的资源地址。获取数字0-9的阿拉伯数字,经处理后得到指令ID。
图3‑22 发送请求并接收C2的命令
循环执行下发的命令,并会判断是否重复执行。
图3‑23 执行C2下发的命令
下载dll文件并选择导出函数执行。
图3‑24 下载后续载荷执行
通过公开情报平台查找上述样本的信息,在诱饵文档关联的PCAP文件中发现两个文件,应为IEUpdate.exe下载的恶意载荷,它们具有相同的回传数据结构与解密算法。
到数据头的偏移 |
长度 (byte) |
解释 |
0x0 |
0xC |
固定数据,解密后为)(*&POIU:LKJ |
0xC |
0x8 |
固定数据,按需可替换为接收的数据 |
0x14 |
0x4 |
该部分数据,根据执行的内容决定 |
0x18 |
0x4 |
回传数据的长度(size) |
0x1C |
size |
回传的数据 |
0x1C+size |
0xC |
固定数据,解密后为^%$#YTREHGFD |
在回传文件的过程中,回传数据结构会有适当调整,具体如下图所示。
到数据头的偏移 |
长度 (byte) |
解释 |
0x0 |
0xC |
固定数据,解密后为)(*&POIU:LKJ |
0xC |
0x8 |
固定数据,按需可替换为接收的数据 |
0x14 |
0x8 |
整体文件大小 |
0x1C |
0x4 |
文件路径长度 |
0x20 |
size1 |
文件路径(size1) |
0x20+size1 |
0x8 |
当前文件指针的位置 |
0x28+size1 |
0x4 |
当前读取文件内容的大小(size2) |
0x2C+size1 |
size2 |
读取的文件内容 |
0x2C+size1+size2 |
0xC |
固定数据,解密后为^%$#YTREHGFD |
“)(*&POIU:LKJ”与“^%$#YTREHGFD”在键盘上的位置如下图所示。
图3‑25 回传数据结构中的固定内容在键盘上的位置
3.4 hvncengine.dll hvnc
病毒名称 |
Trojan/Generic.ASMalwS.2D |
原始文件名 |
hvncengine.dll |
MD5 |
5beade9f8191c6a9c47050d4e3771b80 |
处理器架构 |
Intel 386 or later, and compatibles |
文件大小 |
77.00 KB (78848 bytes) |
文件格式 |
Win32 DLL |
时间戳 |
2022-08-03 03:30:53 UTC |
数字签名 |
无 |
加壳类型 |
无 |
编译语言 |
Microsoft Visual C++ v.7.10 – 11.0 – Visual 2012 |
VT首次上传时间 |
2022-08-16 21:15:12 UTC |
VT检测结果 |
48/71 |
恶意载荷存在两个导出函数SEEnd和SEStart。SEEnd用于关闭socket连接以及等待线程,SEStart为载荷主要功能,用于与C2通信实现hvnc功能。
样本运行后,首先和IEUpdate.exe一样生成带有主机标识的字符串。
图3‑26 获取主机信息并生成主机标识
每隔十分钟,执行一次恶意功能。
图3‑27 设置间隔时间
以上述带有主机标识的字符串作为名字创建桌面。
图3‑28 新建桌面
进入线程函数后,与IEUpdate.exe一样,读取 “error.log”中的内容后与“dl.dropboxusercontent.com”拼接,通过GET请求获取C2地址,而后通过socket尝试连接。
图3‑29 从Dropbox中获取C2并连接
如果连接成功的话,将通过socket发送先前生成的主机标识符,并设置当先线程与桌面的关联。
图3‑30 发送特定字符串
依次从服务端接收命令,实现hvnc的功能。
图3‑31 接收命令解析并执行
根据下发的命令,呈现不同的操作,逆向分析命令及对应功能大致如下所示。
命令 |
功能 |
0x1 |
持续发送截屏信息 |
0x2 |
停止发送截屏信息 |
0x3 |
执行下发的命令行 |
0x5 |
模拟键盘操作 |
0x6 |
模拟鼠标操作 |
0x7 |
打开explorer.exe,并设置始终显示任务栏 |
0x8 |
启动chrome.exe |
3.5 shellengine.dll 后门
表3‑8 二进制可执行文件
病毒名称 |
Trojan/Generic.ASMalwS.2D |
原始文件名 |
shellengine.dll |
MD5 |
edaff44ac5242188d427755d2b2aff94 |
处理器架构 |
Intel 386 or later, and compatibles |
文件大小 |
276.50 KB (283136 bytes) |
文件格式 |
Win32 DLL |
时间戳 |
2022-08-03 01:49:57 UTC |
数字签名 |
无 |
加壳类型 |
无 |
编译语言 |
Microsoft Visual C++ v.7.10 – 11.0 – Visual 2012 |
VT首次上传时间 |
2022-08-16 21:15:12 UTC |
VT检测结果 |
42/71 |
收集主机信息并生成主机标识符。
图3‑32 收集主机信息并生成主机标识符
创建管道用于与cmd.exe子进程通信。
图3‑33 创建管道
创建线程,并将cmd.exe的返回结果回传到C2。
图3‑34 获取cmd.exe执行的结果并回传
创建与C2通信并用于实现主要恶意功能的线程。
图3‑35 实现恶意功能的线程
与之前两个样本相同,依旧是读取 “error.log”中的内容后与“dl.dropboxusercontent.com”拼接,从该地址处获取后续通信的C2,并尝试使用socket连接。
图3‑36 从Dropbox中获取C2并连接
若可以建立socket连接,则接收服务端命令,根据命令实现不同恶意功能。
图3‑37 根据指令实现不同恶意功能
根据下发的命令,呈现不同的操作,逆向分析命令及对应功能大致如下所示。
命令 |
功能 |
0x1 |
根据接受的数据,改变回传数据结构的偏移0xC处的8个字节 |
0x2 |
重启cmd.exe进程或者通过cmd.exe执行命令行 |
0x4 |
获取磁盘列表或者获取指定目录下的子目录及文件名称列表 |
0x6 |
获取指定文件 |
0xA |
获取截屏信息 |
0xB |
设置标记,停止截屏 |
0xD |
模拟鼠标点击 |
0xE |
模拟鼠标移动 |
0xF |
修改图像转换时的参数 |
0x14 |
将回传数据结构的偏移0xC处的8个字节改为样本中存储的数据 |
0x1E |
回传chrome密钥 |
0x1F |
获取指定目录下的文件 |
通过pdb路径的相似性以及相同的自定义加密函数可以推测出攻击活动中涉及的3个PE文件应归属于同一个攻击者。又根据模板文件中包含的VBA代码以及IEUpdate.exe下载工具代码与Lazarus组织先前攻击活动中相应文件的代码具有很高的相似程度,推测本次攻击活动同样归属于Lazarus组织。
IEUpdate.exe、hvncengine.dll、shellengine.dll三个文件的pdb均在同一个目录下。
图4‑1 IEUpdate.exe的pdb
图4‑2 hvncengine.dll的pdb
图4‑3 shellengine.dll的pdb
hvncengine.dll与shellengine.dll的自定义加密函数完全相同,但所用key不同。IEUpdate.exe和shellengine.dll的key为“LNfYIU”,hvncengine.dll的key为“WhdeEg”。
图4‑4 自定义加密函数
带有恶意宏的模板文件和IEUpdate.exe下载工具与先前发现Lazarus组织的样本代码大部分相似。
图4‑5 此次攻击活动涉及的vba代码
图4‑6 以往攻击活动涉及的vba代码[2]
图4‑7 此次攻击活动涉及的下载工具代码
图4‑8 以往攻击活动中涉及的下载工具代码[2]
Lazarus组织相关攻击活动的行为技术点的ATT&CK框架图谱如下所示:
图5‑1 Lazarus组织攻击活动对应ATT&CK威胁框架映射图
本次系列活动共涉及ATT&CK框架中11个阶段的28个技术点,具体行为描述如下表:
表5‑1 ATT&CK技术行为描述表
ATT&CK阶段/类别 |
具体行为 |
注释 |
资源开发 |
获取基础设施 |
利用DropBox存放后续连接的C2地址 |
初始访问 |
网络钓鱼 |
猜测可能利用钓鱼邮件传播诱饵文件 |
初始访问 |
水坑攻击 |
猜测可能通过水坑攻击传播诱饵文件 |
执行 |
利用进程间通信 |
shellengine.dll后门可通过管道执行cmd命令 |
执行 |
诱导用户执行 |
诱导用户打开攻击者构造的诱饵文档 |
持久化 |
利用自动启动执行引导或登录 |
通过修改注册表启动项实现持久化 |
提权 |
滥用提升控制权限机制 |
通过fodhelper.exe绕过UAC |
提权 |
进程注入 |
将IEUpdate.exe注入到WINWORD.exe进程 |
防御规避 |
滥用提升控制权限机制 |
通过fodhelper.exe绕过UAC |
防御规避 |
反混淆/解码文件或信息 |
样本种的关键字符串通过自定义算法加密 |
防御规避 |
削弱防御机制 |
修改Windows Defender的白名单 |
防御规避 |
进程注入 |
将IEUpdate.exe注入到WINWORD.exe进程 |
防御规避 |
模板注入 |
利用模板注入加载远程恶意模板执行 |
防御规避 |
虚拟化/沙箱逃逸 |
通过判断sleep延时是否成功规避部分沙箱 |
凭证访问 |
窃取Web会话cookie |
窃取chrome cookie |
发现 |
发现应用程序窗口 |
发现应用程序窗口,便于实现远程桌面控制 |
发现 |
发现文件和目录 |
发现目标机中的文件和目录 |
发现 |
发现进程 |
发现目标机中的进程信息 |
发现 |
查询注册表 |
发现目标机 |
发现 |
发现系统信息 |
发现目标机的系统版本等信息 |
发现 |
发现系统所有者/用户 |
发现目标机的当前用户 |
发现 |
发现系统时间 |
发现目标机当前系统时间 |
发现 |
虚拟化/沙箱逃逸 |
通过判断sleep延时是否成功规避部分沙箱 |
收集 |
收集本地系统数据 |
收集系统版本、用户名、文件列表、文件等数据 |
收集 |
输入捕捉 |
捕获鼠标、键盘消息 |
收集 |
获取屏幕截图 |
获取屏幕截图 |
命令与控制 |
使用应用层协议 |
使用socket同C2通信 |
数据渗出 |
使用C2信道回传 |
数据同通过C2信道回传 |
参考资料:
https://blog.alyac.co.kr/4586
https://ti.qianxin.com/blog/articles/analysis-of-the-lazarus-group-attacks-on-korean-companies/
原文始发于微信公众号(安天集团):疑似Lazarus组织针对韩国的攻击活动分析