/作者:Kali_MG1937

CSDN博客号:ALDYS4

QQ:3496925334

未经许可,禁止转载
/

漏洞简介

CVE-2019-6447是Android端上的一个知名软件:ES文件浏览器的未授权访问漏洞

漏洞造成原因主要是软件在启动时会创建一个端口为59777的HTTP服务器

并且软件未对HTTP服务器的访问做任何权限检查

从而导致攻击者可利用此漏洞控制受害者的手机

虽然这个洞是在一月份爆出的,那个时候鄙人正在准备考试,所以没有关注。

所以拖到4月底才发现有这个漏洞,因为目前主攻安卓编程,所以对这个漏洞很感兴趣

所以决定现在来分析它

漏洞分析

0x01>POC解析

漏洞的POC已经被发布在github上了,先上去看看poc



poc作者对漏洞的描述就是:软件会在59777端口上开放一个HTTP服务器,可以通过构造特殊payload去请求服务器来完成攻击

接下来看看poc

可以看到poc是利用Python写的,poc作者先引入json和一些网络库后就开始编写利用代码了



execute_cmd函数内传入了三个参数:

addr//ip地址

cmd//控制受害者手机所执行的命令

package//手机软件包名


通过阅读代码可知

poc是通过构造特殊的json数据来命令ES文件浏览器对受害者手机进行一系列操作

0x02>分析漏洞产生原因_服务器建立过程分析

要分析漏洞,首先要下载一个带有漏洞的ES文件浏览器

通过poc作者提供的信息,漏洞在4.1.9.7及以下版本存在



那么我下载一个4.1.9.6版本进行分析

因为没有动态分析工具,所以我选择直接反编译的方法对漏洞进行溯源

(表示分析完漏洞后肝少了一个)

分析工具:Eclipse,Jd-gui,apktool,d2j-dex2jar

不用我多说了吧,先利用dex2jar将软件dex转为jar

利用jd-gui转化为java代码

我先在代码中搜索漏洞利用命令的其中一条:"getDeviceInfo"



发现es/qf.class中包含着漏洞服务器的具体代码



大致浏览一遍

发现com/estrongs/fs/impl/adb/c.class也与漏洞有所相关联

这里先不对这个class文件进行分析,在下文会进行分析

接下来先利用apktool反编译apk的Androidmianfest.xml文件

poc作者说明了:

软件会在启动时在59777端口上建立服务器

那么就要先看看软件入口了

先看xml文件



软件入口在:

com.estrongs.android.pop.app.openscreenad.NewSplashActivity

但通过分析发现

这个类只是对app的ui进行初始化

那么再仔细想想:

再软件启动时就执行的类除了清单文件中指定的入口还有什么?

对了!application属性中指定的name参数



com.estrongs.android.pop.FexApplication

先查看FexApplication类中最先执行的onCreate()方法



可以看到,oncreate方法内先后调用了q,s,r三个方法



经过排查,q()方法是对权限进行检查,r()方法是对ui的初始化

重要的是s()方法



上图中s方法先对sdk进行了一个判断和处理,这不重要,重要的是s方法最终会调用u方法



u方法中程序向下走,最终执行B方法



B方法内的代码让我眼前一亮

它向com.estrong.fs.f类中的a方法传入了两个参数

"adb",com.estrongs.fs.impl.adb.c

其中第二个参数就是我在上文中未分析的c.java文件

通过传入的参数和包名可知

这个c.class文件主要用于处理一些adb相关操作,大致浏览该类,发现还和qf.class文件有着联系

代码已经执行到关键处

那么接下来一些无关紧要的执行全部略过,我们只看程序最终执行到的关键代码

在传入参数后,代码最终执行到com.estrongs.fs.impl.adb.c

可以大致浏览一下c类,可知此类与adb处理和执行有关



程序最终会将参数传入此类的一个a方法



可以看到在a方法中,程序最终会执行到红线处

启动com.estrongs.android.pop.app.AdbControllerActivity

并且带上了两个参数

"AdbControllerActivity",嗯,很有趣的类名,对吧



该类中paramBundle成员变量获取了在c类中执行的adb命令中的向该类传递的adbRemoteIp参数

接着程序对paramBundle进行判断,若值不为空则继续执行

注意!程序在判断通过后执行了qf类的b方法

立刻跟进qf.类中的b方法



该方法会向qf类中的a方法中传入一个为false的布尔值

那么看看qf类的a方法



a方法中paramBoolean参数被传入了false

注意:其中有一句判断

if((f!=null)&&(f.c()))

通过分析,f是一个建立套接字的线程

f.c()方法判断的是这个线程是否死亡

如果线程死亡,paramBoolean会被赋予true值


如果程序正常运行paramBoolean会被赋予false

程序继续向下执行

接下来的执行的代码会让你兴奋



59777,这个数字是不是很熟悉

没错,就是漏洞服务器打开的端口

那么我们来看看这个参数最终传入到哪里



可知,qf类的paramString参数被传入"/sdcard"

并且qf类的e成员被赋值paramString参数

这没什么问题,对吧

关键是接下来

paramBoolean被赋予false

a被赋值paramBoolean

可是我并没有在qf类中看到有任何名为a的成员

我立刻查看了qf类的开头



qf继承于qi

也就是说qi内所有公共的变量qf都能操作


立刻查看qi类



可以看到qi类内的a修饰了protected

看来我的判断没错

qf类中的false值最终到达qi类

那么这里的protected boolean a=false;有什么用呢

看代码,我在图中做了注释



之前在qf类内传入的int值59777最终被传入到qi类内

最终在qi.a方法中被传入一个线程内



a方法中创建了一个套接字并开始监听59777端口

那么在59777端口上的服务器就建立完成了

可以看到在以上分析过程中程序没有进行任何访问权限的限制

0x03>分析漏洞产生原因_分析对服务器接收请求的处理

分析过poc后我们可以知道漏洞服务器通过处理特定json来返回相应的手机信息

服务器对请求的处理主要在qf.java文件中



代码先判断请求方式

接着对请求进行了一些简单判断,无错后直接进入执行

可以看到这段代码就是一个死循环

并且不断返回paramString1

在对请求进行处理时 程序对命令分析,并根据命令向a方法中传入对应的值,并且将传回的值赋值给变量paramString1并返回,显示在服务器上

那么来看看a方法

我这里直接做了分析和注释

直接看图吧



最终a方法返回了一个json,显示在服务器上

可以看到,在对服务器的请求进行处理时也没有做出任何访问限制

这就是造成漏洞的直接原因

0x04>利用Java构造POC

原理很简单,利用HttpUrlConnection向服务器发送请求就好

这里直接贴代码和截图

	public static void CVE_2019_6447(String command) throws MalformedURLException, IOException, JSONException{
URL url=new URL("http://127.0.0.1:59777");
HttpURLConnection http=(HttpURLConnection) url.openConnection();
http.setRequestMethod("POST");
http.setDoOutput(true);
http.setReadTimeout(1000);
http.addRequestProperty("Content-Type","application/json");
JSONObject json=new JSONObject();
json.put("command",command);
DataOutputStream out=new DataOutputStream(http.getOutputStream());
out.writeBytes(json.toString());
System.out.println(json.toString());
System.out.println(http.getResponseCode());
BufferedReader br=new BufferedReader(new InputStreamReader(http.getInputStream()));
String line="";
while((line=br.readLine())!=null){
System.out.println(line+"\n");
}
}



到这里,分析和利用就正式完成了,虽然技术含量不高,但还是学到了很多东西,还请大佬们多多指点

