APT37,别名Group123、Venus 121、Reaper等,是一个活跃的朝鲜黑客组织,其攻击活动开始于2012年。APT37的主要攻击目标为朝鲜的地理邻国,包括韩国、日本、俄罗斯、中国等,其中对韩国的攻击活动十分频繁。
朝鲜的黑客组织为数众多,而且普遍活跃,这使得早些年对攻击组织的划分十分困难。2017年以前,APT37的攻击活动大多与Lazarus组织的攻击活动混为一谈,并认为APT37是Lazarus组织的一部分。
近年来,随着APT37的活动增多,其手段和工具特征也越来越明显,与广义上Lazarus组织攻击行为的差异也变得显著。目前,APT37已被确认为针对韩国政企与脱北人员等政治目标,使用RokRat、NavRat、KevDroid、PoorWeb等标志性木马发动攻击的高效黑客团体。
2019年12月,微软宣布通过诉讼手段取得了APT37曾使用的50个域名的控制权。这一事件使得APT37再次来到公众视野中。然而,被易手的域名并不包括韩国区域,因此并不能有效打击APT37在亚洲的攻击活动。该组织依然应被高度关注。
木马与工具
近几年APT37使用的木马类型比较集中,PC端多为PoorWeb、RokRat、NavRat等远控木马,移动端多为KevDroid等安卓后门或窃密工具。
PoorWeb远控木马
PoorWeb是一款C++多功能远控木马,近年来被APT37组织大量使用。该木马通常搭载在恶意hwp文档中,运行后使攻击者可以在受控主机进行文件操作。
通信
以APT37的攻击行动“Operation Imitation Game”中使用的PoorWeb为例,分析发现该PoorWeb木马在通信行为上有一定特殊性。
木马运行后首先尝试与网址youngs.dgweb.kr建立连接,但不发生通信行为。如果与该网址连接失败,则解析真实cnc网址并进入通信流程:
同样逻辑发生在木马回应cnc指令的部分:
我们推测,网址A可以用于控制整个木马网络的开关,同时PoorWeb可以使用这种通信方式探测运行环境、隐藏真实cnc地址,同时起到了一定程度流量混淆的作用。
有趣的是,对该木马历史版本进行搜索分析时发现,上述木马使用的试探网址youngs.dgweb.kr在早期版本的PoorWeb木马程序中被作为真实cnc使用:
这一发现说明在Operation Imitation Game中使用的可能是PoorWeb控制网络的备用木马,仅在主cnc失效后才会启用。
功能
通过http通信,木马可在cnc的控制下执行以下攻击行为:
指令 | 功能 |
1 | 遍历指令文件夹,获取文件列表 |
3 | 打开指定文件,获取文件内容 |
5 | 运行指定cmd指令 |
9 | 设置客户端请求指令间隔 |
10 | 创建/打开指定名称的文件 |
11 | 向已打开的文件写入指定内容,之后关闭文件 |
12 | 向已打开的文件写入指定内容,之后由主控端决定是否关闭文件 |
18 | 遍历进程,获取进程列表 |
19 | 中止指定PID对应的进程 |
24 | 截屏 |
29 | 保持连接 |
31 | 删除指定文件 |
34 | 设置指定文件的访问和写入时间 |
RokRat远控木马
RokRat是利用公共云盘服务进行指令通信的远控木马,近年来被APT37组织大量使用。
RokRat主要通过恶意hwp文档下载并在内存中执行,属于无文件加载。
有些rokrat使用Flash漏洞得以执行,并被注入特定进程。
行为
环境检测
- 获取操作系统版本和Wow64标志
- 获取计算机名称、用户名和当前可执行文件路径
- 获取注册表中BIOS信息
环境检测的内容将会被上传到云盘C&C。
调试与沙箱检测
检查当前进程是否处于在调试状态,或运行于Sandbox、iDefense或SunBelt沙箱中。
检查Vmware并获取版本号
获取vmtoolsd.exe的文件版本。
检查当前进程是否拥有管理员权限
通过尝试在C:\Windows目录下创建文件,来判断是否获得管理员权限。
关闭指定进程
某些rokrat会创建线程,遍历当前系统中的进程,根据名称hash来关闭特定进程。
通信
CNC通信
Rokrat的C&C位于几大公共云网盘上,分别是Dropbox,Pcloud,Yandex和Box。Rokrat通过内置的云盘账号的Token向云盘发起针对特定文件的下载、上传和删除等请求,以此实现与C&C通信。其中,下载文件请求对应接收C&C指令及数据,上传文件请求则对应向C&C发送窃取的信息,而删除文件请求则可删除C&C上的文件以销毁证据。
尽管Rokrat内置多种云盘通信逻辑,但使用的主要是Dropbox和Pcloud。
Token
Token为一个云盘账号创建时生成的访问token,是对云盘文件发起请求操作时的身份认证标志。非该账号拥有者,使用该token和相应的参数(云盘API),便可对其账号内的文件发起下载、上传和删除等操作。
Dropbox
2018年与2019年内,Rokrat背后组织多次使用Dropbox作为首要C&C云盘进行通信。
下载文件
使用Dropbox下载文件时请求的特殊HTTP参数如下(实际通信为HTTPS,后同):
选项 | 值 |
URL | https://content.dropboxapi.com/2/files/download |
Authorizaion头 | Bear Token值 |
Dropbox-API-Arg头 | {“path”:”要下载的云盘文件路径名称”} |
上传文件
选项 | 值 |
URL | https://content.dropboxapi.com/2/files/upload |
Authorizaion头 | Bear Token值 |
Dropbox-API-Arg头 | {“path”:”上传的文件在云盘中的路径名称”} 或{“path”:”上传的文件在云盘中的路径名称”, “mode”:{“.tag”:”overwrite”}} |
删除文件
选项 | 值 |
URL | https://api.dropboxapi.com/2/files/delete (api v1) |
Authorizaion头 | Bear Token值 |
Content-Type头 | application/json |
数据部分 | {“path”:”要删除的云盘文件路径名称”} |
Pcloud
下载文件
选项 | 值 |
URL | https://api.pcloud.com/getfilelink |
参数path | 要下载的云盘文件路径名称 |
参数forcedownload | 为1表示服务端响应的类型为application/octet-stream |
参数skipfilename | 为1表示产生的链接不包含文件名 |
上传文件
选项 | 值 |
URL | https://api.pcloud.com/uploadfile |
参数path | 上传到的云盘的目录路径名称 |
参数filename | 上传到的云盘的文件名称 |
参数nopartial | 为1表示云盘不保存未传输完成的文件残片 |
删除文件
选项 | 值 |
URL | https://api.pcloud.com/deletefile |
参数path | 要删除的云盘文件路径名称 |
随机数
Rokrat一开始会请求从云盘下载文件,但是文件名往往为随机数,而云盘上并不存在该文件,故请求失败,开始收集信息并上传。上传的内容中会包含之前创建的随机数,使得攻击者能上传正确名称的文件,让Rokrat得以成功下载。
某些rokrat会包含多个随机数,用于解密下载的内容,同样需要先上传给攻击者。
C&C指令
Rokrat的指令系统主要用于下载作为第二阶段的PE文件或Shellcode。由于执行了它们之后程序会结束,因此该功能也可能是升级通道。
近两年,Rokrat的C&C指令解读流程未出现本质变化,一个显著特征是,先从云盘下载内容,再根据内容转到另一个云盘地址或普通地址进行下载,得到最终内容。
例1中,便是先从Dropbox下载第一级payload,根据指令不同,选择从URL或第二个云盘下载PE文件或Shellcode,并请求删除之前请求的第一个云平台文件。
字符指令 | 含义 |
0 | 退出程序 |
1、2、5和6 | 第二个字节开始为最终文件的URL链接字符串。 1和2下载Shellcode并执行。5和6下载可执行文件解密并执行(tmp目录下setup.exe)。 |
3、4、7和8 | 第二个字节开始为Pcloud账户的Token,将从Pcloud云盘下载对应文件。各个指令对应的文件名如下:3- /ADI.bin4- /DDI.bin7- /ADX.enc8- /DDX.enc9- /ERSP.enc 3和4下载Shellcode并执行。7、8、9下载可执行文件解密并执行(tmp目录下setup.exe)。 |
例2中,字符指令值发生了变化,但形式没有大变化:
字符指令 | 含义 |
0、b | 退出程序 |
4 | 从同一个云平台请求下载文件,链接同之前相同。此时,第二个字节开始为新token,下载内容为Shellcode。 |
c | 第二个字节开始为指定文件路径。从特定目录开始搜索该文件并上传至云盘。 |
例3中,指令经解密后,前四个字节为长度,后面的内容较之前有一些变化
字符指令 | 含义 |
0、b | 退出程序 |
d | Cmd执行命令,删去几个特定目录下特定后缀或名称的文件。 |
1,5和6 | 什么都不做 |
2 | 什么都不做 |
3,4,7,8和9 | 指令字符后的第二个字节开始是新token,向Dropbox请求文件并下载。 对于3和4,下载的是Shellcode,运行后执行cmd命令echo Success >>%temp%\out.txt 写入临时目录下文件。否则记录失败。之后执行第二组命令,记录信息到临时目录下,并上传这些文件。 对7,8,9,删云文件,下载的是pe文件,放在临时目录下,命名为KB400928.exe并执行 |
c | 根据指定路径,上传该路径下所有文件。 |
e | 执行cmd命令。指令后的字符串是cmd参数。 |
其他窃取功能
截屏
屏幕截图是rokrat必带的功能。先生成截图文件,接着读入内存,然后删除文件。
录音
有的rokrat会开启录音操作。
键盘记录
将键盘记录信息写入文件。
窃取浏览器凭据
窃取IE和Chrome浏览器的凭据文件。
窃取特定后缀文件
窃取doc、docx、pdf等文档文件。
NavRat后门木马
NavRat是近年来APT37使用的标志性木马,最早在2018年5月伪装美朝峰会的钓鱼邮件攻击活动中被发现。该木马使用韩国公共服务Naver邮箱作为通信和控制平台,注入IE傀儡进程,使用基于文件的交互方式展开攻击。
通信
NavRat集成了可以访问Naver的SMTP通信组件,可以访问特定邮件账户,上传本地信息,下载账户邮件内的附件并执行。
NavRat访问的邮件账户和密码都以硬编码的方式写入程序中:
对抗行为
关闭windows错误报告进程WerFault.exe:
ie傀儡进程植入:
功能
该木马运行后会创建文件夹%ProgramData%\Ahnlab,借助该文件夹内的文件操作,实现cnc通信和攻击。
该文件夹内可能出现的文件与功能如下表:
GoogleUpdate.exe | 木马本体exe文件 |
edg4AE3.tmp | 下载到的原始文件 |
csrss.exe | 解密后的待运行exe文件 |
csrss.dll | 解密后的待加载dll文件 |
$$$A3F9.tmp | 木马运行日志 |
$$$6F7C.tmp | 待上传的原始文件 |
edf5EA3.tmp | 加密后的待上传文件 |
$$$2EB7.TMP | 运行时间日志 |
edf33b.dll | 未使用 |
%%4AED.TMP | 本机信息记录 |
$$$3BAF.TMP | 未使用 |
$$$TP1D.TMP | 未使用 |
$$$5FA3.TMP | 键盘记录A |
$$$5FA7.TMP | 键盘记录B |
edgo333.tmp | Flag文件,控制木马下载行为 |
edgerror.tmp | Flag文件,标记木马是否运行csrss.exe |
edgkey33.tmp | Flag文件,标记木马是否再次下载运行csrss.exe |
PubNub木马
PubNub,实时信息通讯应用开发公司,是一家致力于为移动终端和网络应用开发实时信息通讯应用的初创公司,为客户收集信息以及将信息分类。
PubNub木马整体采用了PubNub公司所开发的实时通讯框架,利用其API完成与Bot的交互,可以理解为一套类IRC体系的通讯协议。
PubNub主控端GUI如下图:
PubNub木马在APT37于2018年8月发起的的Operation Rocket Man攻击活动中被使用。
通信
读取木马配置文件
木马在与其同目录下寻找desktops.ini文件,进行解密。揭秘逻辑为在7行数据中,逐行每字符与23异或。其解密结果写入API通讯配置。
ps.pndsn.com | PubNub代理节点 |
LiuJin | 频道名 |
sub-c-f2f2e932-8fb1-11e8-bdf5-3621de398238 | Subscribe Key |
pub-c-70020bb3-199a-4151-b71c-b4636f06b244 | Publish Key |
sec-c-N2Q0ZjM0NjAtMTJhZi00N2YwLWE2NDAtYTUwZWE5ZmYwNGNk | Secret Key |
cip-c-QPWOEIalskdjqpwoeialskdj | 未知-未使用 |
1119 | FunctionName-未使用 |
注册接收回调,并注册频道
频道名分别为机器名+MAC地址,配置文件中的预置频道名。
发布主题PAPA,内容为生成频道名上线:
通过接收聊天消息,判断消息发出者ID为“HAIZI”或上线时所注册的机器名+MAC的频道号,若满足则进行消息处理。
消息种类及含义
消息处理内容有三部分:用户metadata中的command,file和content。其对应的应答消息JSON结构如下:
功能
通过cnc指令,PubNub木马可实现以下功能:
Command | Function |
NONE | Do Nothing |
HELLO_REQUEST | 向预置频道发布名为PAPA的主题,并携带本机名+MAC作为内容 |
HELLO_REPLY | 用于响应HELLO_REQUEST,作为回复CommandType |
BYE_REQUEST | 用于下线 |
BYE_REPLY | 用于响应BYE_REQUEST,作为回复CommandType |
DRIVE_REQUEST | 返回木马版本,.NET版本,木马执行所在路径,盘符命 |
DRIVE_REPLY | 用于响应DRIVE_REQUEST,作为回复CommandType |
FILE_REQUEST | 获取指定目录下的文件详细信息,包含文件名,文件以kb计大小,文件创建时间。 |
FILE_REPLY | 用于响应FILE_REQUEST,作为回复CommandType |
UPDATE_REQUEST | 获取指定目录下的文件详细信息,包含文件名,文件以kb计大小,文件创建时间。 |
UPDATE_REPLY | 用于响应FILE_REQUEST,作为回复CommandType |
COPY_REQUEST | 将CnC传送内容写入文件 |
COPY_REPLY | 用于响应COPY_REQUEST,作为回复CommandType |
CUT_REQUEST | 复制到新文件,并删除旧文件 |
CUT_REPLY | 用于响应CUT_REQUEST,作为回复CommandType |
RENAME_REQUEST | 复制到新文件,并删除旧文件,意为重命名。 |
RENAME_REPLY | 用于响应RENAME_REQUEST,作为回复CommandType |
DELETE_REQUEST | 删除文件 |
DELETE_REPLY | 用于响应DELETE_REQUEST,作为回复CommandType |
UPLOAD_REQUEST | 准备上传文件路径 |
UPLOAD_REPLY | 用于响应UPLOAD_REQUEST,作为回复CommandType |
UPLOAD_CONTENT | 根据指定路径,将文件写入filestream并发布 |
UPLOAD_CONTENT_REPLY | 用于响应UPLOAD_CONTENT,作为回复CommandType |
UPLOAD_END | 同UPLOAD_CONTENT |
UPLOAD_END_REPLY | 用于响应UPLOAD_END,作为回复CommandType |
DOWNLOAD_REQUEST | 准备下载文件路径 |
DOWNLOAD_REPLY | 用于响应DOWNLOAD_REQUEST,作为回复CommandType |
DOWNLOAD_CONTENT | 下载文件 |
DOWNLOAD_CONTENT_REPLY | 用于响应DOWNLOAD_CONTENT,作为回复CommandType |
DOWNLOAD_END | 用于响应DOWNLOAD_CONTENT,作为回复CommandType |
DOWNLOAD_END_REPLY | 用于响应DOWNLOAD_CONTENT,作为回复CommandType |
COMMAND_RUN | 通过cmd /c隐藏窗口执行shell指令 |
COMMAND_RUN_REPLY | 用于响应COMMAND_RUN,作为回复CommandType |
PROCESS_STOP | 结束指定进程,并返回执行后的进程列表 |
PROCESS_STOP_REPLY | 用于响应PROCESS_STOP,作为回复CommandType |
PROCESS_REFRESH | 获取当前进程信息 |
PROCESS_REFRESH_REPLY | 用于响应PROCESS_REFRESH,作为回复CommandType |
SCREEN | 截屏并储存至名为tmp0120.ini的文件,发布文件大小 |
SCREEN_REPLY | 用于响应SCREEN,作为回复CommandType |
SCREEN_CONTENT | 上传截图文件 |
SCREEN_CONTENT_REPLY | 用于响应SCREEN_CONTENT,作为回复CommandType |
SCREEN_END | 用于响应SCREEN_CONTENT,作为回复CommandType |
SCREEN_END_REPLY | 用于响应SCREEN_CONTENT,作为回复CommandType |
CONFIG_REQUEST | 设置新的PubNub配置文件,并连接 |
CONFIG_REPLY | 用于响应CONFIG_REQUEST,作为回复CommandType |
Yandex-disk安卓后门
在2018年底的攻击活动Operation BlackBird中,APT37借由水坑站点散布了一种基于Yandex网盘交互的安卓后门木马。
安装
该木马在初始入侵阶段使用了三星手机目录遍历漏洞CVE-2015-7888安装,因此获得了设备的管理员权限。
该木马分为两层结构,第一层的应用属于Dropper程序,主要功能为将工程中assets文件夹下名为”apk”的文件安装到设备中:
被释放执行的第二层apk文件是安卓后门木马本体。
通信
该木马的cnc通信通过yandex网站提供的网盘服务实现,并使用token和api登录:
功能
该木马会收集手机信息,并将收集到的信息上传到网盘的/SystemService/tlist/文件夹下名为本设备id的文件中,之后尝试从/SystemService/cmd/,/SystemService/dex/core,/SystemService/dex/cmd等路径下载指令文件或dex文件并运行。
KevDroid安卓木马
在2017年的一起攻击活动中,APT37在下载服务器中存放了一款安卓木马。该木马被标记为KevDroid,这是KevDroid木马首次被发现。
KevDroid样本的制作基于了开源项目aykuttasil/CallRecorder,其特征在样本中得以保留。
行为
样本在启动后记录电话录音并注册PoService服务,读取以下内容并压缩加密。
FunctionName | Fucntion |
getAllAccounts | 获取系统中所有的账户信息,含账户名,账户类型。 |
getAllContactsJSON | 获取系统中所有的联络人信息,含姓名,电话号码,电子邮件,照片等。 |
getAllSMSJSON | 获取系统中所有短信 |
getCallLogJSON | 获取系统中的所有通话记录 |
getEmailArray | 获取系统中所有电子邮件 |
getPhoneNumberArray | 获取系统中所有电话号码 |
getPhoto | 获取系统中所有照片 |
getUniqueDeviceID | 获取手机唯一ID |
通信
KevDroid会将各窃取文件压缩并通过AES加密上传。
发展
2018年初,APT37构造了新的攻击链,继续投递KevDroid木马。
18年的新攻击链中,APT37使用了伪装成比特币小工具或平昌冬奥会的APP作为前置载荷,这两个APP在用户安装完成打开时显示需要更新才可以继续使用。
在点击update之后,APP会请求指定url,下载KevDroid木马变种:
小结
与朝鲜整体上信息闭塞的印象截然相反,APT37开发的恶意软件在通信协议设计上十分开放,通常依靠各国云服务平台进行命令控制。这样的做法好处是抹除了通信特征,将指令通信隐藏在常规服务流量之中,使得攻击行为难以被发现。
APT37比较重视移动端木马的使用,借由多款安卓木马极大地扩展了攻击的覆盖范围。