Kimsuky APT组织使用新型的AppleSeed Android组件伪装成安全软件对韩特定目标进行攻击

简介: 我们判断该组织已经具有了Windows,MacOs,Android的攻击能力,并且将在未来的一段时期持续的活跃。

一.前言:

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 弹出相关的页面以迷惑受害人

LaunchActivityonCreate 方法中,启动了 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文件中的相关密文。

四.结语

KimsukyAPT组织作为东北亚地区最为活跃的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

相关文章
|
27天前
|
存储 Android开发 开发者
深入理解安卓应用开发的核心组件
【10月更文挑战第8天】探索Android应用开发的精髓,本文带你了解安卓核心组件的奥秘,包括Activity、Service、BroadcastReceiver和ContentProvider。我们将通过代码示例,揭示这些组件如何协同工作,构建出功能强大且响应迅速的应用程序。无论你是初学者还是资深开发者,这篇文章都将为你提供新的视角和深度知识。
|
30天前
|
数据可视化 Android开发 开发者
安卓应用开发中的自定义View组件
【10月更文挑战第5天】在安卓应用开发中,自定义View组件是提升用户交互体验的利器。本篇将深入探讨如何从零开始创建自定义View,包括设计理念、实现步骤以及性能优化技巧,帮助开发者打造流畅且富有创意的用户界面。
63 0
|
6月前
|
Android开发 算法 架构师
android的基础ui组件,这些知识点你会吗
android的基础ui组件,这些知识点你会吗
android的基础ui组件,这些知识点你会吗
|
6月前
|
Android开发 缓存 双11
android的基础ui组件,Android开发社招面试经验
android的基础ui组件,Android开发社招面试经验
android的基础ui组件,Android开发社招面试经验
|
30天前
|
XML 前端开发 Java
安卓应用开发中的自定义View组件
【10月更文挑战第5天】自定义View是安卓应用开发的一块基石,它为开发者提供了无限的可能。通过掌握其原理和实现方法,可以创造出既美观又实用的用户界面。本文将引导你了解自定义View的创建过程,包括绘制技巧、事件处理以及性能优化等关键步骤。
|
1月前
|
测试技术 数据库 Android开发
深入解析Android架构组件——Jetpack的使用与实践
本文旨在探讨谷歌推出的Android架构组件——Jetpack,在现代Android开发中的应用。Jetpack作为一系列库和工具的集合,旨在帮助开发者更轻松地编写出健壮、可维护且性能优异的应用。通过详细解析各个组件如Lifecycle、ViewModel、LiveData等,我们将了解其原理和使用场景,并结合实例展示如何在实际项目中应用这些组件,提升开发效率和应用质量。
39 6
|
6月前
|
Java 开发工具 Android开发
如何在Eclipse中查看Android源码或者第三方组件包源码(转)
如何在Eclipse中查看Android源码或者第三方组件包源码(转)
52 4
|
2月前
|
存储 开发框架 数据可视化
深入解析Android应用开发中的四大核心组件
本文将探讨Android开发中的四大核心组件——Activity、Service、BroadcastReceiver和ContentProvider。我们将深入了解每个组件的定义、作用、使用方法及它们之间的交互方式,以帮助开发者更好地理解和应用这些组件,提升Android应用开发的能力和效率。
157 5
|
2月前
|
缓存 搜索推荐 Android开发
安卓应用开发中的自定义View组件实践
【9月更文挑战第10天】在安卓开发领域,自定义View是提升用户体验和实现界面个性化的重要手段。本文将通过一个实际案例,展示如何在安卓项目中创建和使用自定义View组件,包括设计思路、实现步骤以及可能遇到的问题和解决方案。文章不仅提供了代码示例,还深入探讨了自定义View的性能优化技巧,旨在帮助开发者更好地掌握这一技能。
|
3月前
|
存储 搜索推荐 Java
探索安卓开发中的自定义视图:打造个性化UI组件Java中的异常处理:从基础到高级
【8月更文挑战第29天】在安卓应用的海洋中,一个独特的用户界面(UI)能让应用脱颖而出。自定义视图是实现这一目标的强大工具。本文将通过一个简单的自定义计数器视图示例,展示如何从零开始创建一个具有独特风格和功能的安卓UI组件,并讨论在此过程中涉及的设计原则、性能优化和兼容性问题。准备好让你的应用与众不同了吗?让我们开始吧!