导语:前言 2017年11月3日,国外著名社交网站reddit的用户在谷歌官方商城中下载WhatsApp时,发现了一个山寨版的WhatsApp,从表面看盗版软件做的非常逼真,和正版软件非常相似。 于是他们经过反编译的方法对该盗版软件做了一个调查分析,发现盗

1509938247957415.jpg

前言

2017年11月3日,国外著名社交网站reddit的用户在谷歌官方商城中下载WhatsApp时,发现了一个山寨版的WhatsApp,从表面看盗版软件做的非常逼真,和正版软件非常相似。

于是他们经过反编译的方法对该盗版软件做了一个调查分析,发现盗版WhatsApp软件内置了广告插件,用户在下载盗版WhatsApp后会自动二次下载一个apk。截止2017年11月3日,盗版WhatsApp已被下载了一百多万次。

目前这一盗版软件已经从谷歌应用商店中删除,但相信里面应该还会有一些其他的残留攻击,建议用户下载时要小心谨慎。

作为Zimperium zLabs研究团队的一员,我会在本文,对广告攻击进行深入分析,为了方便研究,我已将该恶意程序命名为“Cold Jewel Lines”。

盗版WhatsApp的介绍

应用程序名称:Update WhatsApp Messenger

开发公司的名称:WhatsApp Inc.(仔细看会发现并不是WhatsAppInc.,盗版软件的开发者中间,被刻意加了一个空格。)

apk名称:whyuas.fullversion.update2017

下载商城链接:https://play.store.com/store/apps/details?id=whyuas.fullversion.update2017

SHA256:80fe0de24e58eb1c485d55c94d20ffd710fc4b8a05f2c20d9d0d42cabb683fad

盗版WhatsApp的攻击行为分析

安装后,恶意应用程序是无法在启动程序中看到的,因为开发人员设置了一个空白的app_name值和一个透明的ic_launcher.png图标,但是它可以通过单击启动器中应用程序列表末尾的“空白”图标从启动器中启动。在Android设置中,如果应用程序没有名称,则可以很容易地被发现并被卸载。

启动后,恶意程序会向用户推送各种广告。通过点击安装按钮,用户被重定向到下载商城并被诱导进行安装显示的应用程序。很明显,这个恶意应用程序的攻击重点是广告点击攻击从理论上来说。但是在执行过程中,用户也可以选择不同的“更新服务器”,盗版的WhatsApp更新应该就可以进行下载。

恶意代码只需从攻击目标中将index1.html加载到index11.html即可,剩余的步骤就是诱导用户进行操作了。该页面会显示一个下载服务器号码,一个下载按钮,显示文本为“下载更新”,另外用户期望下载的APK的文件名和大小也会被显示。点击下载按钮,用户将会被重定向到由bitly.com提供的短URL,此时,这个链接就是恶意的了。

建议你在看具体介绍之前,点此视频链接,先对攻击过程有个直观了解。

Cold Jewel Lines 

在对盗版WhatsApp的调查过程中,我发现其中一个广告显示了一个非常可疑的应用程序。正如你在视频中看到的那样,点击第一个“安装”按钮,用户加载一个名为Cold Jewel Lines的应用程序。

Cold Jewel Lines的恶意活动总结

在攻击阶段,恶意软件的主要目标是:

1.打开一个带有C&C服务器的通信通道,等待攻击命令;

2.执行Ads-autoclicking活动;

3.从攻击的目标设备中盗取敏感信息;

4.从收到的短信中解析并提取有用的信息;

5.可能执行其他恶意有效载荷(例如漏洞利用);

6.可能执行shell命令来提取额外的数据;

Cold Jewel Lines的介绍

应用程序名称:Cold Jewel Lines

开发公司名称:kbtjgbqv

APK名称:en.cold.jewel.th.lines

下载商城链接:https://play.google.com/store/apps/details?id=en.cold.jewel.th.lines

已存档的下载商城页面:https://web.archive.org/web/20171120165502/https://play.google.com/store/apps/details?id=en.cold.jewel.th.lines

SHA256:1daa6ff47d451107b843be4b31da6e5546c00a164dc5cfbf995bac24fef3bc6d

该应用程序已于2017年11月20日向谷歌进行了报告,并于2017年11月21日被删除。

Cold Jewel Lines的恶意行为分析

Cold Jewel Lines应用程序本身就是一个完整的游戏程序,不过只要应用程序被启动,恶意软件就会被执行。事实上,开发人员是从android.support.multidex.MultiDexApplication类中进行的恶意调用infiltration.outcry类。具体来说,被感染的方法是attachBaseContext。在outcry对象的静态初始化期间,会先加载库libseconhand.so,然后调用本地方法init,传递上下文和字符串“NzZmBCp6IFcbCSQPb2NWa2ViBWNKekMGew==”参数。“NzZmBCp6IFcbCSQPb2NWa2ViBWNKekMGew ==”字符串稍后将被恶意软件作为apiKey引用。

libsecondhand.so库可用于ARM,ARM64,x86,x86-64,MIPS和MIPS64,其唯一的目的就是删除恶意APK并动态加载嵌入的classes.dex。所有的库字符串和嵌入式恶意APK都使用block-XOR加密进行编码。

