ES文件浏览器组件暴露导致远程命令执行
作者:小荷才露尖尖角
漏洞简介
ES文件浏览器安卓版开放某端口,正常情况下该端口有访问IP地址的限制。然而结合本地某漏洞的利用,可突破限制,访问该端口获得远程命令执行机会,查看手机的文件列表、图片列表、视频列表、安装app列表,并可启动任意应用,远程下载外部存储和ES文件浏览器私有目录下的文件。
漏洞简要描述
测试版本为Google Play上的最新版4.0.2.9(Market)。
0x01 漏洞分析
监控到ES文件浏览器在tcp的59777端口监听,逆向发现使用了NanoHTTPd,并支持一系列命令的传入。见com.estrongs.android.e.a类
然而直接远程访问该端口,并发送json格式的命令始终无法得到结果。提示
后经过调试,发现该WebServer维护了一个IP地址访问的白名单,在接受HTTP访问请求时会将访问IP与白名单中的IP进行比对,若不在白名单,将不作任何响应。如图,见com.estrongs.android.e.j类中的判断(代码经过修饰,NanoHTTPWebServer为com.estrongs.android.e.h),若判断不通过,将返回空。
跟入这个e方法,可发现对白名单的比对
。
查看这个ipWhiteList的交叉引用,可发现NanoHTTPWebServer具有一个c方法(修饰为addList),可以添加whitelist。
因此,是否成功访问59777端口就归结为是否可能将攻击者的IP加入这个whitelist。
再次查看c方法的交叉引用,找到如下代码,位于com.estrongs.android.pop.app.AdbControllerActivity
上述代码表明,如果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 |
此时,手机的通知栏将有所提示。
通过这个FTP服务,远程攻击者或无读取外部存储权限的本地恶意app将能够上传下载sdcard中的文件。
有趣的是,ES文件浏览器的这个FTP服务并未限制目录访问,可以跳转到手机中ES文件浏览器有权限访问的任意目录。
上传、下载ES文件浏览器私有目录下的文件
部分文件具有与账户相关的token等敏感信息,例如sapi_system.xml
甚至删除文件
这意味着,本地恶意app可以通过ES文件浏览器暴露组件和FTP服务的配置不当突破android沙箱的限制,使远程或本地攻击者上传、下载甚至删除ES文件浏览器私有目录下的文件,并访问ES文件浏览器有权限访问的任何目录和文件。但由于手机通知栏的提示,用户会有所发觉(当然本地恶意app的攻击可以在用户发觉之前自动化完成),所以这个漏洞暂且不表。
0x03 漏洞证明:远程命令执行漏洞
下面我们回到之前谈论的59777端口,在启动AdbControllerActivity并设置攻击者的可控IP后。用户若发觉FTP服务开启,可以在通知栏中选择停止FTP服务。但无论用户是否选择停止FTP服务,攻击者IP仍在whitelist中,仍可以访问59777端口开放的web服务,通过发送{“command”:”[命令名]”}的json远程执行命令。
1.命令名为getDeviceInfo,获取手机信息
2.命令名为listFiles,访问http://ip:59777/path,则列出/path目录下的所有文件,可以访问ES文件浏览器有权限访问的任意目录
3.命令名为listPics,获取手机中存储的所有照片信息
同理,命令名为listVideos和listAudios,可获取手机中存储的所有视频和音频信息
4.命令名为listApps,获取手机中的安装应用信息
同理通过listAppsSystem、listAppsPhone、listAppsSdcard、listAppsAll可以获得分类的安装应用信息。
5.命令为appLaunch,发送{“command”:”appLaunch”,”packageName”:包名},可以启动手机上具有main activity的任意应用。如图,我们成功的在手机上启动了新浪微博。该特性可以结合本地恶意app,启动一个虚假的activity在手机上钓鱼。
6.命令名为appPull,发送{“command”:”appLaunch”,”packageName”:包名},可以远程获取app安装包。
试验中还发现,如果ES文件浏览器开启远程管理PC、网盘、安卓电视、蓝牙等功能,则这个59777端口可以作为中转桥梁,远程攻击者一旦猜测成功正确的url,可以代为进行远程管理,限于时间,未作进一步的测试。
修复建议
设置AdbControllerActivity为不导出状态,或者添加权限;
ftp服务限定使用的目录为sdcard;
进一步检查59777端口开放web服务的IP访问白名单的设定路径不能为攻击者可控。