[漏洞分析] CVE-2022-41076 TabShell 漏洞分析

admin 2023年3月6日22:49:32评论57 views字数 2945阅读9分49秒阅读模式

简介

TabShell(CVE-2022-41076)是12月份补丁的一个PowerShell的漏洞。这个漏洞允许攻击者在受限的PowerShell环境中逃逸出受限的环境执行任意命令。在Exchange Server的场景中,可以用于在域内提权到SYSTEM权限。

漏洞软件:PowerShell

前提条件:已知低权限账户的用户名和密码

漏洞效果:逃逸出受限环境。在Exchange Server中可以提权到SYSTEM权限。

影响范围: 没打2022年12月份补丁之前的所有Windows版本。

复现环境

笔者这里搭建了ExchangeServer2016CU12进行漏洞复现。操作系统为Windows Server 2016。

背景知识

Language Mode

Language Mode定义了PowerShell Session所能做的能力,例如能执行哪些cmdlet。Language Mode有四种。

  • FullLanguage 可以执行所有的命令,默认的PowerShell Session是这个模式

  • RestrictedLanguage 为Windows RT设计,现在被弃用了。

  • ConstrainedLanguage 只允许基本的操作(循环、分支条件、字符串等),只允许有限类型的对象。

  • NoLanguage 不允许运行脚本或者定义变量,只能执行基本的命令和cmdlet。

Exchange Server提供的PowerShell接口是NoLanguage模式,所以只能执行相当有限的cmdlet。

Tab Expansion

Tab Expansion是用来自动补全的的功能。例如按下Tab键之后,PowerShell自动补全。Tab Expansion功能是用内部的TabExpansionTabExpansion2函数实现的。

根因分析

Exchange Server上提供的远程powershell功能是一个受限的powershell,只有有限的powershell命令,一些危险的命令都没有提供,例如Start-Process

在创建PowerShell Session的时候(通过New-PSSession),可以指定WSManStackVersion参数。当值小于3的时候,Commands里会添加TabExpansion函数。

[漏洞分析] CVE-2022-41076 TabShell 漏洞分析

TabExpansionTabExpansion脚本可以参考gist地址:https://gist.github.com/rskvp93/4158ac74eb9b583e7577f9cf4d72e155。下面摘出了关键的部分。TabExpansion有两个参数linelastword

[漏洞分析] CVE-2022-41076 TabShell 漏洞分析

该函数会首先根据lastword进行switch判断,当lastword满足如下的正则表达式时,即以-开头,后面跟若干字母数字,这一步很好满足,例如传入-test。然后该函数就会把参数line根据|;=字符分割,并把分割的数组的最后一个赋值给$_command变量。

[漏洞分析] CVE-2022-41076 TabShell 漏洞分析

后面会调用Get-Command命令,把$_command作为Name的参数,这里的Name就可以攻击者控制。下面需要的攻击就是如何通过Get-CommandName参数达到执行任意PowerShell命令。

[漏洞分析] CVE-2022-41076 TabShell 漏洞分析

Get-Command的用法很多,其中的一个用法是Name参数后跟的是[Module path][cmdlet]的形式,这样可以查看某个模块里的某个cmdlet。读者可能看到这里就发现一个问题Get-Command会不会自动载入这个模块。Get-Command的逻辑极其复杂,笔者这里不去分析其完整的实现,有兴趣的读者可以去dnspy或github查看源码。笔者这里只分析最关键的。Get-Command有一个地方会调用AutoloadSpecifiedModule函数,这个函数会调用Import-Module命令,其中的Name参数用户是可以指定的,那么这里就是导入目标模块的地方。笔者在IIS的Powershell进程中AutoloadSpecifiedModule下断点,通过栈回溯可以看到Get-Command的实现最后调用到了这里。

[漏洞分析] CVE-2022-41076 TabShell 漏洞分析

[漏洞分析] CVE-2022-41076 TabShell 漏洞分析

下面笔者在普通的powershell中去调用Get-Command命令复现,来观察能不能通过Get-Command导入一个Module。这里的PSMBin.dll是笔者自己写的一个Powershell的模块,其中只有一个命令Get-Greeting。通过下面的命令可以导入这个模块,并使用Get-Greeting命令。

[漏洞分析] CVE-2022-41076 TabShell 漏洞分析

读者看到这里可能会问为什么不直接使用Get-Command命令,而用TabExpansion去间接调用Get-Command呢。笔者在Exchange Server的远程powershell中测试,可以看到直接使用Get-Command是无法导入目标模块的。

[漏洞分析] CVE-2022-41076 TabShell 漏洞分析

调试发现在TryModuleAutoLoading函数中会判断commandOrigin是不是来自于内部,只有来自内部才会调用AutoloadSpeficiedModule导入目标模块。而TabExpansion是内部调用,满足这个情况。

[漏洞分析] CVE-2022-41076 TabShell 漏洞分析

复现效果

笔者对Exchange Server进行攻击,执行mspaint.exe,效果如下。

[漏洞分析] CVE-2022-41076 TabShell 漏洞分析

[漏洞分析] CVE-2022-41076 TabShell 漏洞分析

patch分析

微软直接将PowerShell里的TabExpansion删掉,参考github地址:https://github.com/PowerShell/PowerShell/commit/eb612c0be8e99c5d804e14c94f8973bbbc7d19c3。

参考引用

  • https://blog.viettelcybersecurity.com/tabshell-owassrf/

  • https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_language_modes?view=powershell-7.3

  • https://gist.github.com/testanull/518871a2e2057caa2bc9c6ae6634103e

  • https://gist.github.com/rskvp93/4158ac74eb9b583e7577f9cf4d72e155

  • https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/get-command?view=powershell-7.3

  • https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_tab_expansion?view=powershell-7.3

本公众号发布、转载的文章所涉及的技术、思路、工具仅供学习交流,任何人不得将其用于非法用途及盈利等目的,否则后果自行承担!

原文始发于微信公众号(华为安全应急响应中心):[漏洞分析] CVE-2022-41076 TabShell 漏洞分析

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年3月6日22:49:32
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   [漏洞分析] CVE-2022-41076 TabShell 漏洞分析https://cn-sec.com/archives/1590476.html

发表评论

匿名网友 填写信息