作者:小荷才露尖尖角

漏洞简介

ES文件浏览器安卓版开放某端口,正常情况下该端口有访问IP地址的限制。然而结合本地某漏洞的利用,可突破限制,访问该端口获得远程命令执行机会,查看手机的文件列表、图片列表、视频列表、安装app列表,并可启动任意应用,远程下载外部存储和ES文件浏览器私有目录下的文件。

漏洞简要描述

测试版本为Google Play上的最新版4.0.2.9(Market)。

0x01 漏洞分析

监控到ES文件浏览器在tcp的59777端口监听,逆向发现使用了NanoHTTPd,并支持一系列命令的传入。见com.estrongs.android.e.a类

image

然而直接远程访问该端口,并发送json格式的命令始终无法得到结果。提示

image

后经过调试,发现该WebServer维护了一个IP地址访问的白名单,在接受HTTP访问请求时会将访问IP与白名单中的IP进行比对,若不在白名单,将不作任何响应。如图,见com.estrongs.android.e.j类中的判断(代码经过修饰,NanoHTTPWebServer为com.estrongs.android.e.h),若判断不通过,将返回空。

image

跟入这个e方法,可发现对白名单的比对

image

查看这个ipWhiteList的交叉引用,可发现NanoHTTPWebServer具有一个c方法(修饰为addList),可以添加whitelist。

image

因此,是否成功访问59777端口就归结为是否可能将攻击者的IP加入这个whitelist。

再次查看c方法的交叉引用,找到如下代码,位于com.estrongs.android.pop.app.AdbControllerActivity

image

上述代码表明,如果AdbControllerActivity暴露,则可以将攻击者的IP加入到whiteList。幸运的是,AdbControllerActivity正好是暴露没有任何保护的,恶意app可以启动该Activity设置攻击者可控的IP地址,允许其对59777端口的访问。

0x02 漏洞证明:组件暴露漏洞

com.estrongs.android.pop.app.AdbControllerActivity没有保护,本地恶意程序可以通过如下命令启动ES文件浏览器远程管理的FTP服务,同时设置允许访问59777端口Web服务的IP。

1
dz> run app.activity.start --component com.estrongs.android.pop com.estrongs.android.pop.app.AdbControllerActivity --extra string adbRemoteIp 192.168.8.171 --extra string adbControlMode start

此时,手机的通知栏将有所提示。

image

通过这个FTP服务,远程攻击者或无读取外部存储权限的本地恶意app将能够上传下载sdcard中的文件。

有趣的是,ES文件浏览器的这个FTP服务并未限制目录访问,可以跳转到手机中ES文件浏览器有权限访问的任意目录。

image

上传、下载ES文件浏览器私有目录下的文件

image

部分文件具有与账户相关的token等敏感信息,例如sapi_system.xml

image

甚至删除文件

image

这意味着,本地恶意app可以通过ES文件浏览器暴露组件和FTP服务的配置不当突破android沙箱的限制,使远程或本地攻击者上传、下载甚至删除ES文件浏览器私有目录下的文件,并访问ES文件浏览器有权限访问的任何目录和文件。但由于手机通知栏的提示,用户会有所发觉(当然本地恶意app的攻击可以在用户发觉之前自动化完成),所以这个漏洞暂且不表。

0x03 漏洞证明:远程命令执行漏洞

下面我们回到之前谈论的59777端口,在启动AdbControllerActivity并设置攻击者的可控IP后。用户若发觉FTP服务开启,可以在通知栏中选择停止FTP服务。但无论用户是否选择停止FTP服务,攻击者IP仍在whitelist中,仍可以访问59777端口开放的web服务,通过发送{“command”:”[命令名]”}的json远程执行命令。

1.命令名为getDeviceInfo,获取手机信息

image

2.命令名为listFiles,访问http://ip:59777/path,则列出/path目录下的所有文件,可以访问ES文件浏览器有权限访问的任意目录

image

3.命令名为listPics,获取手机中存储的所有照片信息

image

同理,命令名为listVideos和listAudios,可获取手机中存储的所有视频和音频信息

4.命令名为listApps,获取手机中的安装应用信息

image

同理通过listAppsSystem、listAppsPhone、listAppsSdcard、listAppsAll可以获得分类的安装应用信息。

5.命令为appLaunch,发送{“command”:”appLaunch”,”packageName”:包名},可以启动手机上具有main activity的任意应用。如图,我们成功的在手机上启动了新浪微博。该特性可以结合本地恶意app,启动一个虚假的activity在手机上钓鱼。

image

6.命令名为appPull,发送{“command”:”appLaunch”,”packageName”:包名},可以远程获取app安装包。

试验中还发现,如果ES文件浏览器开启远程管理PC、网盘、安卓电视、蓝牙等功能,则这个59777端口可以作为中转桥梁,远程攻击者一旦猜测成功正确的url,可以代为进行远程管理,限于时间,未作进一步的测试。

修复建议

  1. 设置AdbControllerActivity为不导出状态,或者添加权限;

  2. ftp服务限定使用的目录为sdcard;

  3. 进一步检查59777端口开放web服务的IP访问白名单的设定路径不能为攻击者可控。