0×01 前言

这部分漏洞分析属于之前MWR InfoSecurity的研究员报告中的第三部分,同样该报告仅有漏洞的简单描述,具体的PoC也未详细给出。

相关阅读:

Pwn2Own华为HiApp漏洞原理与利用分析(上)

Pwn2Own华为HiApp漏洞原理与利用分析(下)

因此本文的目的依旧是去探索漏洞挖掘的思路,以下不代表漏洞作者思路,欢迎更好的想法,欢迎讨论。

附上2017 pwn2own mobile视频:

0×02 漏洞原理分析

同样的挖掘思路,依旧是从AndroidManifest.xml入手,寻找暴露的组件,并进行代码静态分析。

切入com.zhangyue.iReader.online.ui.ActivityWebonCreate函数

分析onCreate函数代码来看(这里简化了大量代码,使得阅读更加容易),这里主要是调用webView的loadUrl函数,那么我们自然需要找到webView的实例类,再切入分析.

调用getWebView()函数返回CustomWebView类,因为这里仅仅是返回一个已初始化的类,因此,我们需要找到初始化该类的地方,即调用该类的构造函数。

完整的调用是this.mProgressWebView.getWebView(),自然我们需要切入mProgressWebView去寻找。我们直接查看引用,即可查找到webview初始化的地方

查看该函数的引用链(jeb直接用x快捷键查找即可)

小结一下:

这里的思路是通过loadUrl最终跟踪webView实例类CustomWebView的初始化过程,从而发现initJavaScript函数中可以被调用的接口。

但是,我觉得在审计中的思路这样可能比较死板,是不是在这里,直接审计CustomWebView类中的代码,寻找是否有javascript之类的关键词,再回溯去追寻,可能会更快发现。当然如果类代码过多的话,可能有点行不通,我自己在复现的时候,就是通过这种思路,直接找关键词再回溯。

接下来的思路自然是切入类JavascriptAction进行代码分析。

任意文件下载/文件目录遍历

快速浏览遍历@JavascriptInterface注解的方法,其中do_command(String cmd)自然引起注意。

由于此方法中可执行的命令是非常多的,因此要进行代码审计,这里我认为的一个方式应该是在熟悉Android的一些漏洞,如任意文件下载/替换、任意目录遍历等等的漏洞原理,接着在审计代码的时候,可以快速地切入到可能存在漏洞点的代码进行分析。

这里的调用链路是online()–>download()–>originalDownload()

可以看到,第二个参数传进来必须为True,才能避免fileName被覆盖,这也是为什么利用online函数而不利用download函数的原因.当然,我们在代码审计的时候肯定是先切入到download函数,分析完后再去寻找是否有符合利用条件的调用接口,很幸运地是,这里的online函数调用的第二个参数即为True.

任意文件删除

在JavaActionScript类中,还有Action为chapPackDownload存在漏洞。

分析上面的代码可知,实际上FileName我们可以控制,只要满足PATH.getBookNameCheckOpenFail(fileName)该函数路径存在即可。

根据以上代码,也即是存在路径/sdcard/HWiReader/books/.openfail/md5(fileName)即可实现删除任意文件。

不安全组件加载

寻找不安全的组件加载漏洞,挖掘思路自然是需要分析应用的目录结构,我们通过查看sdcard和data/沙盒中有关iReader应用的目录,查看是否有加载so/dex/jar等等需要动态加载的组件。

经过分析,我们找到/sdcard/HWiReader/plugins/DFService/classes.jar,接下来自然是全局搜索相关字符串关键词,定位到加载该组件的地方。最终定位为:com.zhangyue.iReader.tools.Util

接下来需要解决两个问题:

  1. 加载classes.jar,并且初始化的类怎么去构造?这个只需查看loadClass(arg6),传进来的参数是什么即可。很显然,这里为com.zhangyue.iReader.Plug.Service.DocFeature
  2. 怎么让iReader App去加载这个jar文件?这一步骤只需往前追溯调用链即可寻找到触发点。 最终的触发点为:下载txt文件。

0×03 漏洞利用

前面两部分的漏洞利用分析

第三阶段的漏洞利用exploit代码如下:

这里要注意两个点:

  1. setTimeout所延迟的时间必须是根据自己VPS连接速度来设定。
  2. 里面有两个FILE_ID,必须保证对应相等。

classes.jar构造Payload如下:

Build后,在Android Studio工程下,找到/app/build/intermediates/classes/debug目录,然后执行以下命令生成jar.

dx --dex --output=/Downloads/classes.jar com/zhangyue/iReader/Plug/Service/DocFeature.class

这里有小坑:

  1. 代码中由于classpath的原因,因此无法在代码中直接使用new Thread去创建线程。
  2. 执行dx命令时,必须是在完整的结构目录路径下。
  3. nc命令需要下载busyBox.

漏洞利用效果

备注: 完整的利用视频时间较长,因此剪辑掉等待的部分。

本系列最后一篇分析,撒花。

0×04 总结

  1. 诱导用户访问恶意网站(exploit.html)
  2. 使用DNS劫持或其他方式,绕过internal_webview的域名白名单限制,使其加载恶意页面(exploit2.html)
  3. 从而调用起iReader的ActivityWeb,使其加载恶意攻击页面(exploit3.html)
  4. exploit3.html首先删除可被控制的classes.jar(任意删除文件漏洞)
  5. 接着下载恶意的classes.jar(任意下载文件漏洞)
  6. 然后使用下载txt文件的方式触发App加载classes.jar(不安全组件加载)
  7. 最终触发payload执行,攻击者获取权限.

0×05 参考

Android插件化开发之DexClassLoader动态加载dex、jar小Demo