温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

ES文件浏览器CVE-2019-6447的漏洞分析是怎样的

发布时间:2021-12-22 23:42:07 来源:亿速云 阅读:263 作者:柒染 栏目:安全技术

ES文件浏览器CVE-2019-6447的漏洞分析是怎样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

漏洞名称

ES File Explorer Open Port Vulnerability - CVE-2019-6447

漏洞简介

ES文件浏览器在启动时创建了一个HTTP服务器,在本地打开了59777端口。攻击者通过构造指定的payload可以获取用户手机文件,安装apk等操作。

影响范围

4.1.9.7.4 and below(部分版本可能不支持,也可能和应用市场有关)

漏洞分析

从fs0c131y所给出的信息来说CVE-2019-6447影响的ES应用版本为4.1.9.7.4以下,但是在某些版本的应用该漏洞却无法利用,例如从华为和google play商店下载的ES就无法顺利复现该漏洞,向59777端口发送payload一直会回复500 ERROR报错,下面将详细对该漏洞进行分析。

4.1.9.4版本应用分析

以下是选择了4.1.9.4版本的ES文件浏览器进行了分析,该版本ES能够成功利用该漏洞。

ES文件浏览器CVE-2019-6447的漏洞分析是怎样的

首先对APK解包后发现存在三个DEX文件。

ES文件浏览器CVE-2019-6447的漏洞分析是怎样的

先简单看了下lib中的库发现应用没有加壳,用grep筛查以下59777确定相关代码可能在classes2.dex中。

把classses2.dex反编译后,全局搜索command发现存在漏洞的类在com/estrongs/android/f/a之中,而触发漏洞的函数为com/estrongs/android/f/a.a。

ES文件浏览器CVE-2019-6447的漏洞分析是怎样的

简单看下来a.class,b.class,c.class可能都和该漏洞的服务相关,其中a.class继承了c.class。

ES文件浏览器CVE-2019-6447的漏洞分析是怎样的

ES文件浏览器CVE-2019-6447的漏洞分析是怎样的

下面来看下整个漏洞的触发过程,由于混淆代码不管是丢进jeb中还是smali阅读起来都比较费力,为此我们可以先动态的将程序跑一边后记录trace,分析android trace文件来查看函数调用栈(利用TraceReader读取)。

记录trace的方法如下:

ES文件浏览器CVE-2019-6447的漏洞分析是怎样的

ES文件浏览器CVE-2019-6447的漏洞分析是怎样的