2.png

删除阶段完全由使用JNI函数的本地代码执行:

1. 生成一个随机UUID,并在文件夹中进行解码,进而删除恶意APK;

2. DexClassLoader对象是使用被删除APK的路径作为参数创建的;

3. ClassLoader.loadClass方法作为参数被infiltration.Main调用 ;

4. 在退出之前,nfiltration.Main类的静态方法init会被由本地代码检索和调用。

被删除的classes.dex中的所有字符串、变量、类都被会进行混淆处理,可以通过检索字符串(例如,使用jadx),在最后的附录部分找到的StringDecoder.py脚本。

JADX_encoded_classes-427x1024.png

init方法显然是恶意代码的主要入口,并在产生后台服务之前执行一些任务,从而开启执行恶意活动的进程:

1.init方法会接收到删除的APK和apiKey字符串的路径;

2. nfiltration.Main类基本上是Android系统android.support.multidex.MultiDex类的修改版本,一旦删除的classes.dex被完全加载,被删除的文件就会从文件系统中删除;

3.创建SharedPreferences文件F.xml并保存pkgName和apiKey;

4.在infiltration.rate类中,恶意服务被启动。

rate类将处理与C&C服务器(systemofram.com)的通信,然后执行所有接收到的攻击任务。此时接收到或完成的任务请求或响应的基本机制已经完成,每个任务都有它自己的ID。所有消息都有一个JSON结构,在发送之前都是加密的。

Downdown类是一个BroadcastReceiver,它将通过以下主要操作处理攻击请求:

1.android.provider.Telephony.SMS_RECEIVED:从SMS消息中对发件人和信息内容进行提取,并基于receiveSms和smsFilters命令解析和匹配刚刚提取的内容。

2.com.android.vending.INSTALL_REFERRER:设置另一个类对象的referrer字段,该字段稍后将在广告点击时使用。

3.android.net.conn.CONNECTIVITY_CHANGE:确定当前的连接状态并通知后台服务器开始攻击。

4.c:如果还处于等待期间,则攻击意图会被延迟。

C&C命令

以下列表简要说明了恶意软件所支持的命令:

1.init:这是客户端发送的初始化命令。当私钥被发送到服务器,服务器将响应并确认私钥同时向客户端请求信息。客户端在完成消息交换后,确认正确终止init任务的服务器。其它消息也会使用相同的确认系统。

2.OK:这是服务器发送的消息,通知客户端已经正确接收到一个数据块。

3.url:服务器会向客户端发送一个URL,它在一个实现getter的类的实例中保存它,但不幸的getter在任何地方都不会被用到,看起来该功能还正在研发阶段。

4.info:服务器如果请求关于设备的信息,客户端会发送以下信息:version, androidUuid, apiKey, appId, operator, WiFi, Battery, locale, manufacturer, model, androidVersion, screen, forGooglePlay, debug, userAgent, androidSdkVersion, androidBuildVersion, fingerprint, hardware, device, wifiNetworks (name, mac, level), currentWifiNetwork, mobileDataEnable, rootAvailable, simInfo, installedApps, simCount, androidId, imei, imsi, isPhone, referrer。利用这些信息,攻击者可以对攻击目标进行指纹识别并执行特定的操作。

5.interval:服务器会向让客户端发送该指令,让客户端进入休眠状态。

6.webClick:服务器会发送一个URL,一个URL正则表达式列表和一个由客户端加载的JavaScript代码列表。客户端将在启用JavaScript的隐藏WebView上打开URL,如果当前加载的URL与正则表达式匹配,则执行相应的JavaScript代码。在WebView中执行的JavaScript代码的一个例子便是“document.getElementById(‘actionLink’).click();“,很明显已经具备了自动点击功能。加载的URL的结果(也有可能发生错误消息)会被发送回服务器,自动点击操作会在白天多次被执行。

7.receiveSms:启用或禁用SMS过滤。如果设备没有SIM或可用连接来接收消息,则代码将尝试检测启用它的可能性。

8.smsFilters:服务器会发送由统计表达式组成的元组列表,以匹配收到的SMS消息,无论是数字还是服务名称,phoneExp都是用于匹配短信的发件人的正则表达式,而textExp是用于匹配短信正文的正则表达式,并从中提取有用的信息。一旦匹配和信息提取过程被执行完成,这些数据就会被立即发送回服务器。

9.silentMode:服务器会让客户端进入睡眠状态,预计是几个小时或几天。

10.server:通知目标用户有关新的C&C服务器的信息。

11.shell:服务器会发送由设备执行的命令列表。如果设备上有root用户,则可以直接使用su shell,否则会使用sh -c执行这些命令。命令完成后,结果(有可能是错误消息)会被发送回服务器。

12.download:服务器会指定客户端要下载的文件。尽管没有任何消息会包含下载操作项,但我可以让服务器使用info命令执行指纹识别,然后下载一个与该设备兼容的漏洞,并使用shell命令执行它。

