牛牛逼逼叉叉
菜单

手机应用入侵日记(上)

2014年02月11日,分类《网络安全》,作者:
博客捐助

本文由91ri小编v2djia原创翻译,小编月巴又鸟修改。

———————————————————————————————————————-

[0x00] – 简介

 

[0x01] – 应用监测

[0x01a] – 不安全的数据存储

[0x01b] – 反编译程序安装包

 

[0x02] – 中间人攻击

[0x02a] – 工具准备

[0x02b] – 中间人攻击

 

[0x03] – 服务端攻击

[0x03a] – 扫描

[0x03b] – 获取权限

[0x03c] – 绕过杀毒软件

[0x03d] – 拿下系统!!

[0x03e] – 没有结束!!

 

[0x04] – 致谢

 

—————————————————————————————————————————

 

“在过去的几年中,我们见证了手机从简单到复杂的飞速发展。随着这些设备变得越来越智能、手机网络速度越来越快。人们不仅仅用手机来发信息,打电话。而是更多的用来发邮件、上网冲浪、玩游戏、查询航班信息以及网银业务。

公司也开始为客户开发专属的应用以提供各种服务。如今,我们通过手机应用能将文件同步到云端,登录社交网站,甚至和青蛙聊天(注:指游戏“会说话的青蛙”)。

因为手机存储、处理、传输的数据往往是重要或者隐私的东西,所以就要确保手机有良好的安全控制机制。“

——SANS渗透测试博客

 

 

为了研究安卓应用(安卓是由google和开放手机联盟开发的基于linux平台的操作系统。其上应用由Java编写、安卓操作系统软件栈由一系列运行在Dalvik虚拟机(DVK)上的Java应用组成)。我们对其进行了渗透测试。

本文对我们的测试技巧进行了总结。安卓上的应用主要功能与著名的Apple icloud类似:将照片、视频、联系人同步备份到个人云上。

让我们开始吧! ( ̄▽ ̄)

 

[0x01] –应用监测

 

“通常情况下,一个客户端软件安装在手机上,作为前端与用户进行交互。软件包可以通过应用商店,或者软件开发者的网站上下载,这些应用就有可能包含很多的漏洞。

这里要指出,如果要对客户端设备进行测试,我们就需要把设备进行root或者越狱。这是因为系统一般情况下不会允许你访问所有的本机上的文件。另外,软件包软件包还有可能会通过逆向工程进行反编译、修改,你肯定不希望自己安装的软件有种种限制吧。”

——SANS渗透测试博客

我们第一个任务就是监测应用软件的运行状况。这样做是为了了解该应用是如何工作的,然后试着从本机上存储的文件找到敏感信息,甚至挖掘出更多的信息,所以软件包会被反编译为源码格式。

 

[0x01a] – 不安全的数据存储

