一.前言:
kimsuky
APT组织(又名Mystery Baby, Baby Coin, Smoke Screen, BabyShark, Cobra Venom) ,该组织一直针对于韩国的智囊团,政府组织,新闻组织,大学教授等等进行活动.并且该组织拥有windows
平台的攻击能力,载荷便捷,阶段繁多。并且该组织十分活跃.其载荷有带有漏洞的hwp文件,携带恶意宏文档,释放dll载荷的PE文件,远程模板注入技术docx文档,恶意的wsf以及js的脚本文件等
近日,Gcow
安全团队追影小组在日常的文件监控中发现该组织正在积极的使用分阶段的恶意宏文档,恶意的wsf以及js文件释放并加载载荷同时释放并打开相关的诱饵文档以迷惑受害者以及部分模板注入技术的相关样本。同时我们也发现了其使用冒充KISA(Korea Internet & Security Agency)的官方安卓端安全检查软件针对特定目标进行钓鱼的活动,同时根据我们的分析发现其APK载荷与该组织之前一直在使用的AppleSeed(又名AutoUpdate)组件有很强的关联性,所以我们猜测该APK属于AppleSeed组件集下的Android攻击载荷。
故此我们判断该组织已经具有了Windows
,MacOs
,Android
的攻击能力,并且将在未来的一段时期持续的活跃。
二.样本分析:
该恶意APP伪装成KISA的安卓端安全检查软件
图1 图标伪造KISA的安卓端安全软件
运行之后申请相关的权限,弹出界面以迷惑受害者:
图2 弹出相关的页面以迷惑受害人
在 LaunchActivity
的 onCreate
方法中,启动了 MainService
服务。
图3 启动MainService服务
MainService 中,字符串经过了加密,对关键字符串解密后,可得到上传数据的 url
解密代码如下
public static void decrypt(String arg10) { String v0_2; int v5; try { int v0 = arg10.length(); int v1 = v0 / 2; byte[] v2 = new byte[v1]; int v3 = 0; int v4; for(v4 = 0; true; v4 += 2) { v5 = 16; if(v4 >= v0) { break; } v2[v4 / 2] = ((byte)((Character.digit(arg10.charAt(v4), v5) << 4) + Character.digit(arg10.charAt(v4 + 1), v5))); } v1 -= v5; byte[] v10 = new byte[v1]; byte[] v0_1 = new byte[v5]; System.arraycopy(v2, 0, v0_1, 0, v5); v4 = 0; int v6; int v8; for(v6 = 0; v3 < v1; v6 = v8) { if(v4 >= v5) { v4 += -16; } int v7 = v3 + 16; v8 = v2[v7]; v10[v3] = ((byte)(v6 ^ (v2[v7] ^ v0_1[v4]))); ++v3; ++v4; } v0_2 = new String(v10, StandardCharsets.UTF_8); } catch(Exception e) { v0_2 = ""; } System.out.println(v0_2); return;}
hxxp://download.riseknite.life/index.php
然后把 url 传入了 c.c.a.c 方法,并使用 scheduleAtFixedRate
设定每分钟执行一次
图4 将c2解密后传到主体函数中
在 c.c.a.c 中,并行执行了两个方法 d() 和 c.c.a.e.c(),分别查看逻辑
图5 执行方法d()与c.c.a.e.c()
d()主要是取得一些设备信息,并 POST 发送数据。
hxxp://download.riseknite.life/index.php?m=a&p1={url 编码后的 android_id}&p2={设备型号 }+{SDK 版本}+{后门版本号}
参数 | 值 |
m | a |
p1 | url 编码后的 android_id |
p2 | 设备型号 + SDK 版本 + 后门版本号 |
图6 收集信息并向C2发送报文
c.c.a.e.c() 先创建了一个临时文件 cmd_xxxxx.dat
(以下文件不特殊说明均为临时文件,**注意:[xxxxx为五位字符数字的随机文件名]**) ,然后下载数据写入文件
hxxp://download.riseknite.life/index.php?m=c&p1={url 编码后的 android_id}
hxxp://download.riseknite.life/index.php?m=d&p1={url 编码后的 android_id}
参数 | 值 |
m | c,d |
p1 | url 编码后的 android_id |
返回值 | 文件数据 |
图7 创造临时文件并发送报文
新建 a 对象并把刚才下载的数据传入 a 方法, a 方法中对 dat 的内容进行了解析
数据 | 大小 |
指令类型(1-8) | int |
指令组数量 | int |
第一组指令长度 | int |
指令内容 | byte[] |
第二组指令长度 | int |
指令内容 | byte[] |
... | ... |
图片8 接受回显数据图片9 解析下载的文件数据
最终调用 a.d() 方法,a.d() 会根据指令类型执行相应的操作
指令类型为 1 时,会提醒用户更新并进行更新操作
图片10 提醒用户更新并进行更新
指令类型为 2 时,a.d() 创建了 list.xls
和 zip.dat
,并遍历**/sdcard**目录及其子文件夹下的所有文件,把文件信息写入了 list.xls
NAME | SIZE | LAST MODIFIED | PATH |
文件名 | 文件大小(按KB计算) | 修改时间 | 绝对路径 |
list.xls 经过压缩,写入 zip.dat ,并在 c.b.a.a.a.u() 中伪装了 pdf 文件头并加密内容,逃避沙箱对流量的检测
调用 c.d( url , 日期 , 文件路径 ) 上传,url 的参数如下
hxxp://download.riseknite.life/index.php?m=b&p1={url 编码后的 android_id}&p2=a
参数 | 值 |
m | b |
p1 | android_id |
p2 | a |
图片11 遍历文件信息并且将其打包图片12 伪造pdf的文件头并且加密相关数据
c.d() 对文件进行了分块上传,以 “$$$$$$$$$$$$$$$$” 为分隔符
图片13 对数据进行分块上传
指令类型为 3 时,上传指定的文件
图片14 上传指定的文件
指令类型为 4 时,使用 " sh -c " 对 cmd_xxxxx.dat
的内容进行执行,把执行结果写入 cmd_xxxxx.txt
,经过相同的伪装,调用 c.d() 上传
hxxp://download.riseknite.life/index.php?m=b&p1={url 编码后的 android_id}&p2=b
参数 | 值 |
m | b |
p1 | android_id |
p2 | b |
图片15 使用sh -c执行cmd.dat并将回显内容写入并上传
指令类型为 5 时,创建 sms.txt ,调用安卓短信协议,获取信息写入 sms.txt
日期 类型(收到/发送) 发送/接受人手机号码 短信内容
然后伪装,上传
hxxp://download.riseknite.life/index.php?m=b&p1={url 编码后的 android_id}&p2=c
参数 | 值 |
m | b |
p1 | android_id |
p2 | c |
图片16 将获取的信息写入sms.txt并且上传数据
指令类型为 6 和 7 时分别清除 app 的数据和缓存
图片17 清除APP的数据以及缓存
指令类型为 8 时,发送短信
图片18 向特定的人发送短信
指令id | 功能 |
1 | 提醒用户更新并进行更新操作 |
2 | 收集/sdcard目录下的文件的信息压缩后伪装并且上传 |
3 | 上传指定的文件 |
4 | 执行命令并将回显压缩后伪装上传 |
5 | 调用安卓短信协议,获取信息写入 sms.txt,伪装后发送给c2 |
6&7 | 清除app的缓存与数据 |
8 | 发送短信给特定的目标 |
图片19 AppleSeed Android组件流程图
此外我们还观察到奇安信红雨滴实验室在其推特上公开了该组织的js样本(参考链接见尾部)
图片20 红雨滴团队公开kimsuky的js样本
其js代码的主要功能就是将诱饵文档以及加upx的AppleSeed
载荷写入**%ProgramData%**下,并且调用certutil.exe
解密,然后运行诱饵文档以迷惑受害者,调用regsvr32.exe /s
加载AppleSeed
载荷
图片21 Js Dropper的载荷释放主体代码
其显示的诱饵文档截图如下:
图片22 诱饵文档截图
其话题主要关于韩国外交部海外任务服务状况的调查表。而在今年三月份的时候我们也观察到其使用wsf脚本释放相应的载荷,其相关代码与js的释放物相似,故此不再赘述,其释放的诱饵关于韩国国防部空军Wargame模型的改进计划内容以针对该国的国防工业
图片23 诱饵文档截图
AppleSeed
加载器分析:
调用解密函数解密相关的字符串变量,写注册表项,创造新键以达到权限维持的效果。键名:WindowsDefenderAutoUpdate
,键值:regsvr32.exe /s "C:\ProgramData\Software\Microsoft\Windows\Defender\AutoUpdate.dll
图片24 写注册表达到权限维持
获取当前文件路径并且拷贝当前文件到C:\ProgramData\Software\Microsoft\Windows\Defender\AutoUpdate.dll
图片25 拷贝当前文件到目标目录
创造名为DropperRegsvr32-20210418013743
的互斥体并且防止其多开
图片26 创造互斥体
启动主要功能线程:
图片27 启动线程
主要功能线程:
图片28 主要功能线程
获取系统所在盘符以及其所在盘符驱动器的卷标序列号,并且将其取hex后取前八位
图片29 获取卷标序列化
解密C2后将信息进行拼接
onedrive-upload.ikpoo.cf/?m=c&p1={C盘卷标序列号}
onedrive-upload.ikpoo.cf/?m=d&p1={C盘卷标序列号}
图片30 解密c2后将所收集的信息拼接
将其发送到C2并将回显数据写入**%temp%\xxxx.tmp中注意:[xxxx为前两位数字后两位字母的随机文件名]**
图片31 将数据发送到c2等待期写入xxxx.tmp中
收集系统信息并且进行筛选再依据格式Win%d.%d.%d%s进行格式化
图片32 收集系统信息
解密相关配置数据,根据形式**/?m=a&p1={C盘卷标序列号}&p2={系统位数名称}-{downloader名称}-v{后门版本号}**拼接报文格式
onedrive-upload.ikpoo.cf/?p1={C盘卷标序列号}&p2={系统位数名称}-D_Regsvr32-v2.0.74
图片33 拼接上线数据包
将数据包发送到c2上
图片34 发送上线包
三.样本关联:
1.报文相似性
其二者在报文的参数上都以**m=a&p1=,m=c&p1=,m=d&p1=**进行相关的传参,同时其p2的第一个参数以及第三个参数分别都为所收集到的本机信息以及其后门的版本号.且p1都是根据本身的独特序列号以及id所构成的唯一认证因素,所以二者在流量报文的脚本上具有一定的相似性
图片35 报文的相似性
2.解密代码的相似性
二者的解密代码具体一定的相似性也成为二者被归因到一类恶意软件的一项重要的指标。不过由于dll使用了大量的代码流平坦化,导致解密函数的流程被严重的混淆,故此不能作为很强的归因形式.不过根据APK所提供的解密算法可以还原dll文件中的相关密文。
四.结语
Kimsuky
APT组织作为东北亚地区最为活跃的APT
组织之一,其一直在更新自己的相关武器库以及更新其载荷的植入方式不断追求逃脱杀毒软件的检测。如下图,本文提到的APK木马当其刚上传到Virustotal平台的时候,其杀软检测的状况为:0/63。该组织也成为了东北亚地区地缘政治下的网络威胁的焦点,当然这值得我们去更多关注该组织的活动,Gcow
安全团队追影小组将继续跟踪该组织更多的动向。
图片36 2021/4/22上传到VT其查杀情况
五.IOCs:
Script Dropper:
3A4AB11B25961BECECE1C358029BA611(2021 외교부 재외공관 복무관련 실태 조사 설문지.hwp.js)
14B95DC99E797C6C717BF68440EAE720(창공모델 성능개량 체계개발사업 현장확인자료 - 협력업체 배포용.wsf)
AppleSeed Dll implant:
80A2BB7884B8BAD4A8E83C2CB03EE343(AutoUpdate.dll)
A03598CD616F86998DAEF034D6BE2EC5(temp.db)
AppleSeed Android:
4626ED60DFC8DEAF75477BC06BD39BE7(KisaAndroidSecurity.apk)
C2:
download.riseknite.life
onedrive-upload.ikpoo.cf
alps.travelmountain.ml