虽然与服务器的通信是加密的,但是攻击者开发了一个简单的Xposed模块来hook删除阶段,从而记录所有通信并伪造设备的根状态。由于用挂钩的方法可以访问发送和接收的JSON字符串,所以攻击者可以随时根据需要,进一步篡改与C&C服务器的通信。

知道了这个原理,我就开始监测C&C服务器的通信,但通过连续两天的监测,只有一部分命令被检测到。最关键的是,我没有监测到silentMode,server,shell和download命令。下面的代码片段,是我监测到的通信记录,通过这些记录,相信你可以对恶意进程有个清晰的脉络:

1.敏感数据的泄露:IMEI,IMSI,androidUuid,运营商,WiFi网络,MAC,制造商,根状态,用户代理等个人身份信息全部发送至服务器。

2.SMS消息解析:服务器会向盗版WhatsApp发送一个正则表列表,以对接收到的SMS进行信息提取。其中,主要针对来自Billinfo,1232111,o2.Team,o2.Info,Bouygues,Orange和其他通过正则表达式匹配的消息。

3.自动点击功能:服务器会发送一个URL,头文件,用户代理以及由客户端执行的JavaScript代码。

Frida框架和Xposed框架

在调查过程中,Frida和Xposed框架被盗版WhatsApp用来快速收集与C&C服务器交换的消息。调查开始时,Frida的任务是负责记录所有的通信,不过在调查的后期,Frida的这个功能就被删除了。这可能是由于Frida在执行任务时,和真正的WhatsApp使用了相同的框架名称(其实两个的Java签名是不同的),这个问题会在重新加载过程中显现出来题。目前这个功能已被移植到Xposed模块里了,这样利用该模块就可以安全地实现恶意功能了,特别是在libsecondhand.so库进行下载并对动态加载的代码进行启动时。

由于Xposed模块是基于RedNaga团队开发的DexHook代码,得益于Xposed存储库上的第188号问题,目前我已经解决了hook ClassLoader.loadClass方法时弹出的无限递归问题。

虽然代码很少,只是一个PoC,但是这个想法却足够好,足以保证在采用动态类加载的Android进程上进行提前检测,检测的进程包括以下四个:

1.java.lang.ClassLoader.loadClass(name);

2.dalvik.system.BaseDexClassLoader(dexPath, optimizedDirectory, librarySearchPath, parent);

3.dalvik.system.DexFile.openDexFile(sourceName, outputName, flags);

4.android.support.multidex.MultiDex.install();

除了支持动态类加载外,代码还会在用于与C&C服务器通信的方法中安装一些hook,特别是针对以下3个方法:

1. infiltration.AdfdI9FaQBbbW3Hgur24m6n0.vvgQM33AjqPJZjX(String s, PrivateKey k):将该方法的结果hook,攻击者就可以记录从服务器接收到的所有数据。

2. infiltration.AdfdI9FaQBbbW3Hgur24m6n0.vvgQM33AjqPJZjX(String s, PublicKey k):hook这个方法的第一个参数会让攻击者记录所有发送给服务器的数据。

3. infiltration.AdfdI9FaQBbbW3Hgur24m6n0.jNWow5lMF5gpMRlovjqsFg():将该方法的结果hook,攻击者就以强制进行根检测,当每次代码询问根状态时的强制结果为false时,恶意程序就会查看服务器是否发送了命令来下载并执行设备上的漏洞。

在下面的附录中,你可以找到Frida和Xposed解决方案的详细链接。

调查的最新进展

目前,我已收集了有关C&C服务器的其它一些信息。例如,域alfa-aaa.site和ex2cloud.xyz似乎是相同的网络,因为systemofram.com/b/test/URL指向一个带有嵌入JS代码的HTML,而该JS代码则引用其他域。

附录

这是样本分析过程中发现的一些有用资源列表,你可以在该代码库中找到它们:

1.Decoded.apk:这是通过libsecondhand删除的APK文件,删除的APK的SHA256是7300a2f8f93dd5a612c3d62ca49a742c1b761dbd454141407018173aca7ac1e1。

2.DecodeDropped.c:这是经过解码的已被删除的APK的C代码。解码libsecondhand.so库中的加密字符串的代码基本是相同,但每个编码字符串都会以1字节开始,指示其长度。

3.StringDecoder.py:这是一个简单的脚本,它使用已删除的APK的反编译代码来进行输入,并提取所有编码的字符串。

4.HookC2.py:这是Frida脚本,它被用于记录客户端和服务器之间的通信,不过不知什么原因,它不能在我的设备上运行。

5.Hooker:这是Xposed模块,它被用于记录客户端和服务器之间的通信,由于它功能完善,从而保证了在攻击的早期,对攻击环境进行检测。

IOC

盗版WhatsApp:80fe0de24e58eb1c485d55c94d20ffd710fc4b8a05f2c20d9d0d42cabb683fad

Jewels Miner:1daa6ff47d451107b843be4b31da6e5546c00a164dc5cfbf995bac24fef3bc6d

盗版WhatsApp:http://bit.ly/2xDkNhy

Jewels Miner 的C&C网址:https://systemofram.com

源链接

Hacking more

...