【逆向实战】ES文件浏览器未授权访问漏洞(CVE-2019-6447)具体分析及利用的更多相关文章

  1. jboss 未授权访问漏洞复现

    jboss 未授权访问漏洞复现 一.漏洞描述 未授权访问管理控制台,通过该漏洞,可以后台管理服务,可以通过脚本命令执行系统命令,如反弹shell,wget写webshell文件. 二.漏洞环境搭建及复 ...

  2. jenkins未授权访问漏洞

    jenkins未授权访问漏洞 一.漏洞描述 未授权访问管理控制台,可以通过脚本命令行执行系统命令.通过该漏洞,可以后台管理服务,通过脚本命令行功能执行系统命令,如反弹shell,wget写webshe ...

  3. Redis未授权访问漏洞复现

    Redis未授权访问漏洞复现 一.漏洞描述 Redis默认情况下,会绑定在0.0.0.0:6379(在redis3.2之后,redis增加了protected-mode,在这个模式下,非绑定IP或者没 ...

  4. PHP-FPM Fastcgi 未授权访问漏洞

    漏洞原理 Fastcgi Fastcgi是一个通信协议,和HTTP协议一样,都是进行数据交换的一个通道.HTTP协议是浏览器和服务器中间件进行数据交换的协议,浏览器将HTTP头和HTTP体用某个规则组 ...

  5. [转帖]Redis未授权访问漏洞复现

    Redis未授权访问漏洞复现 https://www.cnblogs.com/yuzly/p/11663822.html config set dirconfig set dbfile xxxx 一. ...

  6. 浅谈Redis未授权访问漏洞

    Redis未授权访问漏洞 Redis是一种key-value键值对的非关系型数据库 默认情况下绑定在127.0.0.1:6379,在没有进行采用相关的策略,如添加防火墙规则避免其他非信任来源ip访问等 ...

  7. 真实本人亲测Elasticsearch未授权访问漏洞——利用及修复【踩坑指南到脱坑!】

    如要转载请注明出处谢谢: https://www.cnblogs.com/vitalemontea/p/16105490.html 1.前言 某天"发现"了个漏洞,咳咳,原本以为这 ...

  8. mongodb未授权访问漏洞

    catalogue . mongodb安装 . 未授权访问漏洞 . 漏洞修复及加固 . 自动化检测点 1. mongodb安装 apt-get install mongodb 0x1: 创建数据库目录 ...

  9. [ Redis ] Redis 未授权访问漏洞被利用,服务器登陆不上

    一.缘由: 突然有一天某台服务器远程登陆不上,试了好几个人的账号都行,顿时慌了,感觉服务器被黑.在终于找到一个还在登陆状态的同事后,经查看/ect/passwd 和/etc/passwd-异常,文件中 ...

随机推荐

  1. 音视频开发:为什么推荐使用Jetpack CameraX?

    我们的生活已经越来越离不开相机,从自拍到直播,扫码再到VR等等.相机的优劣自然就成为了厂商竞相追逐的赛场.对于app开发者来说,如何快速驱动相机,提供优秀的拍摄体验,优化相机的使用功耗,是一直以来追求 ...

  2. 启动QQ时出现无法访问个人文件夹怎么决解

    找了一圈的百度,真正有用的. 在设置中进行修改. https://zhidao.baidu.com/question/2073820786837168348.html 打开设置的其中页面 你的IT管理 ...

  3. Spring Cloud Alibaba(10)---Sentinel控制台搭建+整合SpringCloudAlibaba

    上一篇博客讲了Sentinel一些概念性的东西 Spring Cloud Alibaba(9)---Sentinel概述 这篇博客主要讲 Sentinel控制台搭建,和 整合SpringCloudAl ...

  4. web scraper

    参考:https://sspai.com/u/skychx/updates https://www.jianshu.com/p/76cad8e963b5 :nth-of-type(-n+100) 元素 ...

  5. 记一次 .NET 某HIS系统后端服务 内存泄漏分析

    一:背景 1. 讲故事 前天那位 his 老哥又来找我了,上次因为CPU爆高的问题我给解决了,看样子对我挺信任的,这次另一个程序又遇到内存泄漏,希望我帮忙诊断下. 其实这位老哥技术还是很不错的,他既然 ...

  6. CRM的未来发展前景有哪些?

    随着时代的发展,近年来越来越多的国内中小企业开始采用CRM客户关系管理系统,CRM从此不再是大企业的专利,也开始让中小企业得以不断成长.国内CRM行业的发展越来越快, 它的前景是什么?今天小Z就来给大 ...

  7. import 更新变量

    其他的模块的变量一经引用,是定值,只能再次import才能更新他的值

  8. [OS] 操作系统课程(五)

    系统启动 启动过程 CPU加电稳定后从0XFFFF0读取第一条指令 BIOS 固化到计算机主板上的程序 包括系统设置.自检程序和系统自启动程序 系统加电后读BIOS 加电自检POST,内存.显卡等关键 ...

  9. 【转载】深入理解OpenStack-手动制作qcow2镜像

    深入理解OpenStack-手动制作qcow2镜像 2018-01-18 手动制作镜像 1 官方虽提供qcow2系统镜像,但对于有需求的企业来说,还是定制镜像比较靠谱,下面就手动定制一个镜像 给虚拟机 ...

  10. Linux系统(控制节点)部署环境

    环境部署 重点说明:安装ansible时去控制Windows机器,由于需要在Linux系统上安装pywinrm插件,而使用yum安装锝ansible是无法调用pywinrm插件,所以整体使用pip工具 ...