APK(FA81EA64592330092893FA785D310E86)

概述

文件是伪装为ToTok免费视频语音通讯软件的更新程序的APK,包名(Package Name)为“com.app_update.totok”。
有敏感权限请求,申请读写文件:

  • android.permission.READ_EXTERNAL_STORAGE
  • android.permission.WRITE_EXTERNAL_STORAGE

分析后发现为文件窃取器,申请权限后会尝试获取手机中指定类型的文件,并根据远程服务器的指令上传文件至远程服务器。

APK分析

解密字符串&input=NjUxN2I4NTE3MTMyMWUyZGVhMTE3YTgwOWFkNTFmODc)

大部分敏感字符串经过AES加密处理:
image.png
解密方式如下图:
image.png
解密的密文和明文如下表:

参数 明文 密文
ehad .avi 6517b85171321e2dea117a809ad51f87
tane .csv 0ce0e4ec9d6dec07fc552bb9903b7ba3
stko .doc 17718a91a1bb90caa7bbf3697c2c493e
tdka .docx 22becf6c0ffc9e827c9c57512c1fd629
mrex .jpeg ed2a9e106ac3b1c203418ab284cdbccc
hjnm .jpg 9bb153a5104546662ab84232936da715
dsmo .mkv 1eded8e4fa1eb48a0da7d4587832d6b8
aeui .mp3 e41ea4468e173a749e24090d8510ed6a
kanl .mp4 94a52b823cf4a1f99f90220e91cd5cc5
yudf .pdf 537db81585fa4410b737392b7ee72f42
fome .png f805c4d709127b7ae4666e0109e5d9a4
iceh .ppt 003effa47ad7452b16504cb86918b2e6
quie .pptx 17cca8604947829a891173239da28334
jgbt .txt 79b341821aec8462d18ce6eadfc498f6
vads .vcf 03d44466ed7b7b11ebddca23c3279238
ikne .wav bba169538951afc172ffcfe9fc5a0e6e
ojwa .xls 244357970b2187f729f2c4ec91da7464
tgaw .xlsx 27afc50b82fc7ca0fb0874f740cf31e5
tqbz android_id e2c6d93cf172fe09f0ea3e272fbe6ed4
fgtr brand 375455f754fe43fee89f35ea5c039888
qpzm com.example.myapp2.alarmReceiver 8bf0ceb8ada8e3bd3e05d619a2f8f6787d5606e103df22b34de897c4eb9af338d7185d5159bfb1b9492267c0052ee8c6
xcfd date 2bab5a4f61cfa666e0e8215032315835
prim file_name 62e5bf2d3a3ab6cd46984e47233a43d0
rtpb Files becdd71c4693a96a7c3eaa07db36c9db
trye https://totokupdate.ai/totok/totokfiles.php 3cbaf388cf3b7346cad6753d3b332f055b783878dcc2f1627c5a224a7b0c8c3f8ed3d4121a85b654c255acf300e64589
gtan https://totokupdate.ai/totok/totokinfo.php 3cbaf388cf3b7346cad6753d3b332f055b783878dcc2f1627c5a224a7b0c8c3f1ae45cdb495be99b258800bbeccd81b1
fris https://totokupdate.ai/totok/totokupdate.php 3cbaf388cf3b7346cad6753d3b332f055b783878dcc2f1627c5a224a7b0c8c3fcf7fb854802b8ceff0a46475e2f9105f
nhyt json cbe032700cf1efe4f89f6dcc93e91cc2
mnyo model 6488bef500eb504312e19ca26f0fcf3a
lied paths 34a3267574a5b567779b3fc8ac1b2f56
nliy POST cc29928635525decead251a8d9c700e1
trum single_path 716e2f2bc0df58623c22bc4c7d50ca9e
nzhd version fa88e4108fa03f2e60db80641762a239

为了方便静态分析,解密出的明文字符串后可以重命名密文参数名:
image.png
重命名后:
image.png

安卓环境检查

SDK版本

检测安卓的SDK是否大于29:
image.png
即安卓10:
image.png
版本检测目的基本是为了同一个目的,但不同版本有不同操作方式,没有实际功能上的区别。

请求读写权限

根据安卓不同的版本,通过不同的方式请求读写权限:

  • android.permission.READ_EXTERNAL_STORAGE
  • android.permission.WRITE_EXTERNAL_STORAGE