在DDMS上成功打开Trace之后,我们就要去构造payload去触发该漏洞,漏洞具体利用payload见github(https://github.com/fs0c131y/ESFileExplorerOpenPortVuln)。

curl --header "Content-Type: application/json" --request POST --data "{\"command\":getDeviceInfo}" http://192.168.13 7.10:59777 -vvv

把tracer文件丢到TraceReader查看调用栈,可以发现程序进入com/estrongs/android/f/c$a.run()V来处理了我们的请求,注意这里的类的实例化对象其实是a.class而不是c.class。:

ES文件浏览器CVE-2019-6447的漏洞分析是怎样的

首先接受socket然后读到buffer中提取数据

ES文件浏览器CVE-2019-6447的漏洞分析是怎样的

然后判断是不是post数据,如果是post请求则对content-type进行解析,当所有的前置解析完成后最后程序会来到label_189处

ES文件浏览器CVE-2019-6447的漏洞分析是怎样的

label_189中,执行了v2_7 = this.a.a_parse_url_other_data(v9, v10, v11, v6, v7);来进一步解析并执行相应的command。

ES文件浏览器CVE-2019-6447的漏洞分析是怎样的

这里有一个问题,如果JEB直接双击来跟踪函数会跳转到自己类中的函数,而实际真正调用的是a.class(com/com/estrongs/android/f/a)中的函数a_parse_url_other_data(这里我对混淆函数名重命名了实际上原本的函数名是a)。

下图是JEB错误跳转到函数的位置,实际上我们应该分析的是a.class中的a_parse_url_other_data:

ES文件浏览器CVE-2019-6447的漏洞分析是怎样的

继续追踪下去来到就来到了我们一开始漏洞触发的地方(com/estrongs/android/f/a.a):

ES文件浏览器CVE-2019-6447的漏洞分析是怎样的

关于这个地方的分析其实有很多文章以及做过了,这里就不再过多提及了。

解析对应的command调用对应的功能函数后返回json:

ES文件浏览器CVE-2019-6447的漏洞分析是怎样的

最后进入com/estrongs/android/f/c$a.a(Ljava/lang/String;Ljava/lang/String;Ljava/util/Properties;Ljava/io/InputStream;)V将response写回。

ES文件浏览器CVE-2019-6447的漏洞分析是怎样的

该函数将输出的结果写入到OutputStream中然后将其返回。
ES文件浏览器CVE-2019-6447的漏洞分析是怎样的

该ES版本整个漏洞的触发流程大致就如上所示。

这里有一个需要注意的地方,如果是不存在漏洞的ES应用v2_7是为null的也就会进入this.a("500 Internal Server Error", "SERVER INTERNAL ERROR: Serve() returned a null response.");中,这也是很多应用市场上的ES应用都会到报500错误的原因。

4.1.6.6.1版本应用分析

以下将对4.1.6.6.1版本ES文件管理器进行分析,该版本的ES文件管理器没有顺利触发漏洞。

ES文件浏览器CVE-2019-6447的漏洞分析是怎样的

直接curl个看看,500报错了。

ES文件浏览器CVE-2019-6447的漏洞分析是怎样的

拆包静态看一遍,代码基本上还是在f包中,但是多了很多其他的类,a.class依然是ESHttpServer实现的地方。

ES文件浏览器CVE-2019-6447的漏洞分析是怎样的

ES文件浏览器CVE-2019-6447的漏洞分析是怎样的

再curl一个包抓取一下调用栈。

curl --header "Content-Type: application/json" --request POST --data "{\"command\":getDeviceInfo}" http://192.168.0. 122:59777 -vvv

ES文件浏览器CVE-2019-6447的漏洞分析是怎样的

错略比对发现在这个版本的ES中多了一些函数,可能是做了某一些的校验逻辑。

静态分析代码,发现前面的逻辑和之前app差不多,但是在执行完com.estrongs.android.f.h.a(Ljava/lang/String;Ljava/util/Properties;)V后又调用了bJ。

ES文件浏览器CVE-2019-6447的漏洞分析是怎样的

ES文件浏览器CVE-2019-6447的漏洞分析是怎样的

跟入bJ,bJ验证了了url并且ap.a()方法检测当前环境是否处于WIFI环境下。

ES文件浏览器CVE-2019-6447的漏洞分析是怎样的

ES文件浏览器CVE-2019-6447的漏洞分析是怎样的

继续往下跟踪,我们来到问题点!bp.q() || !f.e(v8)) && !f.a(v8, v2_5)这里返回了true导致flag_object为null值所以服务器返回了500。

ES文件浏览器CVE-2019-6447的漏洞分析是怎样的

bq.q()为true或者f.e以及f.a为true才能进入逻辑

跟踪进入bq.q(),要满足bp.p()和cw.e()都为true。

而FexApplication.a().getSystemService("uimode").getCurrentModeType() == 4成立的时候bp.p()才能为true,根据官方文档4的uimode为UI_MODE_TYPE_TELEVISION。

ES文件浏览器CVE-2019-6447的漏洞分析是怎样的

ES文件浏览器CVE-2019-6447的漏洞分析是怎样的

在cw.e中需要满足一定的界面长宽需求

boolean v0_1 = Math.sqrt(Math.pow((((double)v0.heightPixels)) * 1 / (((double)v0.densityDpi)), 2) + Math.pow((((double)v0.widthPixels)) * 1 / (((double)v0.densityDpi)), 2)) >= 20 ? true : false;

ES文件浏览器CVE-2019-6447的漏洞分析是怎样的

而另外的f.e(v8),f.a(v8, v2_5)函数则负责校验了我们的ip。

ES文件浏览器CVE-2019-6447的漏洞分析是怎样的

此外存在另外一种情况是当我们的ip为127.0.0.1时候flag_object能不为null,但首先你要满足v4=null这个先觉条件。

ES文件浏览器CVE-2019-6447的漏洞分析是怎样的

查看v4 = as.bJ(v9),之前已经说过bJ函数负责校验了url,我们再重新回到bJ发现return null好像不太可能,v9不管uri如何构造都会以'/'开始。

ES文件浏览器CVE-2019-6447的漏洞分析是怎样的

也就是说在应用市场上的ES版本不管是走if((!bp.q() || !f.e(v8)) && !f.a(v8, v2_5))还是走if(v4 != null && as.I(v4) != 0)似乎都不能出发到flag_object = v8_1.a(v9, v10, v11, v6, v7)的逻辑,这样该漏洞就没法触发,但说不定还有其他的绕过方法,希望大家能够多多补充。

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI