CNC组织目前已知最早于2019年被发现,当时由于其使用的远控木马的PDB路径信息中包含了cnc_client,因此该组织被命名为CNC。该组织主要针对军工和教育行业进行攻击。
2.1 PrivateImage.png.exe(下载器1)
2.1.1 样本概述
PrivateImage.png.exe会根据该文件是否在%localappdata%路径下选择两种方式执行。
1.如果在%localappdata%路径下,不断检测是否有新设备接入;若有,则将文件本身复制到新设备中,以便通过可移动设备传播。
2.如果不在%localappdata%路径下,首先判断%localappdata%ImageEditor.exe是否存在:
1)如果存在,跳过后续操作退出。
2)如果不存在,判断互联网连接状态:
a)如果可连网,下载后续下载器。
b)如果不可连网,从Recent文件夹下的快捷方式中获取.docx或.pptx后缀的文件,复制文件到当前目录下新建的以用户名命名的隐藏文件夹中,并以符号替换后的文件路径命名。
2.1.2 详细分析
表2‑1 PrivateImage.png.exe
病毒名称 |
Trojan[Downloader]/Win32.APT |
原始文件名 |
PrivateImage.png .exe(空格很长,伪装成图片) |
MD5 |
da3d305d1b47c8934d5e1f3296a8efe0 |
处理器架构 |
AMD AMD64 |
文件大小 |
1.16 MB (1216000 bytes) |
文件格式 |
Win32 EXE |
时间戳 |
2022-02-23 21:30:27 UTC |
数字签名 |
无 |
加壳类型 |
无 |
编译语言 |
Compiler: Microsoft Visual C/C++ (2017 v.15.9) |
VT首次上传时间 |
2022-03-26 10:51:26 UTC |
VT检测结果 |
12/70 |
样本运行后,首先会获取当前用户名,用在后续路径拼接的操作中。
图2‑1 获取当前用户名
获取当前文件的路径,并判断是否在%localappdata%目录下。
图2‑2 判断路径中是否包含appdatalocal
如果在%localappdata%目录下,则会获取系统中的所有驱动器字符串。
图2‑3 获取系统中的所有驱动器字符串
通过判断前一次的驱动器字符串与本次获取到的驱动器字符串是否相同,来确定是否有新设备接入。
图2‑4 判断是否有新设备接入
如果存在新设备,获取新设备的名称,若新设备中不存在当前文件,则将当前文件复制到新设备。然后将指示单词“-firstcry”拼接到主机名后,用于同攻击者控制的设备通信。若新设备中已存在当前文件,则将指示单词“-alleat”拼接到主机名后。
图2‑5 将样本自身复制到新设备中
样本与攻击者控制的设备通信。
图2‑6 将新设备的情况发送回控制端
如果不在%localappdata%目录下,加载样本资源中的图片并将其释放到同目录下打开。
图2‑7 加载并打开资源中的图片
资源节中包含的图片。
图2‑8 样本资源中包含的图片
首先进行字符串拼接。
图2‑9 字符串拼接
然后判断%localappdata%ImageEditor.exe是否存在,如果存在跳过后续操作,结束进程。
图2‑10 通过获取文件属性判断文件是否存在
测试与www[.]baidu.com的通信,判断当前环境下互联网连接状况。
图2‑11 测试是否联网
如果互联网不可用,拼接字符串,在样本所在目录创建以当前用户名命名的隐藏文件夹。
图2‑12 创建隐藏文件夹
从Recent文件夹下的快捷方式中获取.docx或.pptx后缀的文件,查找最近打开的.docx和.pptx后缀的文件。
图2‑13 文件查找
若找到,则将其复制到创建的隐藏文件夹中,文件采用将文件完整路径中的“”、“:”修改为“_”的方式命名。
图2‑14 文件复制
测试机中收集的文件及其命名方式如下。
图2‑15 测试机中收集的文件
如果互联网可用,判断C:ProgramDataUSOshared文件夹是否存在,若不存在创建该文件夹。
图2‑16 创建文件夹
图2‑17 拼接字符串用于下载后续的下载器
如果成功下载到文件,将其保存到%temp%下的YodaoCloudMgr中。
图2‑18 下载并保存到本地
将YodaoCloudMgr从%temp%复制到C:ProgramDataUSOsharedYodaoCloudMgr.exe后删除%temp%下的YodaoCloudMgr文件。
图2‑19 复制与删除操作
创建任务计划,将C:ProgramDataUSOsharedYodaoCloudMgr.exe添加到任务计划程序库中,每隔2分钟执行一次。并根据下载和创建任务计划的结果构建回传信息:23Fi45XX代表下载成功,23Fi45NNXX代表下载失败;45tDdd43543代表任务计划创建成功,45tDnn43543代表任务计划创建失败。
图2‑20 创建任务计划,定时执行YodaoCloudMgr.exe文件
测试机中创建的任务计划如下。
图2‑21 创建的任务计划
获取当前环境下的进程列表。
图2‑22 获取进程列表
将获取到的进程列表同先前构造的回传信息进行拼接,并采用base64编码方法处理拼接后的内容。
图2‑23 拼接回传信息
使用URLDownloadToFileW与控制端通信,回传收集的信息。如果任务计划创建失败,则通过CreateProcessA执行C:ProgramDataUSOsharedYodaoCloudMgr.exe。根据静态分析推测,如果YodaoCloudMgr.exe启动失败,删除文件后会从github存储库中获取内容执行。
图2‑24 获取内容执行
2.2 YodaoCloudMgr.exe(下载器2)
2.2.1 样本概述
YodaoCloudMgr.exe由PrivateImage.png.exe下载并执行,主要用于下载后续载荷。分析时发现文件内部存在文件搜寻、启动进程等相关代码,同时发现样本在通信时使用的不可信证书。
图2‑25 通信使用不可信的证书
2.2.2 详细分析
表2‑2 YodaoCloudMgr.exe文件
病毒名称 |
Trojan[Downloader]/Win32.APT |
原始文件名 |
yodaocloudmgr.exe_ |
MD5 |
c024eb3035dd010de98839a2eb90b46b |
处理器架构 |
AMD AMD64 |
文件大小 |
3.22 MB (3378688 bytes) |
文件格式 |
Win32 EXE |
时间戳 |
2022-01-14 23:47:14 UTC |
数字签名 |
无 |
加壳类型 |
无 |
编译语言 |
Microsoft Visual C/C++ (2017 v.15.9) |
VT首次上传时间 |
2022-03-28 16:26:44 UTC |
VT检测结果 |
18/71 |
样本中存在待解密的字符串。
图2‑26 带解密的字符串
字符串通过对称加密XXTEA算法进行解密操作。
图2‑27 加密算法
通过stat函数获取文件信息,判断RNGdTMP899是否存在。
图2‑28 判断%temp%路径下是否存在RNGdTMP899文件
如果不存在该文件,则生成15字节的随机字符串,随机字符串用于URL拼接。字节的取值在“ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/”中。
图2‑29 生成15字节随机字符串
若当前环境下不存在RNGdTMP899文件,创建RNGdTMP899文件。
图2‑30 创建RNGdTMP899文件
而后将随机字符串写入该文件。
图2‑31 写入随机字符串
判断RNGdTMP899文件属性,若文件不为隐藏属性则将其设置为隐藏属性。
图2‑32 修改RNGdTMP899文件属性为隐藏
获取RNGdTMP899中的随机字符串,此次生成的随机字符串为RLCTEJddUbAJMJR,并拼接成https[:]//45.86.162.114/query=RLCTEJddUbAJMJR/%20%getting,forum。
图2‑33 URL拼接
根据网络行为观测,样本首先会请求拼接的https[:]//45.86.162.114/query=RLCTEJddUbAJMJR/%20%getting,forum,然后请求https[:]//45.86.162.114/images-css/RLCTEJddUbAJMJR/imagelogo.css获取数据。
图2‑34 拼接URL
之后每隔1分钟,循环请求https[:]//raw.githubusercontent.com/yuiopk1456/beutifymyapp/main/LICENSE。通过URL可以看出攻击者有可能在指定IP失效后通过github平台传输数据,猜测传输的数据可能为XXTEA算法加密后的攻击者指定的IP或域名。
图2‑35 循环执行该段代码,间隔时间为1分钟
查找接收到数据的标记位置。
图2‑36 查找接收到数据的标记位置
对其后数据应存在解密操作。
图2‑37 解密获取到的数据
通过在github上搜索beutifymyapp,关联到疑似该组织的github存储库,存储库的创建者名字也与本次攻击活动中github存储库的创建者名字yuiopk1456相似。仅在2021年11月存在对该存储库的操作,在这之后也未创建其他存储库。
图2‑38 github上关联到的相似存储库
在关联到的相似存储库中,发现可疑的字符串,可能为加密后的域名或IP。
图2‑39 github中的可疑字符串
连接github存储库中存放的IP或域名。
图2‑40 socket连接
由于域名、IP以及github地址均失效,故无法继续跟进。通过静态分析样本推测,攻击者与控制端通信后可能存在获取指定目录文件列表、启动进程等操作。
获取指定目录文件列表。
图2‑41 文件查找相关操作
创建管道。
图2‑42 创建管道
启动进程。
图2‑43 启动进程
在先前观测中发现,部分CNC组织人员会在开发环境中集成vcpkg,此次发现的样本中同样存在该特点,且路径也同以往使用的路径一致。
图3‑1 此次攻击活动中存在的路径信息
图3‑2 以往攻击活动中存在的路径信息
样本中的部分代码也十分相似。
图3‑3 此次攻击活动中的部分代码
图3‑4 以往攻击活动中的部分代码
加密函数大致相同。
图3‑5 以往攻击活动中加密函数的部分代码
图3‑6 此次攻击活动中加密函数的部分代码
综上所述,初步将此次攻击活动归因到CNC组织。
威胁框架映射
本次攻击活动共涉及ATT&CK框架中的8个阶段的15个技术点,具体行为描述如下表:
表4‑1 近期CNC组织攻击活动的技术行为描述表
CNC组织相关攻击活动的行为技术点的ATT&CK框架图谱如下图所示:
图4‑1 CNC组织攻击活动对应ATT&CK框架映射图
总结
近些年,APT组织向隔离网络攻击的意图越发明显,渗透隔离网络的攻击样本不断增多,以Darkhotel[1]、幼象[2][3]为典型代表的攻击组织均自研相关攻击武器并不断更新。此次攻击活动中的CNC组织样本同该组织以往的样本相比也进行了升级,在开发阶段同样集成了vcpkg开发环境,也存在从github存储库中获取内容的行为。在横向移动阶段,在判断是否有新存储设备接入的手法上,与此前通过GetDriveTypeA获取接入设备的类型的判断方法不同,本次攻击活动的样本通过不断获取驱动器列表的方法,一旦发现有新存储设备接入,则将文件复制到新接入的存储设备中,以便达成在隔离网中传播的目的。
185.25.51.41 |
45.86.162.114 |
da3d305d1b47c8934d5e1f3296a8efe0 |
c024eb3035dd010de98839a2eb90b46b |
https://raw.githubusercontent.com/yuiopk1456/beutifymyapp/main/LICENSE |
https://raw.githubusercontent.com/gazelter231trivoikpo1/questions/main/beautify.js |
https://www.antiy.cn/research/notice&report/research_report/20200522.html
https://www.antiy.cn/research/notice&report/research_report/20210222.html
https://www.antiy.cn/research/notice&report/research_report/20211119.html
原文始发于微信公众号(安天集团):针对军工和教育行业的CNC组织“摆渡”木马分析