|
本文由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">{"e;D"e;:"e;HTML,XLS,XLSX,XML,TXT,DOC,DOCX,PPT,PDF,ISO,ZIP,RAR,RTF"e;,"e;M"e;:
28
29
"e;MP3,MP2,WMA,AMR,WAV,OGG,MMF,AC3"e;,"e;I"e;:"e;JPEG,JPG,GIF,BMP,PNG,TIFF"e;,"e;V"e;:"e;3GP,MP4,MPEG,
30
31
WMA,MOV,FLV,MKV,MPEG4,AVI,DivX"e;}</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/
|
|