SDK>29时,需要人工点击确认,获取管理所有文件权限“android.settings.MANAGE_APP_ALL_FILES_ACCESS_PERMISSION”权限,:
image.png
并根据当时权限的不同,弹出不同的提示:
image.png
根据安卓版本的不同,恶意代码有不同的操作,非功能型区别,下文不再赘述。

checkFirstTime()

检测是否是首次运行这个伪装为ToTalk升级的APK。
如果是首次,会弹出信息“App Updated Successfully.”,欺骗用户已经成功升级:
企业微信截图_16566934274805.png
然后继续调用“openApp()”函数,启动真正的ToTok。如果启动失败,则弹出信息“Please install the app first!”要求先安装真正的ToTokAPP:
image.png
调用“startHuaweiAppGallery() ”打开华为应用商店的ToTok(“https://appgallery.huawei.com/app/C101085053”):
image.png
image.png

alarmReceiver()

检测是否有开机启动的Action“android.intent.action.BOOT_COMPLETED”。
如果有,执行:

  • scheduleAlarm
    • AlarmManager alarm = (AlarmManager)
    • alarm.setInexactRepeating(0, firstMillis, PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS, pIntent);
  • scheduleWork();
    • mWorkManager.enqueueUniquePeriodicWork(SYNC_DATA_WORK_NAME, ExistingPeriodicWorkPolicy.KEEP, periodicSyncDataWork);

似乎是为了设置定时任务。
如果没有:

  • checkPermissions(Context context)
    • context.startService(intent);
      • 使用startService()方法启用服务,调用者与服务之间没有关连, 即使调用者退出了,服务仍然运行。

目的应该是为了保持恶意代码持久性:
image.png
然后调用“alarmService()”函数。

alarmService()

检测SDK版本是否≥26,因安卓系统版本不同有不同的推送机制,非主要功能代码,不多赘述:
image.png

first():获取设备信息和权限

获取:

  • 安卓id
  • 当前时间拼接是否给与权限(“, Permission :- Given.”或“, Permission :- **Not** Given.”)
  • Build.MODEL
  • Build.BRAND
  • Build.VERSION.RELEASE

将这5个信息以JSON格式储存后传给“initFirst()”函数:
image.png

initFirst():发送设备信息和权限信息

构造POST请求,将“first()”获取到的有关手机设备信息的字符串,以https协议发送给URL“https://totokupdate.ai/totok/totok**info**.php”:
image.png
接着检测网络连接返回的数据,决定是停止运行还是调用函数“second()”:
image.png

second():获取指定类型文件信息

再次获取安卓id用于作为身份标识,然后获取设备指定类型文件的路径信息。将获取到的信息转为JSON格式储存后,进行URL编码处理:
image.png
获取文件类型函数代码:image.png
文件类型共4大类:

  • 视频
    • .avi
    • .mkv
    • .mp4
  • 文档
    • .csv
    • .doc
    • .docx
    • .pdf
    • .ppt
    • .pptx
    • .txt
    • .vcf
    • .xls
    • .xlsx
  • 图片
    • .jpeg
    • .jpg
    • .png
  • 音频
    • .mp3
    • .wav

接着将JSON数据传给initSecond()函数。

initSecond():发送指定类型设备信息

构造POST请求用于发送文件列表信息,将数据发送给URL“https://totokupdate.ai/totok/totok**files**.php”:
image.png
判断是否有返回数据。如果为空,调用“stopSelf()”结束自身:
image.png
如果有返回数据,则调用“initThird()”函数。

initThird():发送指定文件数据

该函数用于上传上一步中远程服务器返回的数据,即单个文件
获取安卓ID,文件路径,时间,和文件名后构造为JOSN数据,再调用“bytesToHex”将数据转为十六进制格式。
如果文件尺寸小于250MB,将数据发送给“https://totokupdate.ai/totok/totok**update**.php ”:
image.png

IoCs

URL

https://totokupdate.ai/totok/totok**info**.php
https://totokupdate.ai/totok/totok**files**.php
https://totokupdate.ai/totok/totok**update**.php

总结

综上所述,此APK文件为敏感文件窃取器,获取设备信息后,会尝试获取设备中的文档文件,视频音频文件,甚至联系人信息(vcf)。
基于对APK文件的分析,此样本从文件和流量中,均具有一定的可检测性。