type
status
date
slug
summary
tags
category
icon
password
一、漏洞APP分析1. AndroidManifest.xml分析2. MainActivity3. TestActivity4.FlagReceiver二、攻击APP构造1. 构造demo验证可行性2. 攻击方案三、总结四、参考
一、漏洞APP分析
1. AndroidManifest.xml分析
AndroidManifest.xml
中声明了三个组件,两个Activity
和一个Receiver
,其中只有MainActivity
是导出的2. MainActivity
MainActivity
先是获取intent的数据,然后经过校验后使用webView.loadUrl(data.toString())
进行加载,而且设置了setJavaScriptEnabled(true)
这意味着启用了JavaScript
。除此之外设置了setWebViewClient
,并且通过shouldOverrideUrlLoading
拦截请求,在内部校验intent
并且可以进行跳转。因此这里存在攻击点,即可以绕过getAuthority
校验加载恶意html,在html内部使用JavaScript
构造重定向请求,然后跳转到指定的非导出Activity3. TestActivity
TestActivity
则通过getStringExtra("url")
直接拿到一个url并且使用webview
进行加载,没有进行任何校验,因此存在攻击点,即通过TestActivity
进行恶意网页的加载。4.FlagReceiver
FlagReceiver
则通过cookieManager
设置了一个cookie
值,该值就是flag
,而该cookie值存储在/data/data/com.bytectf.easydroid/app_webview/Cookies
中,该组件在环境启动时收到flag从而设置flag,因此攻击目标即为获取该Cookies
文件二、攻击APP构造
1. 构造demo验证可行性
首先编写一个APP用于验证攻击的可行性,设置三个
Activity
,验证能否绕过url校验
并且顺利实现跳转。绕过方案:
http://toutiao.com@xxx.xxx.xxx.xxx/evil.html
则可以实现对getAuthority().contains("toutiao.com")
的绕过,并且实际访问的是xxx.xxx.xxx.xxx/evil.html
, 而访问的evil.html
中可以通过location.href
使app获取到Intent Url
:"intent:pwneasydroid#Intent;launchFlags=0x3;package=com.bytectf.pwneasydroid;component=com.bytectf.pwneasydroid/.Third;end"
当
shouldOverrideUrlLoading
拦截到该url
时通过startActivity(Intent.parseUri(url,1))
跳转到目标Activity。编写
evil.html
使APP跳转到Third
logcat
输出验证了绕过方案的可行性并且能够成功跳转至Third
在实际攻击中可以设置
S.url
,控制被攻击APP 跳转到百度,因为在被攻击的TestActivity
中获取了额外的属性url
并且进行加载2. 攻击方案
总的来说,首先肯定是绕过校验并且使被攻击APP跳转至TestActivity然后加载不经过任何校验的恶意网页,然后想办法窃取被攻击APP私有目录下的Cookies文件
方案一:符号链接延迟跨源攻击,操纵WebView去访问一个攻击APP自己公开出来的网页,然后这个网页执行的内容其实就是延时去读取自身。在延时读取自身的时间窗口内,这个文件悄悄被进行了替换,替换成了软链接,指向受害APP的一个私有文件,最终读取窃取其内容。限制:该漏洞在Android7.0及以上修复,而题目环境为Android8.1,因此无法使用该方法进行攻击,但是在搭建的Android6.0环境上成功实施了攻击
方法 作用/风险 默认策略 setAllowFileAccess(true) 设置是否允许 WebView 使用 File 协议访问文件系统 在API29及以下默认设置为 true setAllowFileAccessFromFileURLs(true) 方法用于设置是否允许在文件方案URL的上下文中的跨源请求访问其他文件URL的内容。该方法在API级别30中已被弃用,并且不安全。相反,应使用androidx.webkit.WebViewAssetLoader
以安全方式加载文件内容 在 Android 4.1 后默认禁止 在API30中已被弃用 setAllowUniversalAccessFromFileURLs(true) 用于设置是否允许在文件方案URL的上下文中的跨源请求访问任何其他来源的内容。如果应用程序需要访问文件系统,最好避免使用file://
URL。而是使用通过HTTPS加载文件的替代方法,例如androidx.webkit.WebViewAssetLoader
在 Android 4.1 后默认禁止 setJavaScriptEnabled(true) 设置是否允许 WebView 使用 JavaScript 默认不允许注意:在Android10及以下默认setAllowFileAccess(true)
,而该漏洞不需要setAllowFileAccessFromFileURLs
和setAllowUniversalAccessFromFileURLs
设置为True即可进行攻击,即绕过了同源检测,但是依旧需要setJavaScriptEnabled
设置为TrueMainActivity源码
evil.html源码
Android6.0攻击结果
Android8.1攻击结果
注意,此处即使开启setAllowFileAccessFromFileURLs
和setAllowUniversalAccessFromFileURLs
也攻击失败,虽然被攻击APP能够渲染Cookies,但是无法向服务器传回数据,因此判定攻击失败
方案二:污染Cookies窃取数据在这个方案里,需要先通过访问恶意HTML将恶意js插入Cookies中,然后控制被攻击APP访问Cookies本身,触发恶意代码造成数据泄露具体的攻击思路: 首先攻击者APP跳转到被攻击APP的MainActivity
,使其访问evil.html
在该恶意html中设置cookies并且延时40s执行intent跳转,设置cookies即设置恶意代码,等待后续被读取渲染时运行恶意代码,即等待cookies写入到被攻击APP目录下的Cookies
文件中后跳转到TestActivity
,然后TestActivity
加载url:file:///data/data/com.bytectf.pwneasydroid/files/symlink.html
,这个url将会读取pwneasydroid
数据目录下的一个symlin.html,该html创建于跳转到被攻击MainActivity
至跳转到TestActivity
这段时间,使其指向/data/data/com.bytectf.easydroid/app_webview/Cookies
,然后TestActivity
中webview
加载时触发到插入到Cookies里的恶意代码,使其读取Cookies本身并且发送到远程,即可成功实现Cookies泄露,flag就在Cookies中这里需要格外注意权限问题:不仅需要给/data/data/com.bytectf.pwneasydroid/files
及目录下的文件777权限,而且还要给/data/data/com.bytectf.pwneasydroid
这个目录的777权限,否则将会访问失败MainActivity
evil.html
Android8.1攻击效果
三、总结
虽然题目本身考点不难,但是操作起来很费劲,尤其需要关注Android环境
然后就是目录的权限问题,如果不设置
/data/data/packagename
为777,那被攻击APP就无法读取到目录下的恶意html,导致攻击失败四、参考
- 作者:LLeaves
- 链接:https://lleavesg.top//article/ByteCTF-2021-EasyDroid
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章