导读:
何为“间谍”?
《说文解字》解释道:
“谍,军中反间也。
”使用反间计当然需要三寸不烂之舌,这是“谍”的本义。
“间”怎么会跟“谍”联系起来了呢?
“间”本来写作“闲”,清代文字训诂学家段玉裁为《说文解字》所作的注释说:
“开门月入,门有缝而月光可入。
”因此“间”的本义就是门缝,泛指缝隙,有缝隙就可以使用反间计了,故称“间谍”。
这期我们分析的间谍软件较上期分析间谍软件RB Music有较大不同,恶意程序并不是根据控制端发送的不同指令执行不同窃取用户隐私数据的操作,而是从服务端获取代码进行动态加载,实现无声地模拟与广告网站的自动交互包括模拟点击和输入高级服务订阅的授权代码,窃取受害者的短信、账号、设备信息并上传至服务器。
攻击者将恶意代码集成到应用的广告插件中,所以这四个样本的恶意行为基本相同,都具有获取服务端代码进行动态加载的远控行为和窃取用户短信、账号、设备信息的窃取隐私行为。
但是他们的服务器地址有所不同。
应用名
|
包名
|
MD5
|
版本
|
Collate Face Scanner
|
com.hello.sweetangle.horoscope
|
6a0d00632d4aa7dac7668b4ee5db708e
|
1.1.2
|
Ignite Clean
|
com.Ignite.amino.clean
|
2dfc268c4b791a5af0e4e19837a64144
|
7.3
|
Antivirus Security
|
com.anti.mysecurity
|
e6ed729151b98cb2aad0e4ef1beabf47
|
1.1.2
|
Beach Camera
|
com.tr.rushphoto
|
a1b5372f3abb8d3bbaa5858f44726523
|
4.2
|
表1样本信息
二、程序运行框架
1. 流程图
恶意软件只攻击目标国家。
大多数受感染的应用程序都包含一个移动国家代码列表(MCC),但它会把美国或加拿大排除在外。
受害者必须使用其中一个国家的SIM卡才会继续执行动态加载DEX文件操作。
程序开始从服务器获取动态加载DEX文件的代码,加载的类名、函数名以及参数。
申请开启通知权限,启动监听短信通知服务,如果程序接收到短信通知会发送一个广播。
接着加载DEX文件,在DEX文件中注册接收短信信息的广播,上传用户账户以及设备信息,并解析从服务端返回的数据包括需要加载的订阅高级服务的网页url、授权代码、匹配短信信息的正则表达式、以及模拟点击的javascript代码等。
然后加载网页和javascript代码模拟点击。
等待带有确认代码的SMS消息,并使用正则表达式提取它。
最后将获取的设备和短信等信息上传至服务器。
图1 流程图
2. 远程框架
从服务器获取动态加载DEX文件的代码,加载的类名、函数名以及参数。
参数包含DEX文件中所用到的服务器地址。
第二阶段从传入的参数服务器地址中获取需要加载的订阅高级服务的网页url、授权代码、匹配短信信息的正则表达式、以及模拟点击的javascript代码等信息。
图2 远控框架
三、 病毒技术原理分析
1. 监听技术
注册PermissionActivity用于管理通知权限。
注册NoteService用于监听短信通知。
图3 注册组件
图4 检测通知权限
图5 请求通知权限
如果应用已开启通知权限,监听短信通知,获取短信内容并发送发action_text广播 。
图6 监听短信通知
权限请求界面结束时获取各种设备信息并上传至服务器。
图7 获取设备信息
将获取的设备信息上传至服务器:
http://171.***.25.250.18000/backend/api/collect
图8 上传设备信息
2. 加载DEX
病毒在应用的 Application 初始化时加入了自己的代码
,
并将自己代码集成在mopub广告插件中。
图9 程序开始调用
获取SIM卡的移动国家码和移动网络码,排除美国和加拿大两个国家。
启动线程。
图10 获取SIM卡信息
连接服务器。
服务器url的K值是根据包名、SIM卡信息、随机数而产生的。
所以每次返回值都不一样。
http://3.***.143.26/api/shAKNLHIsX?k=Y29tLmhlbGxvLnN3ZWV0YW5nbGUuaG9yb3Njb3BlIzQ2MDAx0LJ
图11 连接服务器
获取服务器返回值,返回的数据已经过DES加密。
图12 获取服务器返回数据
将获取的返回值保存到配置文件中并进行DES解密。
密钥为whijgyxx硬编码在代码中。
图13 解密服务器返回数据
解析并以换行符分割数据得到以下数据。
(1)
https://tb‐eu‐jet.***‐eu‐central‐1.a***cs.com/s8‐5‐release:用于获取将要动态加载的dex文件代码。
(2) http://18.***.46.15/
:
作为参数传入DEX文件的函数调用。
(3)tdelXB :
作为参数传入DEX文件的函数调用。
(4)com.plane.internal.Entrance :
作为加载DEX文件的类名。
(5)initialize :
作为加载DEX文件的函数调用。
图14 解析数据
连接服务器获取DEX文件代码。
将获取的代码写入最开始创建的文件中。
https://tb‐eu‐jet.***‐eu‐central‐1.al****s.com/s8‐5‐release
图15 从服务器下载DEX文件
循环读取文件,每次读取128字节写入另一文件中,形成真正将要加载的DEX文件。
图16 创建需要加载的DEX文件
加载DEX文件。
并调用com.plane.internal.Entrance类中的函数initialize。
传入参数http://18.***.46.15/ 和tdelXB。
图17 加载DEX文件
任何“注册”都是没有意义的,因为任何输入都会将用户带入“登录”状态。
由此可以看出应用添加注册登录功能仅仅为了获取受害者登录凭证。
3. 订阅服务
将传入的参数配置为服务器url和TAG_SMS。
图18 配置参数
注册广播,用于接收短信通知所发送的广播从而获取短信内容。
图19 注册广播
获取设备信息上传至服务器。
http://cp.mo***tato.com/backend/api/v1/dsp/cpi/postback/
图20 获取设备信息并上传
获取用户设备信息以及用户账号信息并上传至服务器:
http://18.***.46.15/api/ldjb/。
不同应用上传的服务器地址不一定一样,http://18.***.46.15/api/ldjb/这个地址获取不到返回数据,所以我们从服务器地址为http://52.***.93.217/api/ldjb/这个地址中获取了返回数据。
图21 获取用户账户信息并上传
获取用户账号信息。
图22 获取用户账户信息
接收服务器返回数据。
图23 接收服务器返回数据
解密返回数据,密钥是将本机IMSI、唯一序列号、包名经过一定处理得到的。
图24 解密服务器返回数据
解析并保存从服务器获取的数据。
图25 解析服务器返回数据
初始化WebView,实现javascript与Java的交互。
图26 初始化WebView
加载网页。
加载的网页地址是上面已解析的服务器返回值,根据不同的地区设置不同的 Ajax异步请求字段。
图27 加载网页