- APK(FA81EA64592330092893FA785D310E86)">APK(FA81EA64592330092893FA785D310E86)
- 概述
- APK分析
- 解密字符串&input=NjUxN2I4NTE3MTMyMWUyZGVhMTE3YTgwOWFkNTFmODc)">解密字符串&input=NjUxN2I4NTE3MTMyMWUyZGVhMTE3YTgwOWFkNTFmODc)
- 安卓环境检查
- checkFirstTime()
- alarmReceiver()
- alarmService()
- first():获取设备信息和权限
- initFirst():发送设备信息和权限信息
- second():获取指定类型文件信息
- initSecond():发送指定类型设备信息
- initThird():发送指定文件数据
- IoCs
- 总结
APK(FA81EA64592330092893FA785D310E86)
概述
文件是伪装为ToTok免费视频语音通讯软件的更新程序的APK,包名(Package Name)为“com.app_update.totok”。
有敏感权限请求,申请读写文件:
- android.permission.READ_EXTERNAL_STORAGE
- android.permission.WRITE_EXTERNAL_STORAGE
分析后发现为文件窃取器,申请权限后会尝试获取手机中指定类型的文件,并根据远程服务器的指令上传文件至远程服务器。
APK分析
解密字符串&input=NjUxN2I4NTE3MTMyMWUyZGVhMTE3YTgwOWFkNTFmODc)
大部分敏感字符串经过AES加密处理:
解密方式如下图:
解密的密文和明文如下表:
参数 | 明文 | 密文 |
---|---|---|
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 | 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 |
为了方便静态分析,解密出的明文字符串后可以重命名密文参数名:
重命名后:
安卓环境检查
SDK版本
检测安卓的SDK是否大于29:
即安卓10:
版本检测目的基本是为了同一个目的,但不同版本有不同操作方式,没有实际功能上的区别。
请求读写权限
根据安卓不同的版本,通过不同的方式请求读写权限:
- android.permission.READ_EXTERNAL_STORAGE
- android.permission.WRITE_EXTERNAL_STORAGE
SDK>29时,需要人工点击确认,获取管理所有文件权限“android.settings.MANAGE_APP_ALL_FILES_ACCESS_PERMISSION”权限,:
并根据当时权限的不同,弹出不同的提示:
根据安卓版本的不同,恶意代码有不同的操作,非功能型区别,下文不再赘述。
checkFirstTime()
检测是否是首次运行这个伪装为ToTalk升级的APK。
如果是首次,会弹出信息“App Updated Successfully.”,欺骗用户已经成功升级:
然后继续调用“openApp()”函数,启动真正的ToTok。如果启动失败,则弹出信息“Please install the app first!”要求先安装真正的ToTokAPP:
调用“startHuaweiAppGallery() ”打开华为应用商店的ToTok(“https://appgallery.huawei.com/app/C101085053”):
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()方法启用服务,调用者与服务之间没有关连, 即使调用者退出了,服务仍然运行。
- context.startService(intent);
目的应该是为了保持恶意代码持久性:
然后调用“alarmService()”函数。
alarmService()
检测SDK版本是否≥26,因安卓系统版本不同有不同的推送机制,非主要功能代码,不多赘述:
first():获取设备信息和权限
获取:
- 安卓id
- 当前时间拼接是否给与权限(“
, Permission :- Given.
”或“, Permission :- **Not** Given.
”) - Build.MODEL
- Build.BRAND
- Build.VERSION.RELEASE
将这5个信息以JSON格式储存后传给“initFirst()”函数:
initFirst():发送设备信息和权限信息
构造POST请求,将“first()”获取到的有关手机设备信息的字符串,以https协议发送给URL“https://totokupdate.ai/totok/totok**info**.php”:
接着检测网络连接返回的数据,决定是停止运行还是调用函数“second()”:
second():获取指定类型文件信息
再次获取安卓id用于作为身份标识,然后获取设备指定类型文件的路径信息。将获取到的信息转为JSON格式储存后,进行URL编码处理:
获取文件类型函数代码:
文件类型共4大类:
- 视频
- .avi
- .mkv
- .mp4
- 文档
- .csv
- .doc
- .docx
- .ppt
- .pptx
- .txt
- .vcf
- .xls
- .xlsx
- 图片
- .jpeg
- .jpg
- .png
- 音频
- .mp3
- .wav
initSecond():发送指定类型设备信息
构造POST请求用于发送文件列表信息,将数据发送给URL“https://totokupdate.ai/totok/totok**files**.php”:
判断是否有返回数据。如果为空,调用“stopSelf()”结束自身:
如果有返回数据,则调用“initThird()”函数。
initThird():发送指定文件数据
该函数用于上传上一步中远程服务器返回的数据,即单个文件。
获取安卓ID,文件路径,时间,和文件名后构造为JOSN数据,再调用“bytesToHex”将数据转为十六进制格式。
如果文件尺寸小于250MB,将数据发送给“https://totokupdate.ai/totok/totok**update**.php ”:
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文件的分析,此样本从文件和流量中,均具有一定的可检测性。