为了开展我们的第一个任务,我们需要建立一个安卓渗透测试平台(安装Android SDK,Android Emulator还有Burpsuite),接着使用ADB(Android Debug Bridge ,http://developer.android.com/tools/help/adb.html)来连接我们的手机。ADB是是一个非常强大的命令行工具,能够让我们与安卓设备或者模拟器进行命令交互。

首先,我们登录到手机终端上,然后使用ADB在调试模式下用”adb devices”命令连接到手机上。

 

01 ---------------------------------------------------------------
02
03 [zeq3ul@12:03:51]-[~]> adb devices
04
05 * daemon not running. starting it now *
06
07 * daemon started successfully *
08
09 List of devices attached
10
11 3563772CF3BC00FH device
12
13 ---------------------------------------------------------------

 

 

 

然后我们使用”adb shell”命令来连接手机后访问内部目录。

 

在我们做进一步的深入之前,我们需要确认目标应用安装包的真实名字,它通常以“.apk”文件的形式存放在”/data/app/”中。

我们发现我们的目标应用”com.silentm.msec-v12″的真实名字是”/data/app/com.silentm.msec-v12.apk”。

最后,“/data/data”中该应用的文件夹最有可能就是该应用的敏感信息存放位置了。不出所料,我们在”/data/data/com.silentm.msec-v12/shared_prefs”中找到了如下的重要信息。

 

01 ---------------------------------------------------------------
02
03 [zeq3ul@12:05:24]-[~]> adb shell
04
05 # cd /data/data/com.silentm.msec-v12/shared_prefs
06
07 # cat PREFS.xml
08
09 <?xml versions='1.0' encoding='utf-8' standalone='yes'?>
10
11 <map>
12
13 <string name="Last_added">9</string>
14
15 <boolean name"configured" value="true"/>
16
17 <string name="package">Trial</string>
18
19 <string name="version">1.2</string>
20
21 <string name="username">zeq3ul</string>
22
23 <string name="password">NXBsdXM0PTEw</string>
24
25 <string name="number">089383933283</string>
26
27 <string name="supportedextension">{&quote;D&quote;:&quote;HTML,XLS,XLSX,XML,TXT,DOC,DOCX,PPT,PDF,ISO,ZIP,RAR,RTF&quote;,&quote;M&quote;:
28
29 &quote;MP3,MP2,WMA,AMR,WAV,OGG,MMF,AC3&quote;,&quote;I&quote;:&quote;JPEG,JPG,GIF,BMP,PNG,TIFF&quote;,&quote;V&quote;:&quote;3GP,MP4,MPEG,
30
31 WMA,MOV,FLV,MKV,MPEG4,AVI,DivX&quote;}</string>
32
33 ...
34
35 </map>
36
37 ---------------------------------------------------------------

 

 

 

我们在文件PREFS.xml中找到了我们的用户名和密码,但是密码是经过加密的,不过仔细看下就会发现不过是经过base64加密而已,我们能够轻易的进行解密。”NXBsdXM0PTEw” > “5plus4=10″

        提示:该程序是一个反面例子,它将敏感信息存放在本地,并且存储密码的方式是用base64
进行编码(编码!=加密),这都是不对的!!!用到的代码如下:

01 ---------------------------------------------------------------
02         public void saveCredentials(String userName,String password)
03         {
04         SharedPreferences PREFS;
05         PREFS=getSharedPreferences(MYPREFS,Activity.MODE_PRIVATE);
06         SharedPreferences.Editor editor = PREFS.edit();
07         String mypassword = password;
08         String base64password = new String(Base64.encodeToString(mypassword.getBytes(),4));
09         editor.putString("Username", userName);
10         editor.putString("Password", base64password);
11         editor.commit();
12         }
13 ---------------------------------------------------------------

 

 

[0x01b] – 反编译程序安装包

 

接下来,为了深入理解该应用程序的工作机制,我们需要得到程序的源码。对于安卓应用,可以通过反编译安卓程序包(.apk)来实现。

安卓程序包(“.apk” 文件)实质上是ZIP文件.包括AndroidManifest.xml, classes.dex, resources.arsc和其他部分。你可以重命名程序包,然后可以使用好压等以ZIP文件打开来查看其内容。

我们通过”adb pull”命令来从手机中解压安卓应用:

 

1 ---------------------------------------------------------------
2
3 [zeq3ul@12:08:37]-[~]> adb pull /data/app/com.silentm.msec-v12.apk
4
5 1872 KB/s (5489772 bytes in 2.862s)
6
7 ---------------------------------------------------------------

 

 

下一步,我们将使用dex2jar(http://code.google.com/p/dex2jar/)来反编译我们得到的“.apk”文件。dex2jar能够将”.dex”转换成可读的Java语言的”.class”文件。

 

注意! “class.dex”文件存放在我们上面提到的每个”.apk”文件中。可以通过将”.apk“文件转换成”.zip”文件来证实这一点,这样你也能了解”.apk”文件的结构。

 

01 ---------------------------------------------------------------
02
03 [zeq3ul@12:09:11]-[~]> bash dex2jar.sh com.silentm.msec-v12.apk
04
05 dex2jar version: translator-0.0.9.8
06
07 dex2jar com.silentm.msec-v12.apk -> com.silentm.msec-v12_dex2jar.jar
08
09 Done.
10
11 ---------------------------------------------------------------

 

 

最后我们使用JD-GUI (http://java.decompiler.free.fr/?q=jdgui)用来阅读反编译后得到的源码(由dex2jar生成的”.jar”文件)。本例中就是”com.silentm.msec-v12_dex2jar.jar”这个文件。

 

注意:JD-GUI是一个图形界面工具,我们可以用它查看“.class”文件。你可以通过JD-GUI来浏览重构的源码,这样能够直接查看源码中的方法,还有域喔。

 

最终,我们发现”Config.class”存储了硬编码的信息。代码如下:

 

01 Config.class
02
03 ---------------------------------------------------------------
04
05 package com.silentm.msec;
06
07 public class Config
08
09 {
10
11 public static final String CONTACT_URL = "http://203.60.240.180/en/Contact.aspx";
12
13 public static final String Check_Memory = "http://203.60.240.180/en/CheckMem.aspx";
14
15 public static final String BackupSMS = "http://203.60.240.180/en/backupsms.aspx";
16
17 public static final String Forgot_Password = "http://203.60.240.180/en/ForgotPassword.aspx";
18
19 public static final String FTP_URL = "203.60.240.183";
20
21 public static final String FTP_User = "msec1s";
22
23 public static final String FTP_Password = "S1lentM!@#$ec";
24
25 public static final String Profile = "http://203.60.240.180/en/Profile.aspx";
26
27 public static final int MAX_MEMORY = 500;
28
29 public static final int LOG_COUNT = 30;
30
31 ...
32
33 }
34
35 ---------------------------------------------------------------

 

 

在此说明一下!! 我们在源码中发现了 URL 和FTP的用户名以及密码(难以置信!!). 现在我们知道了该应用使用FTP协议向云端服务器传输图片,短信,联系人信息。因为它是硬编码的,而且FTP是不安全的协议,所以这种方式来传输数据是极其危险的。

 

01 ---------------------------------------------------------------
02
03 public void saveCredentials(String userName,String password)
04
05 {
06
07 SharedPreferences PREFS;
08
09 PREFS=getSharedPreferences(MYPREFS,Activity.MODE_PRIVATE);
10
11 SharedPreferences.Editor editor = PREFS.edit();
12
13 String mypassword = password;
14
15 String base64password = new String(Base64.encodeToString(mypassword.getBytes(),4));
16
17 editor.putString("Username", userName);
18
19 editor.putString("Password", base64password);
20
21 editor.commit();
22
23 }
24
25 ---------------------------------------------------------------

 

 

[0x02] – 中间人攻击

    

     “攻击的第二个层面就是攻击客户端与服务器通信的通道。尽管应用程序在采用越来越安全的传输方式来传送敏感信息,但实际中并不总是这样的。在测试中,我们可以使用HTTP代理来中断并且修改信息。

如果应用程序不适用HTTP协议来通信,那么可以使用透明的TCP以及UDP代理,如Mallory。通过使用代理,可以中断、分析以及修改客户端与服务器之间的通信。”

——­SANS渗透测试博客

 

因为我们已经知道我们的应用使用的是HTTP协议,下一步就是安装一个HTTP代理工具,比如ZapProxy或者burpsuit(本例中选择burpsuite)。

为了演示对该应用实施的中间人攻击,演示的关键是有一个web代理来中断请求。以此为出发点,我们的会使用与普通web渗透测试类似的技术。

我们用burpsuite(http://www.portswigger.net/burp/)来拦截每个HTTP请求以及响应。通过拦截HTTP请求,我们发现了发送给服务器的敏感信息(用户名和密码),因为它使用HTTP协议来传输明文信息(通信中的中间节点都能看到这些信息,该应用真实太烂了!!),如下所示。

 

Burpsuite: HTTP 请求

01 ---------------------------------------------------------------
02
03 POST http://203.60.240.180/en/GetInfo.aspx HTTP/1.1
04
05 Content-Length: 56
06
07 Content-Type: application/x-www-form-urlencoded
08
09 Host: 203.60.240.180
10
11 Connection: Keep-Alive
12
13 User-Agent: Apache-HttpClient/UNAVAILABLE (java 1.4)
14
15 imei=352489051163052&username=zeq3ul&password=5plus4=10
16
17 ---------------------------------------------------------------

 

 

另外,在HTTP响应中,我们同样找到了令人惊奇的信息:某人的email账号还有密码(之后我们发现是一个管理员的email)赫然显示在我们面前!

 

Burpsuite: HTTP 响应

 

01 ---------------------------------------------------------------
02
03 HTTP/1.1 200 OK
04
05 Cache-Control: private
06
07 Content-Type: text/html; charset=utf=8
08
09 Server: Microsoft-IIS/7.0
10
11 X-AspNet-Version: 2.0.50727
12
13 X-Powered-By: ASP.NET
14
15 Date: Fri, 07 June 2013 12:15:37 GMT
16
17 Content-Length: 2405
18
19 {"AppVersion":"1.2","FTP_USER":"msec1s","FTP_PASS":"S1lentM!@#$ec","FTP_SERVER":"203.60.240.183","MAX_MEMORY":"500","LOG_COUNT":"30",
20
21 "Smtp":"smtp.gmail.com","FromEmail":"mseccloud@gmail.com","FromEmailPwd":"M[Sec)0/",................
22
23 ---------------------------------------------------------------

 

总结一下,我们现在能够嗅探到以明文(既不是SSL也没有加密)传输的用户名还有密码,还有在HTTP响应中的管理员的邮箱账户”mseccloud@gmail.com”和密码”M[Sec)0/”。

 

到这里,我们的攻击已经完成了一半了。前面是收集信息的阶段,收集到目标越多的信息,能使你在后面的攻击越顺畅。无数的惨痛案例告诉我们,不收集信息就攻击目标的,到后来只能事倍功半,而且还会很容易让对方管理员知晓你的攻击行为。

 

 

原文链接:http://www.exploit-db.com/papers/26620/

 

 

本文由网络攻防研究室(http://www.91ri.org)原创翻译,转载请注明出处。



发表评论

电子邮件地址不会被公开。 必填项已用*标注

【上一篇】

那些年一起绕过的杀软

【下一篇】

手机应用入侵日记(下)