搜索
查看: 786|回复: 2

手机应用入侵日记

[复制链接]

1839

主题

2255

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
11913
发表于 2013-8-30 08:42:53 | 显示全部楼层 |阅读模式
本文由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/



过段时间可能会取消签到功能了
专业回帖 该用户已被删除
发表于 2013-8-30 21:27:44 | 显示全部楼层
好好 学习了 确实不错
您需要登录后才可以回帖 登录 | Join BUC

本版积分规则

Powered by Discuz!

© 2012-2015 Baiker Union of China.

快速回复 返回顶部 返回列表